如何把keil中的子函数分离成库函数

我们写一个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”文件,就可以了。具体看下图:

下面把每一个文件的代码都分享出来,有需要的小伙伴,自行研究,发现错误望能告知!谢谢了!


#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单片机吧!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚久龙

你的鼓励是我最大的动力!谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值