久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

教你如何高效編程之頭文件書寫

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年10月21日   【字體:

       在網(wǎng)上查了很長時(shí)間關(guān)于頭文件的資料,但是發(fā)現(xiàn)很難找到適合我的。學(xué)單片機(jī)的朋友知道,很多程序經(jīng)常要調(diào)用相同的函數(shù),如果每寫一個(gè)程序都把這些函數(shù)重新寫一遍或者復(fù)制過來,那是很浪費(fèi)時(shí)間的,現(xiàn)在我通過學(xué)習(xí)總結(jié)以及別人的經(jīng)驗(yàn),跟大家分享,歡迎大家轉(zhuǎn)載學(xué)習(xí)。

        寫程序最好是結(jié)構(gòu)化編程,因?yàn)檫@樣的程序看起來就不那么長了,一目了然,可以很快就知道這個(gè)程序?qū)崿F(xiàn)什么功能,而且排錯(cuò)也非常簡單。把常用的函數(shù)聲明、自定義類型、外部變量的聲明等寫進(jìn)頭文件,與之配對的擴(kuò)展名為.c的文件就寫常用的函數(shù),main.c最好就寫一個(gè)主函數(shù)。之前學(xué)的51單片機(jī),現(xiàn)在玩430單片機(jī),就以430單片機(jī)為例,其他編程軟件道理與這個(gè)相同。在IAR下新建工程,包含了main.c、mydefine.cmydefine.hmydefine.c和mydefine.h是一對)三個(gè)文件(注:可包含多個(gè)配對的頭文件和C文件)。先把程序貼出來,再詳解其中緣由。

main.c內(nèi)容:
#include "mydefine.h"
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  SegInitial();      //數(shù)碼管控制引腳初始化
  
  long m = 0;
  while(1)
  {    
   disp(m);            //顯示m的值
    delay(10);
   m++;
   if(m == 1000000)
     m = 0;
  }
}
 
 
mydefine.h的內(nèi)容
 
#ifndef _MYDEFINE_H
#define _MYDEFINE_H

#include "msp430x14x.h"

typedef  unsigned int uint;
typedef unsigned char uchar;

void write_595(uchar dat);
void SegInitial(void);
void disp(long num);
void delays(uint x);
void delay(uint x);

#endif
 
mydefine.c的內(nèi)容
 
#include "mydefine.h"
#include "msp430x14x.h"

/*********************************
      流水燈74hc595各引腳定義

*********************************/
#define CLK0 P2OUT &= ~BIT4
#define CLK1 P2OUT |= BIT4
#define STB0 P2OUT &= ~BIT2
#define STB1 P2OUT |= BIT2
#define DS0  P2OUT &= ~BIT5
#define DS1  P2OUT |= BIT5
#define LEDOFF P5OUT = 0x00


uchar dis_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};    //數(shù)碼管0~F共陽編碼
uchar bitnum[]={0x01,0x02,0x04,0x08,0x10,0x20};         //數(shù)碼管位選
uchar dispbuf[6];                                                             //數(shù)碼管顯示緩沖區(qū)

//以下是延時(shí)函數(shù)
void delay(uint x)
{
  uint a,b;
  for(a=x;a>0;a--)
    for(b=10000;b>0;b--);
}

//控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)
void write_595(uchar dat)
{
  uint n;
  for(n = 0;n<8;n++)
  {
    if((dat&0x80) == 0x80)
      DS1;
    else
      DS0;
    dat <<= 1;
    CLK0;   
    CLK1;
  }
  STB1;
  STB0;
}

/*****************************************
            數(shù)碼管顯示初始化函數(shù)

*****************************************/
void SegInitial(void)
{
  P5DIR = 0XFF;
  P4DIR = 0XFF;
  P5OUT = 0X00;
  P4OUT = 0X00;
}


/****************************************
          數(shù)碼管防重影延時(shí)函數(shù)

*****************************************/
void delays(uint x)
{
  for(;x>0;x--);
}


