c语言单片机编程之头文件编写_第1页
c语言单片机编程之头文件编写_第2页
c语言单片机编程之头文件编写_第3页
c语言单片机编程之头文件编写_第4页
c语言单片机编程之头文件编写_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.如何高效编程之头文件在网上查了很长时间关于头文件的资料,但是发现很难找到适合我的。学单片机的朋友知道,很多程序经常要调用相同的函数,如果每写一个程序都把这些函数重新写一遍或者复制过来,那是很浪费时间的,现在我通过学习总结以及别人的经验,跟大家分享,欢迎大家学习。写程序最好是结构化编程,因为这样的程序看起来就不则长了,一目了然,可以很快就知道这个程序实现什么功能,而且排错也非常简单。把常用的函数声明、自定义类型、外部变量的声明等写进头文件,与之配对的扩展名为.c的文件就写常用的函数,main.c最好就写一个主函数。之前学的51单片机,现在玩430单片机,就以430单片机为例,其他编程软件道理与这个相同。在IAR下新建工程,包含了main.c、mydefine.c和mydefine.h(mydefine.c和mydefine.h是一对)三个文件(注:可包含多个配对的头文件和C文件)。先把程序贴出来,再详解其中缘由。main.c容:*include"mydefine.h"voidmain(void){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;SegInitial();//数码管控制引脚初始化longm=0;while(1){disp(m);//显示m的值delay(10);m++;if(m==1000000)m=0;}}mydefine.h的容*ifndef_MYDEFINE_H*define_MYDEFINE_H*include"msp430*14*.h"typedefunsignedintuint;typedefunsignedcharuchar;voidwrite_595(uchardat);voidSegInitial(void);voiddisp(longnum);voiddelays(uint*);voiddelay(uint*);*endifmydefine.c的容*include"mydefine.h"*include"msp430*14*.h"/*********************************流水灯74hc595各引脚定义*********************************/*defineCLK0P2OUT&=~BIT4*defineCLK1P2OUT|=BIT4*defineSTB0P2OUT&=~BIT2*defineSTB1P2OUT|=BIT2*defineDS0P2OUT&=~BIT5*defineDS1P2OUT|=BIT5*defineLEDOFFP5OUT=0*00uchardis_num[]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e};//数码管0~F共阳编码ucharbitnum[]={0*01,0*02,0*04,0*08,0*10,0*20};//数码管位选uchardispbuf[6];//数码管显示缓冲区//以下是延时函数voiddelay(uint*){uinta,b;for(a=*;a>0;a--)for(b=10000;b>0;b--);}//控制流水灯,使用P2.2(STB),P2.4(CLK),P2.5(DS)voidwrite_595(uchardat){uintn;for(n=0;n<8;n++){if((dat&0*80)==0*80)DS1;elseDS0;dat<<=1;CLK0;CLK1;}STB1;STB0;}/*****************************************数码管显示初始化函数*****************************************/voidSegInitial(void){P5DIR=0*FF;P4DIR=0*FF;P5OUT=0*00;P4OUT=0*00;}/****************************************数码管防重影延时函数*****************************************/voiddelays(uint*){for(;*>0;*--);}/*****************************************数码管显示函数位选P5.0~P5.5段选P4*****************************************/voiddisp(longnum){uinti;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=0*00;}}首先看main.c里面就写了一个主函数,它告诉读者该程序的主要功能。mydefine.h里面包含了一些函数的声明,如果使用到外部变量(或函数),则需要在该变量(或函数)前写e*tern加以说明其为外部变量(或函数)。写头文件一定要注意:*ifndef*****define****......*endif其中****习惯大写,名称不要与关键字相同,习惯写法请参照上面的程序,*ifndef*****define****.....*endif的作用是有些头文件已经在其他文件里包含过了,但是你在这个文件也包含了,如果没有上面那一句,则编译器会报错:重复定义!mydefine.c中用到了mydefine.h中的定义,则需要把mydefine包含进来,包含mydefine.h的意思是mydefine.h替换为mydefine.h的容,即mydefine.c的完整容为:*include"msp430*14*.h"typedefunsignedintuint;typedefunsignedcharuchar;voidwrite_595(uchardat);voidSegInitial(void);voiddisp(longnum);voiddelays(uint*);voiddelay(uint*);/*********************************流水灯74hc595各引脚定义*********************************/*defineCLK0P2OUT&=~BIT4*defineCLK1P2OUT|=BIT4*defineSTB0P2OUT&=~BIT2*defineSTB1P2OUT|=BIT2*defineDS0P2OUT&=~BIT5*defineDS1P2OUT|=BIT5/*********************************流水灯74hc595各引脚定义*********************************/*defineLEDOFFP5OUT=0*00uchardis_num[]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e};ucharbitnum[]={0*01,0*02,0*04,0*08,0*10,0*20};uchardispbuf[6];//以下是延时函数voiddelay(uint*){uinta,b;for(a=*;a>0;a--)for(b=10000;b>0;b--);}//控制流水灯,使用P2.2(STB),P2.4(CLK),P2.5(DS)voidwrite_595(uchardat){uintn;for(n=0;n<8;n++){if((dat&0*80)==0*80)DS1;elseDS0;dat<<=1;CLK0;CLK1;}STB1;STB0;}/*****************************************数码管显示初始化函数*****************************************/voidSegInitial(void){P5DIR=0*FF;P4DIR=0*FF;P5OUT=0*00;P4OUT=0*00;}/****************************************数码管延时函数*****************************************/voiddelays(uint*){for(;*>0;*--);}/*****************************************数码管显示函数位选P5.0~P5.5段选P4*****************************************/voiddisp(longnum){uinti;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=0*00;}}下面讲一下mydefine.c的功能,一些常用函数都写在里面,一般情况下我们写好头文件后不必对函数的原型进行深究,只需知道函数的功能即可,即头文件里的函数声明,多个C文件编译的时候,相当于主函数放在前面,其他函数放在后面,调用函数的时候就必须先对这些函数进行声明,否则编译器不知道你的函数原型是什么,而这些头文件就起到了函数声明的作用,所谓头文件就可以理解为在main函数前面事先要处理的程序(即声明和定义)。下面把这个结构化编程的等效程序贴出来,以方便大家理解:*include"msp430*14*.h"typedefunsignedintuint;typedefunsignedcharuchar;voidwrite_595(uchardat);voidSegInitial(void);voiddisp(longnum);voiddelays(uint*);voiddelay(uint*);voidmain(void){//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;SegInitial();longm=0;while(1){disp(m);delay(10);m++;if(m==1000000)m=0;}}/*********************************流水灯74hc595各引脚定义*********************************/*defineCLK0P2OUT&=~BIT4*defineCLK1P2OUT|=BIT4*defineSTB0P2OUT&=~BIT2*defineSTB1P2OUT|=BIT2*defineDS0P2OUT&=~BIT5*defineDS1P2OUT|=BIT5/*********************************流水灯74hc595各引脚定义*********************************/*defineLEDOFFP5OUT=0*00uchardis_num[]={0*c0,0*f9,0*a4,0*b0,0*99,0*92,0*82,0*f8,0*80,0*90,0*88,0*83,0*c6,0*a1,0*86,0*8e};ucharbitnum[]={0*01,0*02,0*04,0*08,0*10,0*20};uchardispbuf[6];//以下是延时函数voiddelay(uint*){uinta,b;for(a=*;a>0;a--)for(b=10000;b>0;b--);}//控制流水灯,使用P2.2(STB),P2.4(CLK),P2.5(DS)voidwrite_595(uchardat){uintn;for(n=0;n<8;n++){if((dat&0*80)==0*80)DS1;elseDS0;dat<<=1;CLK0;CLK1;}STB1;STB0;}/***************************************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论