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

文章目录

  • 前言
  • 一、代码模块化是什么?
  • 二、使用步骤
    • 1.以LCD1602作为例子
    • 2.将LCD1602 相关的代码抽取到另外一个文件中
  • 三、调用LCD1602.h
    • 1.新建一个工程项目,将LCD1602.h添加到工程中
    • 2.在主函数上加入 #include <LCD1602.h>
  • 总结


前言

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

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


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

一、代码模块化是什么?

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

二、使用步骤

1.以LCD1602作为例子

将所有功能都添加到main.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
代码如下(示例):


 #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文件变得简洁

 #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);  
		   
		
	}
 }
 
 

在这里插入图片描述

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/667698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MACOS安装 vue 抱错解决方法npm ERR! code EACCESnpm ERR! syscall mkdirnpm ERR!

问题 在使用脚手架 vue-cli 创建 vue 工程的时候存在权限不足的情况下&#xff0c;报错&#xff1b; npm error code EACCES npm error syscall open npm error path /Users/ npm ERR! code EACCESnpm ERR! syscall mkdirnpm ERR! 解决方案&#xff1a; sudo npm cache cl…

Go跨平台编译

1.编译windows平台运行程序 # windows env GOOSwindows GOARCHamd64 go build main.go2.编译linux平台运行程序 # linux env GOOSlinux GOARCHamd64 go build main.go 3.编译macos平台运行程序 # macos env GOOSdarwin GOARCHamd64 go build main.go 编译结果:

VQAScore开启文本到视觉生成评估新篇章

随着生成式人工智能技术的飞速发展&#xff0c;如何全面评估生成内容的质量和与输入提示的一致性成为了一个挑战。在图像-文本对齐领域&#xff0c;传统的评估方法如CLIPScore存在局限性&#xff0c;尤其是在处理涉及多个对象、属性和关系的复杂提示时。它们通常基于简单的词袋…

Linux域名解析不了/网络不可达/虚拟机连接不了的问题

记录域名解析不了/网络不可达/虚拟机连接不了的问题问题 目录 文章目录 记录域名解析不了/网络不可达/虚拟机连接不了的问题问题1.首先确定已经连接上路由器(我的就是在这嗝屁了....)1.1 查看路由表1.2查看当前的网络连接状态&#xff0c;包括网关1.3查看网络接口的状态&…

机器学习笔记 - PyTorch 分布式训练概览

一、简述 对于大规模的数据集,只能进行分布式训练,分布式训练会尽可能的利用我们的算力,使模型训练更加高效。PyTorch提供了Data Parallel包,它可以实现单机、多GPU并行。 PyTorch 数据并行模块的内部工作原理 上面的图像说明了PyTorch 如何在单个系统中利用多个 G…

jmeter多用户登录并退出教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录并退出操作&#xff0c;大致参考如下 多用户登录前面已经实现&#xff1a;参考博文 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、多用户退出操作 添加一个setUp线程组&#xff0…

pcdn如何规避运营商查封线路

在使用PCDN&#xff08;Private Content Delivery Network&#xff09;时&#xff0c;为了规避运营商查封线路&#xff0c;可以采取以下措施&#xff1a; 基于成本和宽带的调度&#xff1a;从CDN厂商的角度出发&#xff0c;考虑在不同业务量的地区进行调度&#xff0c;以减少在…

C#WPF数字大屏项目实战05--人员绩效展示

1、创建人员绩效实体类 2、定义视图模型中的属性 3、创建数据转换器 运行效果就是这样 4、绘制刻度 5、运行效果 6、小结 第1行StackPanel控件&#xff0c;里面放border和textblock 第2行ItemsControl控件&#xff0c;里面的ItemsSource绑定视图模型中的WorkerCompareList 第…

如何让数据标注

1.用Anacoda创建一个新的虚拟环境 2.进入虚拟环境 conda activate stu_data&#xff08;就是刚才创建的虚拟变量的名称&#xff09; 3.在此环境中安装labelimg pip install labelimg 4.进入labelimg 直接输入 labelimg 快捷键&#xff1a;D&#xff1a;下一个图片 A&#xff1a…

基于单片机的微型太阳能电站低功耗系统设计