/*****************************************
            數(shù)碼管顯示函數(shù)
            位選 P5.0~P5.5
            段選 P4

*****************************************/
void disp(long num)
{
    uint i;
    dispbuf[0] = num%10;
    dispbuf[1] = num/10%10;
    dispbuf[2] = num/100%10;
    dispbuf[3] = num/1000%10;
    dispbuf[4] = num/10000%10;
    dispbuf[5] = num/100000%10;
    
    for(i=0;i<6;i++)
    {
      P4OUT = dis_num[dispbuf[i]];
      P5OUT = bitnum[i];
      delays(400);
      P5OUT=0X00;
    }
}
 
首先看main.c里面就寫了一個(gè)主函數(shù),它告訴讀者該程序的主要功能。mydefine.h里面包含了一些函數(shù)的聲明,如果使用到外部變量(或函數(shù)),則需要在該變量(或函數(shù))前寫extern加以說明其為外部變量(或函數(shù))。寫頭文件一定要注意:
 
#ifndef XXXX
#define XXXX
        .
        .
        .
        .
        .
        .
#endif
 
其中XXXX習(xí)慣大寫,名稱不要與關(guān)鍵字相同,習(xí)慣寫法請參照上面的程序,#ifndef XXXX    #define  XXXX   .....   #endif的作用是有些頭文件已經(jīng)在其他文件里包含過了,但是你在這個(gè)文件也包含了,如果沒有上面那一句,則編譯器會報(bào)錯(cuò):重復(fù)定義!mydefine.c中用到了mydefine.h中的定義,則需要把mydefine包含進(jìn)來,包含mydefine.h的意思是mydefine.h替換為mydefine.h的內(nèi)容,即mydefine.c的完整內(nèi)容為:
#include "msp430x14x.h"

typedef  unsigned int uint;
typedef unsigned char uchar;

void write_595(uchar dat);
void SegInitial(void);
void disp(long num);
void delays(uint x);
void delay(uint x);
/*********************************
      流水燈74hc595各引腳定義

*********************************/
#define CLK0 P2OUT &= ~BIT4
#define CLK1 P2OUT |= BIT4
#define STB0 P2OUT &= ~BIT2
#define STB1 P2OUT |= BIT2
#define DS0  P2OUT &= ~BIT5
#define DS1  P2OUT |= BIT5


/*********************************
      流水燈74hc595各引腳定義

*********************************/
#define LEDOFF P5OUT = 0x00


uchar dis_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar bitnum[]={0x01,0x02,0x04,0x08,0x10,0x20};
uchar dispbuf[6];

//以下是延時(shí)函數(shù)
void delay(uint x)
{
  uint a,b;
  for(a=x;a>0;a--)
    for(b=10000;b>0;b--);
}

//控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)
void write_595(uchar dat)
{
  uint n;
  for(n = 0;n<8;n++)
  {
    if((dat&0x80) == 0x80)
      DS1;
    else
      DS0;
    dat <<= 1;
    CLK0;   
    CLK1;
  }
  STB1;
  STB0;
}

/*****************************************
            數(shù)碼管顯示初始化函數(shù)

*****************************************/
void SegInitial(void)
{
  P5DIR = 0XFF;
  P4DIR = 0XFF;
  P5OUT = 0X00;
  P4OUT = 0X00;
}


/****************************************
          數(shù)碼管延時(shí)函數(shù)

*****************************************/
void delays(uint x)
{
  for(;x>0;x--);
}


/*****************************************
            數(shù)碼管顯示函數(shù)
            位選 P5.0~P5.5
            段選 P4

*****************************************/
void disp(long num)
{
    uint i;
    dispbuf[0] = num%10;
    dispbuf[1] = num/10%10;
    dispbuf[2] = num/100%10;
    dispbuf[3] = num/1000%10;
    dispbuf[4] = num/10000%10;
    dispbuf[5] = num/100000%10;
    
    for(i=0;i<6;i++)
    {
      P4OUT = dis_num[dispbuf[i]];
      P5OUT = bitnum[i];
      delays(400);
      P5OUT=0X00;
    }  
}
 
        下面講一下mydefine.c的功能,一些常用函數(shù)都寫在里面,一般情況下我們寫好頭文件后不必對函數(shù)的原型進(jìn)行深究,只需知道函數(shù)的功能即可,即頭文件里的函數(shù)聲明,多個(gè)C文件編譯鏈接的時(shí)候,相當(dāng)于主函數(shù)放在前面,其他函數(shù)放在后面,調(diào)用函數(shù)的時(shí)候就必須先對這些函數(shù)進(jìn)行聲明,否則編譯器不知道你的函數(shù)原型是什么,而這些頭文件就起到了函數(shù)聲明的作用,所謂頭文件就可以理解為在main函數(shù)前面事先要處理的程序(即聲明和定義)。
 
        下面把這個(gè)結(jié)構(gòu)化編程的等效程序貼出來,以方便大家理解:
 
