在网上查了很长时间关于头文件的资料,但是发现很难找到适合我的。学单片机的朋友知道,很多程序经常要调用相同的函数,如果每写一个程序都把这些函数重新写一遍或者复制过来,那是很浪费时间的,现在我通过学习总结以及别人的经验,跟大家分享,欢迎大家转载学习。
写程序最好是结构化编程 ,因为这样的程序看起来就不那么长了,一目了然,可以很快就知道这个程序实现什么功能,而且排错也非常简单。把常用的 函数声明、自定义类型、外部变量的声明等 写进头文件,与之配对的扩展名为 .c 的文件就写常用的函数, main.c 最好就写一个主函数。 之前学的51单片机,现在玩430单片机,就以430单片机为例,其他编程软件道理与这个相同。在IAR下新建工程,包含了main.c、mydefine.c和mydefine.h( mydefine.c和mydefine.h是一对 )三个文件(注:可包含多个配对的头文件和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 _MEFINE_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 B0 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) { P5D = 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各引脚定义 *********************************/