摘 要 : 综合设计性实验是提高单片机类实验课程教学质量行之有效的手段 。 将实验课程内容结合社会热点问题而设计的实验教学案例&#xff0c;融合了单片机实验的所有知识点&#xff0c;提高了学生对实验课程的学习热情&#xff0c;激发了学生对实践教学的兴趣。 让学生通过对一…

java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决

注意事项&#xff1a; 尽量避免使用下面方式写sql否则会降低服务器性能&#xff1a; mybatis二级缓存开启后&#xff0c;避免使用事务注解&#xff08;加上事务注解后二级缓存数据会导致两次访问不一致问题&#xff09;&#xff1a; 3. 返回的对象实体类&#xff0c;要实现Se…

FreeRTOS基础(三):动态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中&#xff0c;我们讲解了创建任务和删除任务的API函数&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握动态创建任务的编码风格&#xff0c;达到实战应用&#xff01; …

用贪心算法进行10进制整数转化为2进制数

十进制整数转二进制数用什么方法&#xff1f;网上一搜&#xff0c;大部分答案都是用短除法&#xff0c;也就是除2反向取余法。这种方法是最基本最常用的&#xff0c;但是计算步骤多&#xff0c;还容易出错&#xff0c;那么还有没有其他更好的方法吗&#xff1f; 一、短除反向取…

一键分割视频并生成M3U8格式:高效管理视频内容,畅享流畅播放新体验

视频内容已成为我们日常生活和工作中的重要组成部分。无论是个人分享生活点滴&#xff0c;还是企业宣传产品与服务&#xff0c;视频都以其直观、生动的形式&#xff0c;吸引着我们的眼球。然而&#xff0c;随着视频内容的不断增多&#xff0c;如何高效、便捷地管理这些视频&…

Java——String类

1.String常用方法 1.1三种常用构造方法 1. String s1"hello";2. String s2new String("world");3. char []str{h,e,l,l,o, ,w,o,r,l,d};String s3new String(str); 1.2String对象的比较 比较 对于内置类型来说&#xff0c;“”比较…

在Unity中配置Android项目以允许HTTP流量,解决AVPro在Android平台中无法播放http视频

解决方法快速通道&#xff1a;拉到底&#xff0c;看倒数第二张图 好记性不如烂笔头 最近在使用AVpro插件播放http视频&#xff0c;在Editor中一切正常&#xff0c;然而打包在Android平台下就播放不了 AVPro在Unity中的警告&#xff1a; 感觉只是个警告&#xff0c;没引起注意…

嵌入式人工智能开发:基于TensorFlow Lite和OpenCV的实时姿态估计算法实现

文章目录 引言环境准备人工智能在嵌入式系统中的应用场景代码示例常见问题及解决方案结论 1. 引言 在嵌入式系统中集成人工智能&#xff08;AI&#xff09;技术已经成为一种重要的发展方向。实时姿态估计是AI在嵌入式领域的一个高级应用&#xff0c;能够在资源受限的环境中实…

关于12306技术相关说明以及暂定计划

12306 项目中包含了缓存、消息队列、分库分表、设计模式等代码&#xff0c;通过这些代码可以全面了解分布式系统的核心知识点。 在系统设计中&#xff0c;采用最新 JDK17 SpringBoot3&SpringCloud 微服务架构&#xff0c;构建高并发、大数据量下仍然能提供高效可靠的 1230…

【机器学习】集成语音与大型语音模型等安全边界探索

探索集成语音与大型语言模型&#xff08;SLMs&#xff09;的安全边界 一、引言二、SLMs的潜在安全风险三、对抗性攻击与越狱实验四、提高SLMs安全性的对策五、总结与展望 一、引言 近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;集成语音与大型语言模型&#xff08…

攻防实战 | 邮件高级威胁检测与自动化响应

历经三个月的时间&#xff0c;年度重磅直播节目Fortinet 2024年度“Demo季”近日终于迎来了备受瞩目的压轴大戏——Demo Day第三期&#xff0c;主题为《新邮件安全下的高级威胁检测与自动化响应》。继成功举办了前两期《企业网络中的多源威胁情报自动化整合与集成》和《应急响应…