#include "msp430x14x.h"
typedef  unsigned int uint;
typedef unsigned char uchar;

void write_595(uchar dat);
void SegInitial(void);
void disp(long num);
void delays(uint x);
void delay(uint x);

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  SegInitial();
  
  long m = 0;
  while(1)
  {
    
   disp(m);
    delay(10);
   m++;
   if(m == 1000000)
     m = 0;
  }

}

/*********************************
      流水燈74hc595各引腳定義

*********************************/
#define CLK0 P2OUT &= ~BIT4
#define CLK1 P2OUT |= BIT4
#define STB0 P2OUT &= ~BIT2
#define STB1 P2OUT |= BIT2
#define DS0  P2OUT &= ~BIT5
#define DS1  P2OUT |= BIT5


/*********************************
      流水燈74hc595各引腳定義

*********************************/
#define LEDOFF P5OUT = 0x00


uchar dis_num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar bitnum[]={0x01,0x02,0x04,0x08,0x10,0x20};
uchar dispbuf[6];

//以下是延時(shí)函數(shù)
void delay(uint x)
{
  uint a,b;
  for(a=x;a>0;a--)
    for(b=10000;b>0;b--);
}

//控制流水燈,使用P2.2(STB),P2.4(CLK),P2.5(DS)
void write_595(uchar dat)
{
  uint n;
  for(n = 0;n<8;n++)
  {
    if((dat&0x80) == 0x80)
      DS1;
    else
      DS0;
    dat <<= 1;
    CLK0;   
    CLK1;
  }
  STB1;
  STB0;
}

/*****************************************
            數(shù)碼管顯示初始化函數(shù)

*****************************************/
void SegInitial(void)
{
  P5DIR = 0XFF;
  P4DIR = 0XFF;
  P5OUT = 0X00;
  P4OUT = 0X00;
}


/****************************************
          數(shù)碼管延時(shí)函數(shù)

*****************************************/
void delays(uint x)
{
  for(;x>0;x--);
}


/*****************************************
            數(shù)碼管顯示函數(shù)
            位選 P5.0~P5.5
            段選 P4

*****************************************/
void disp(long num)
{
    uint i;
    dispbuf[0] = num%10;
    dispbuf[1] = num/10%10;
    dispbuf[2] = num/100%10;
    dispbuf[3] = num/1000%10;
    dispbuf[4] = num/10000%10;
    dispbuf[5] = num/100000%10;
    
    for(i=0;i<6;i++)
    {
      P4OUT = dis_num[dispbuf[i]];
      P5OUT = bitnum[i];
      delays(400);
      P5OUT=0X00;
    }    
}
 
希望這些總結(jié)能對大家有所幫助,又不能理解的地方,可以互相交流一下。
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 爱爱视频在线观看 | 中文字幕亚洲精品 | 午夜在线视频 | 久久精品福利视频 | 欧美精品1区2区 | 蜜桃一区二区三区在线 | 福利一区视频 | 久久久精选 | 精品在线 | 色橹橹欧美在线观看视频高清 | 国产1区在线 | 亭亭五月激情 | 久久久www| 国产免费让你躁在线视频 | 欧洲av在线 | 色五月激情五月 | 亚洲视频www | 久久9热| 一区二区三区视频 | 影音先锋欧美资源 | 久久精品女人天堂av | 日本精品久久 | 天堂一区在线 | 黄色国产视频 | 国产美女视频一区 | av一区二区三区四区 | 69性欧美高清影院 | 欧美人妇做爰xxxⅹ性高电影 | 久久久美女 | 国产精品成人久久久久 | 毛片片| 久久久久久亚洲欧洲 | 拍拍无遮挡人做人爱视频免费观看 | 欧美久久一区二区三区 | 91色视频在线 | 中文字幕在线免费观看 | 久久精品亚洲 | 成人av免费网站 | 91av在线看| www.788.com色淫免费 | 天天操天天摸天天干 |