<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發(fā)網(wǎng)

      電子開發(fā)網(wǎng)電子設(shè)計(jì) | 電子開發(fā)網(wǎng)Rss 2.0 會員中心 會員注冊
      搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 電子開發(fā) >> 單片機(jī)實(shí)例 >> 正文

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

      作者:佚名    文章來源:本站原創(chuàng)    點(diǎn)擊數(shù):    更新時間:2018/12/19

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

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

      *****************************************/
      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里面就寫了一個主函數(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)在其他文件里包含過了,但是你在這個文件也包含了,如果沒有上面那一句,則編譯器會報錯:重復(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ù)
      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ù)

      *****************************************/
      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ù)聲明,多個C文件編譯鏈接的時候,相當(dāng)于主函數(shù)放在前面,其他函數(shù)放在后面,調(diào)用函數(shù)的時候就必須先對這些函數(shù)進(jìn)行聲明,否則編譯器不知道你的函數(shù)原型是什么,而這些頭文件就起到了函數(shù)聲明的作用,所謂頭文件就可以理解為在main函數(shù)前面事先要處理的程序(即聲明和定義)。
       
              下面把這個結(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ù)
      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ù)

      *****************************************/
      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é)能對大家有所幫助,又不能理解的地方,可以互相交流一下。
      Tags:單片機(jī)編程,頭文件,單片機(jī)c語言,編程  
      責(zé)任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網(wǎng)友評論
      關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 丁香六月纪婷婷激情综合| 久久久久久久尹人综合网亚洲| 国产亚洲综合久久系列| 琪琪五月天综合婷婷| 亚洲Av综合色区无码专区桃色| 综合色就爱涩涩涩综合婷婷| 久久婷婷五月综合色奶水99啪 | 麻豆久久婷婷综合五月国产| 亚洲日韩久久综合中文字幕| 久久久久噜噜噜亚洲熟女综合| 亚洲AV人无码综合在线观看 | 亚洲成色在线综合网站| 色综合热无码热国产| 亚洲另类激情综合偷自拍| 狠狠色丁香婷婷综合潮喷| 亚洲高清中文字幕综合网| 久久久久噜噜噜亚洲熟女综合| 天天综合天天添夜夜添狠狠添| 老色鬼久久亚洲AV综合| 亚洲国产成人久久综合一区77| 伊色综合久久之综合久久| 国产成人无码综合亚洲日韩| 狠狠激情五月综合婷婷俺| 国产尹人香蕉综合在线电影| 小说区综合区首页| 亚洲人成人伊人成综合网无码 | 伊人久久五月丁香综合中文亚洲| 亚洲综合色在线观看亚洲| 色偷偷亚洲第一综合网| 99久久婷婷国产综合精品| 亚洲AV综合色区无码一二三区| 亚洲五月综合网色九月色| 亚洲五月综合缴情婷婷| 国产精品综合AV一区二区国产馆| 久久婷婷五月综合国产尤物app| 亚洲综合激情九月婷婷| 亚洲国产亚洲综合在线尤物| 亚洲熟女综合色一区二区三区| 在线成人综合色一区| 国产精品亚洲综合一区| 色欲天天天综合网|