单片机建立自己的库文件(1)

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

课程需要:由于学习单片机的内容越来越多,如果只有一个man.c文件,并且在里面添加所有外设的配置将变得非常的拥挤,代码可读性很差。这时候就需要做代码模块化管理。


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码模块化是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

1.以LCD1602作为例子

将所有功能都添加到main.c文件中

c 复制代码
 #include <reg52.h> 

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/	
void LcdWriteData(uchar dat);
/*LCD1602初始化子程序*/		
void LcdInit();	
/*LCD1602 指定地址显示任意四位数*/		
void lcd_4num(unsigned char dizhi,unsigned int num);

unsigned int a=0;

main
 
void main()
 {
	// 初始化LCD1602 
	LcdInit();	
	 
	LcdWriteCom(0x80);
	 LcdWriteData('a'); 
	LcdWriteData('1'); 	 
	LcdWriteData('2'); 
	LcdWriteData('3'); 
	LcdWriteData('4'); 	 
	 // WUZHOU   1234      第一行
	 // 0123456789123456   第二行
	while(1)
	{
			a++;
			if(a==10000)
			{
				a=0;
			}
//			LcdWriteCom(0x80);
//		    LcdWriteData('a'); 
//			LcdWriteData(a/1000%10+0x30); 	 //+0x30 将数字转换成字符  acii表
//			LcdWriteData(a/100%10+0x30); 
//			LcdWriteData(a/10%10+0x30); 
//			LcdWriteData(a%10+0x30); 
			
			
			lcd_4num(0xc0,a);
			Lcd1602_Delay1ms(2000);  
		   
		
	}
 }
 
 /*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能		   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
 
void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //选择发送命令
	LCD1602_RW = 0;	   //选择写入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待数据稳定

	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(5);	  //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/		   

void LcdWriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;	//使能清零
	LCD1602_RS = 1;	//选择输入数据
	LCD1602_RW = 0;	//选择写入

	LCD1602_DATAPINS = dat; //写入数据
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   //写入时序
	Lcd1602_Delay1ms(5);   //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能		 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/		   

void LcdInit()						  //LCD初始化子程序
{
 	LcdWriteCom(0x38);  //开显示
	LcdWriteCom(0x0c);  //开显示不显示光标
	LcdWriteCom(0x06);  //写一个指针加1
	LcdWriteCom(0x01);  //清屏
	LcdWriteCom(0x80);  //设置数据指针起点
}

void lcd_4num(unsigned char dizhi,unsigned int num)
{
			LcdWriteCom(dizhi);
		 //   LcdWriteData('a'); 
			LcdWriteData(num/1000%10+0x30); 	 //+0x30 将数字转换成字符  acii表
			LcdWriteData(num/100%10+0x30); 
			LcdWriteData(num/10%10+0x30); 
			LcdWriteData(num%10+0x30); 
	
}

2.将LCD1602 相关的代码抽取到另外一个文件中

新建文件命名为 LCD1602.h

代码如下(示例):

c 复制代码
 #include <reg52.h> 

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif

/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/	
void LcdWriteData(uchar dat);
/*LCD1602初始化子程序*/		
void LcdInit();	

 /*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能		   : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
 
void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //选择发送命令
	LCD1602_RW = 0;	   //选择写入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待数据稳定

	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(5);	  //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/		   

void LcdWriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;	//使能清零
	LCD1602_RS = 1;	//选择输入数据
	LCD1602_RW = 0;	//选择写入

	LCD1602_DATAPINS = dat; //写入数据
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   //写入时序
	Lcd1602_Delay1ms(5);   //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能		 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/		   

void LcdInit()						  //LCD初始化子程序
{
 	LcdWriteCom(0x38);  //开显示
	LcdWriteCom(0x0c);  //开显示不显示光标
	LcdWriteCom(0x06);  //写一个指针加1
	LcdWriteCom(0x01);  //清屏
	LcdWriteCom(0x80);  //设置数据指针起点
}

三、调用LCD1602.h

1.新建一个工程项目,将LCD1602.h添加到工程中

2.在主函数上加入 #include <LCD1602.h>

加入头文件后就可以方便引用头文件的函数,使得main.c文件变得简洁

c 复制代码
 #include <reg52.h> 
 #include <LCD1602.h>

unsigned int a=0;

void main()
 {
	// 初始化LCD1602 
	LcdInit();	
	 
	LcdWriteCom(0x80);
	 LcdWriteData('a'); 
	LcdWriteData('1'); 	 
	LcdWriteData('2'); 
	LcdWriteData('3'); 
	LcdWriteData('4'); 	 
	 // WUZHOU   1234      第一行
	 // 0123456789123456   第二行
	while(1)
	{
			a++;
			if(a==10000)
			{
				a=0;
			}
			LcdWriteCom(0x80);
		    LcdWriteData('a'); 
			LcdWriteData(a/1000%10+0x30); 	 //+0x30 将数字转换成字符  acii表
			LcdWriteData(a/100%10+0x30); 
			LcdWriteData(a/10%10+0x30); 
			LcdWriteData(a%10+0x30); 
			
			Lcd1602_Delay1ms(2000);  
		   
		
	}
 }
 
 

总结

这是一种比较简单的封装方法,会引发一些问题,但是能用,有空看看进一步怎么优化

相关推荐
MARIN_shen35 分钟前
Marin说PCB之POC电路layout设计仿真案例---06
网络·单片机·嵌入式硬件·硬件工程·pcb工艺
Asa3191 小时前
STM32-按键扫描配置
stm32·单片机·嵌入式硬件
南城花随雪。1 小时前
单片机:实现驱动超声波(附带源码)
单片机·嵌入式硬件
yutian060610 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
你的微笑,乱了夏天11 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
析木不会编程13 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉17 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名67717 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式大圣17 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室18 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设