我们写一个c程序,也许会有很多的子函数,都在一个文件里面是不是看着很乱呢?这时就需要把子函数给分离出去,我们的主函数中只留一个main函数就好了,其他的子程序可以一个功能一个文件,方便程序的编写与日后的管理。这样我们写过的一些功能性文件都可以保存成一个文件(就像头文件一样)以后需要的时候,直接导入就直接能用了,不用再想具体的过程了。首先以上一篇的文章程序为基础进行更改。先把上一篇的程序摆出来,大家看看啊!
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
u8 table[]="wo shou dao le!";
u8 a,flag;
void init();
void main()
{
u8 i;
init();
while(1)
{
if(flag==1)
{
if(a == 00){
for(i=0;i<15;i++) //发送字符串
{
SBUF=table[i];
while(!TI); //等待发送发送完成
TI=0; //清除标志位
}
P2 = 0x00;
}
else{
P2 = a;
}
}
}
}
//定时器初始化,为串口提供时钟脉冲
void init()
{
TMOD=0x20;
PCON=0X80; //设置SMOD=1,波特率加倍
TH1=0xfA; //波特率为9600 STC89C51 11.052MHZ
TL1=TH1;
TR1=1;//启动定时器1
SM0=0;//方式1
SM1=1;
REN=1; //启动串口接收数据
ES=1; //打开串口中断
EA=1;//打开总中断
}
//中断服务函数,串口中断后会自动跳到这里
void zhongduan() interrupt 4
{
//清除标志位
RI=0;
//将接收到的数据位记录到a中
a=SBUF;
flag=1;
}
这就是上一篇文章写得串口通讯的c文件,现在咱们就把他来拆分一下,叫咱们的主文件只保留main函数,其他的代码单独写一个文件,在主文件中调用就好了,具体怎么拆分,首先新建两个文件和主文件一个目录下,一个点C文件,一个点h文件。从主文件中剪切下来的所有文件都放到新建的点c的文件中,然后把新建的点c的文件中的每个函数名复制到点h文件中,最后在主文件中include“点h”文件,就可以了。具体看下图:
![](https://i-blog.csdnimg.cn/blog_migrate/bd1e46d96f535ad207d11acb66ab8392.png)
下面把每一个文件的代码都分享出来,有需要的小伙伴,自行研究,发现错误望能告知!谢谢了!
#include"uart_init.h"
void main()
{
u8 i;
init();
while(1)
{
if(flag==1)
{
if(a == 00){
for(i=0;i<15;i++) //发送字符串
{
SBUF=table[i];
while(!TI); //等待发送发送完成
TI=0; //清除标志位
}
P2 = 0x00;
}
else{
P2 = a;
}
}
}
}
#ifndef _uart_init_h_
#define _uart_init_h_
void init();
void zhongduan();
#endif
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
u8 table[]="wo shou dao le!";
u8 a,flag;
void init()
{
TMOD=0x20;
PCON=0X80; //设置SMOD=1,波特率加倍
TH1=0xfA; //波特率为9600 STC89C51 11.052MHZ
TL1=TH1;
TR1=1;//启动定时器1
SM0=0;//方式1
SM1=1;
REN=1; //启动串口接收数据
ES=1; //打开串口中断
EA=1;//打开总中断
}
//中断服务函数,串口中断后会自动跳到这里
void zhongduan() interrupt 4
{
//清除标志位
RI=0;
//将接收到的数据位记录到a中
a=SBUF;
flag=1;
}
-
下面是分成三个文件的写LCD1602的文件
1602.c
#include"LCD1602.h" uc str[]="hello word"; void display() { uc *p = str; writecom(0x80+2); delay(5); while(*p != '\0') { writedat(*p); p++; } } int main() { LCD_init(); while(1) { display(); } return 0; }
LCD1602.h头文件
#ifndef _LCD1602_h_ #define _LCD1602_h_ #define uc unsigned char // 延时函数 void delay(uc t); // lcd1602初始化函数 void LCD_init(); // lcd1602 写命令函数 void writecom(uc com); // lcd1602 写数据函数 writedat void writedat(uc dat); #endif
LCD1602.c文件
#include<reg52.h> #define uc unsigned char sbit RS = P3^0; sbit RW = P3^1; sbit E = P3^2; // 延时函数 void delay(uc t) { uc i=0, j=0; for(i=0;i<t;i++) { for(j=0;j<120;j++); } } // lcd1602 写数据函数 writedat void writedat(uc dat) { RS = 1; RW = 0; E = 0; P2 = dat; delay(5); E = 1; E = 0; } // lcd1602 写命令函数 void writecom(uc com) { RS = 0; RW = 0; E = 0; P2 = com; delay(5); E = 1; E = 0; } // lcd1602初始化函数LCD_init() void LCD_init(void) { writecom(0x38); writecom(0x0c); writecom(0x06); writecom(0x01); }
这样就能在1602.c文件中引用头文件LCD1602.h,从而实现调用LCD1602.c中的已经写好的函数的功能。
今天还证明了,c语言中的取数组地址,解引用地址,地址加都能在程序中正常使用,这一点也许在大佬面前不值一提,但是作为初学的我来说,从新学习了c语言指针后才开始尝试是否可行。一路走来太多的辛酸!所有的这一切,都没有文章提及过,或许还是我看的少,想要函数改变变量的值,就要传地址,传值是不能改变的,和我有同样困惑的小伙伴,劝你去学习一遍C语言,再来学习51单片机吧!