婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av

電子開發網

電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機實例 >> 正文

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

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2018-12-19

       在網上查了很長時間關于頭文件的資料,但是發現很難找到適合我的。學單片機的朋友知道,很多程序經常要調用相同的函數,如果每寫一個程序都把這些函數重新寫一遍或者復制過來,那是很浪費時間的,現在我通過學習總結以及別人的經驗,跟大家分享,歡迎大家轉載學習。

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

main.c內容:
#include "mydefine.h"
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  SegInitial();      //數碼管控制引腳初始化
  
  long m = 0;
  while(1)
  {    
   disp(m);            //顯示m的值
    delay(10);
   m++;
   if(m == 1000000)
     m = 0;
  }
}
 
 
mydefine.h的內容
 
#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的內容
 
#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};    //數碼管0~F共陽編碼
uchar bitnum[]={0x01,0x02,0x04,0x08,0x10,0x20};         //數碼管位選
uchar dispbuf[6];                                                             //數碼管顯示緩沖區

//以下是延時函數
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;
}

/*****************************************
            數碼管顯示初始化函數

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


/****************************************
          數碼管防重影延時函數

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


/*****************************************
            數碼管顯示函數
            位選 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里面就寫了一個主函數,它告訴讀者該程序的主要功能。mydefine.h里面包含了一些函數的聲明,如果使用到外部變量(或函數),則需要在該變量(或函數)前寫extern加以說明其為外部變量(或函數)。寫頭文件一定要注意:
 
#ifndef XXXX
#define XXXX
        .
        .
        .
        .
        .
        .
#endif
 
其中XXXX習慣大寫,名稱不要與關鍵字相同,習慣寫法請參照上面的程序,#ifndef XXXX    #define  XXXX   .....   #endif的作用是有些頭文件已經在其他文件里包含過了,但是你在這個文件也包含了,如果沒有上面那一句,則編譯器會報錯:重復定義!mydefine.c中用到了mydefine.h中的定義,則需要把mydefine包含進來,包含mydefine.h的意思是mydefine.h替換為mydefine.h的內容,即mydefine.c的完整內容為:
#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];

//以下是延時函數
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;
}

/*****************************************
            數碼管顯示初始化函數

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


/****************************************
          數碼管延時函數

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


/*****************************************
            數碼管顯示函數
            位選 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的功能,一些常用函數都寫在里面,一般情況下我們寫好頭文件后不必對函數的原型進行深究,只需知道函數的功能即可,即頭文件里的函數聲明,多個C文件編譯鏈接的時候,相當于主函數放在前面,其他函數放在后面,調用函數的時候就必須先對這些函數進行聲明,否則編譯器不知道你的函數原型是什么,而這些頭文件就起到了函數聲明的作用,所謂頭文件就可以理解為在main函數前面事先要處理的程序(即聲明和定義)。
 
        下面把這個結構化編程的等效程序貼出來,以方便大家理解:
 
#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];

//以下是延時函數
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;
}

/*****************************************
            數碼管顯示初始化函數

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


/****************************************
          數碼管延時函數

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


/*****************************************
            數碼管顯示函數
            位選 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;
    }    
}
 
希望這些總結能對大家有所幫助,又不能理解的地方,可以互相交流一下。
Tags:單片機編程,頭文件,單片機c語言,編程  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
最新推薦
熱門文章
  • 此欄目下沒有熱點文章
關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁面
下到頁底
晶體管查詢
婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av
<button id="4i884"></button>
  • <abbr id="4i884"><source id="4i884"></source></abbr>
  • <code id="4i884"><tr id="4i884"></tr></code>
  • <rt id="4i884"></rt>
    <li id="4i884"></li>
  • <rt id="4i884"><tr id="4i884"></tr></rt>
  • 国产特级淫片高清视频| 亚洲欧美久久久久| 亚洲国产成人精品无码区99| 又大又硬又爽免费视频| 欧美视频免费播放| 天天综合成人网| 久久久久福利视频| 国产xxxxx在线观看| 日本特黄a级片| 4444亚洲人成无码网在线观看| 久久久久久久久久久99| 亚洲午夜精品一区| 日韩欧美精品免费| 国产精品自在自线| 国产老熟妇精品观看| 午夜免费一级片| 免费黄色福利视频| 五月天激情图片| 亚洲欧美另类动漫| www.xxx麻豆| 一区二区三区四区毛片| 欧美色图另类小说| 国产一级大片免费看| 国产视频在线视频| 国产美女主播在线播放| 午夜xxxxx| 91色国产在线| 大肉大捧一进一出好爽视频| 国产xxxxhd| 日本高清久久久| 免费观看成人在线视频| 成人黄色av片| 精品一区二区三区无码视频| 亚洲黄色av片| 奇米影音第四色| 无码人妻丰满熟妇区毛片| 97超碰在线视| 91视频成人免费| 欧美性受xxxxxx黑人xyx性爽| 国产视频在线视频| 欧洲av无码放荡人妇网站| 成人午夜精品久久久久久久蜜臀| av磁力番号网| 麻豆一区二区三区在线观看| 成人亚洲免费视频| 欧美丝袜在线观看| 欧美成人乱码一二三四区免费| 一本久道中文无码字幕av| 成人在线免费播放视频| 99re在线视频免费观看| 日韩视频第二页| 国产福利视频在线播放| 国产精品免费成人| 国模杨依粉嫩蝴蝶150p| 国产1区2区在线| 天堂社区在线视频| 免费看污黄网站| 色播五月综合网| 亚洲第一成肉网| 亚洲五码在线观看视频| 国产91在线亚洲| 黄色一级在线视频| 777米奇影视第四色| 日本在线视频www| 少妇一级淫免费播放| www.成年人| 成人小视频在线观看免费| 阿v天堂2017| 日本888xxxx| 小说区视频区图片区| 免费在线看黄色片| 人妻无码视频一区二区三区| 亚洲综合欧美激情| 黄色一级视频播放| 日韩网址在线观看| 日韩高清第一页| 国产一区 在线播放| 精品久久久久久无码国产| 向日葵污视频在线观看| av 日韩 人妻 黑人 综合 无码| 97超碰人人澡| 国产野外作爱视频播放| 国产一级片91| av在线无限看| 中文字幕在线中文| 成人在线激情网| 99视频精品全部免费看| 女人床在线观看| 毛片在线播放视频| 亚洲一区 在线播放| 青草视频在线观看视频| 牛夜精品久久久久久久| 五十路熟女丰满大屁股| 99精品视频国产| 亚洲 欧美 综合 另类 中字| 国产精品天天av精麻传媒| 国产精品亚洲天堂| 国产精品wwwww| 九九久久九九久久| 亚洲综合av在线播放| 国产午夜福利100集发布| 爱情岛论坛亚洲首页入口章节| 4444在线观看| www.污污视频| 成人在线看视频| www.射射射| 亚洲国产精品女人| 久久国产精品国产精品| 黄色影院一级片| 日韩黄色片在线| 男人的天堂成人| 在线观看国产福利| 男人天堂成人在线| 霍思燕三级露全乳照| 性做爰过程免费播放| 免费在线观看毛片网站| 91免费黄视频| 国产一线二线三线女| 五月天av影院| www.午夜色| 红桃视频 国产| 在线观看的毛片| 老熟妇仑乱视频一区二区 | 国产中文字幕二区| 亚洲第一精品区| 亚洲天堂网站在线| 亚洲精品乱码久久久久久动漫| 成人免费xxxxx在线视频| 亚洲人成色77777| 国产a级一级片| 超碰97人人射妻| 熟妇人妻无乱码中文字幕真矢织江| 久色视频在线播放| 欧美深夜福利视频| 免费 成 人 黄 色| 免费日韩中文字幕| 亚洲成人天堂网| 欧美精品色视频| 欧美狂野激情性xxxx在线观| 国产伦精品一区二区三区四区视频_| av免费看网址| 国产97色在线 | 日韩| 亚洲精品午夜在线观看| 久久久国产精华液999999 | 欧美综合在线观看视频| 欧美日韩亚洲自拍| 午夜免费福利网站| 超碰成人免费在线| 密臀av一区二区三区| 亚洲一区二区在线视频观看| 亚洲免费av网| 国产精品无码av在线播放| 日本熟妇人妻xxxxx| 国产资源中文字幕| 亚欧无线一线二线三线区别| 美女网站色免费| 免费网站在线观看视频 | 污污网站在线观看视频| 97超碰在线视| 校园春色 亚洲色图| 青草全福视在线| 亚洲精品中文字幕无码蜜桃| 四虎1515hh.com| 欧美色图另类小说| 欧美 日韩 国产 在线观看| 欧美日韩成人免费视频| 日韩欧美理论片| 黄色片视频在线播放| 波多野结衣 作品| 国产一二三四在线视频| 台湾无码一区二区| 色播五月激情五月| 国产综合av在线| 日本在线视频www色| 日本 片 成人 在线| 大肉大捧一进一出好爽视频| 日韩成人午夜影院| 在线观看国产福利| 男人舔女人下面高潮视频| 欧美国产视频一区| ijzzijzzij亚洲大全| 99sesese| 激情综合网俺也去| 黄www在线观看| a级黄色小视频| 免费观看国产视频在线| 手机精品视频在线| 天堂中文av在线| 国产亚洲视频一区| 视频二区在线播放| 久久综合伊人77777麻豆最新章节| www黄色日本| 老太脱裤让老头玩ⅹxxxx| av在线免费观看国产| av影院在线播放| 国内精品国产三级国产99| 亚洲天堂第一区| 国产 欧美 日韩 一区| 欧美日韩福利在线| 337p粉嫩大胆噜噜噜鲁|