單片機建立自己的庫文件(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;mainvoid 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);  //寫一個指針加1LcdWriteCom(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);  //寫一個指針加1LcdWriteCom(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);  }}

在這里插入圖片描述

總結

這是一種比較簡單的封裝方法,會引發一些問題,但是能用,有空看看進一步怎么優化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19648.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進口鋁合金電動隔膜泵

進口鋁合金電動隔膜泵是一種高效、可靠的工業泵&#xff0c;其特點、性能與應用廣泛&#xff0c;以下是對其的詳細分析&#xff1a; 特點 材質與結構&#xff1a; 采用鋁合金材料制造&#xff0c;具有良好的耐腐蝕性和輕量化特點。鋁合金材質使得泵體結構緊湊、輕便&#xff…

svg實現一個圓形以及方形的環形進度條

1. svg實現圓形進度條 效果圖&#xff1a; 1. 寫個假接口&#xff1a; let res {curLegendList: [{ progress: "87", name: "進度1",color:"#00fe41" },{ progress: "66", name: "進度2" ,color:"orange"},{ p…

gitlab服務器遷移(親測有效)

描述&#xff1a;最近公司遷移gitlab&#xff0c;我沒有遷移過&#xff0c;經過網上查找資料最終完成遷移&#xff0c;途中也遇到挺多坑和兩個問題&#xff0c;希望能幫到你。 新服務器安裝gitlab 注意&#xff1a;新服務器gitlab版本也需要和舊版本一致。 首先查看原Gitlab…

基于Python實現地震數據可視化的設計與實現

基于Python實現地震數據可視化的設計與實現 “Design and Implementation of Earthquake Data Visualization using Python” 完整下載鏈接:基于Python實現地震數據可視化的設計與實現 文章目錄 基于Python實現地震數據可視化的設計與實現摘要第一章 引言1.1 研究背景1.2 研究…

RabbitMQ(三)SpringBoot整合,可靠性投遞,死信隊列,延遲隊列,消費端限流,消息超時

文章目錄 整合Springboot概述消費者生產者 消息可靠性投遞故障原因解決方案生產者端消息確認機制&#xff08;故障情況1&#xff09;故障情況2解決方案故障情況3解決方案 消費端限流概念 消息超時概念隊列層面&#xff1a;配置隊列過期消息本身&#xff1a;配置消息過期 死信隊…

C++中的虛函數和純虛函數

目錄 摘要 虛函數&#xff08;Virtual Functions&#xff09; 定義 用法 純虛函數&#xff08;Pure Virtual Functions&#xff09; 定義 用法 需要避開的坑 總結 摘要 在C中&#xff0c;我們經常會在開發中使用到虛函數&#xff08;Virtual Functions&#xff09;和…

如何有效屏蔽手機上的騷擾電話20240530

如何有效屏蔽手機上的騷擾電話 引言 最近&#xff0c;我的手機經常接到954開頭的7位數字座機電話&#xff0c;這些騷擾電話讓我非常困擾。由于我經常點外賣&#xff0c;無法屏蔽所有陌生號碼&#xff0c;因此需要一個既能屏蔽特定前綴的騷擾電話&#xff0c;又不影響日常生活…

英偉達(NVIDIA)H100性能及應用場景

英偉達H100是一款性能強大的GPU芯片&#xff0c;其關鍵性能參數和應用領域可以歸納如下&#xff1a; 一、性能參數 架構&#xff1a;H100采用了新一代的Hopper架構&#xff0c;擁有高達1.8萬億次/秒的張量處理能力和高達840 TFLOPS的FP8張量性能。CUDA核心數&#xff1a;H100…

STM32學習和實踐筆記(33):待機喚醒實驗

1.STM32待機模式介紹 很多單片機具有低功耗模式&#xff0c;比如MSP430、STM8L等&#xff0c;我們的STM32也不例外。默認情況下&#xff0c;系統復位或上電復位后&#xff0c;微控制器進入運行模式。在運行模式下&#xff0c;HCLK 為CPU提供時鐘&#xff0c;并執行程序代碼。這…

kafka學習筆記06

Kafka數據存儲流程和log日志講解 講解分布式應用核心CAP知識 Kafka數據可靠性保證原理之副本機制Replica介紹《上》 Kafka數據可靠性保證原理之副本機制Replica介紹《下》 Kafka數據可靠性保證原理之ISR機制講解 Kafka的HighWatermark的作用你知道多少

暑期來臨,AI智能視頻分析方案筑牢防溺水安全屏障

隨著夏季暑期的來臨&#xff0c;未成年人溺水事故頻發。傳統的防溺水方式往往依賴于人工巡邏和警示標識的設置&#xff0c;但這種方式存在人力不足、反應速度慢等局限性。近年來&#xff0c;隨著視頻監控智能分析技術的不斷發展&#xff0c;其在夏季防溺水中的應用也日益凸顯出…

ubuntu22 搭建nginx高可用集群(VIP(keepalived) + 負載均衡)

#在所有節點安裝nginx #ps: 如果要使用tcp流轉發&#xff1a;需用二進制包安裝 make編譯時加入stream流的參數。 推薦直接安裝openresty【默認支持stream等nginx模塊&#xff0c;還附帶了很多常用的lua庫】 apt install -y net-tools sudo apt install -y nginx vim /etc/…

恒創科技:無法與服務器建立安全連接怎么解決?

在使用互聯網服務時&#xff0c;有時會出現無法與服務器建立安全連接的問題&#xff0c;此錯誤消息通常出現在嘗試訪問需要安全連接的網站(例如使用 HTTPS 的網站)時&#xff0c;這可能是由于多種原因造成的&#xff0c;以下是一些常見的解決方法&#xff0c;幫助你解決問題。 …

聚道云軟件連接器:打通易快報與保融資金系統,實現高效財務管理

一、客戶介紹&#xff1a;食品企業&#xff0c;引領健康零食新風尚 某食品行業的公司作為國內領先的集研發、生產、銷售為一體的現代化辣味休閑食品企業。該公司秉承“健康、美味、安全”的理念&#xff0c;不斷創新和進取&#xff0c;為消費者帶來了一系列美味可口的辣味休閑…

msvcp100.dll丟失怎樣修復?幾種快速有效修復msvcp100.dll丟失的方法

在使用電腦時是不是遇到過關于msvcp100.dll丟失文件丟失的情況&#xff1f;出現這樣的情況有什么辦法可以將丟失的msvcp100.dll文件快速恢復&#xff1f;今天的這篇文章就將教大家幾種能夠有效的解決msvcp100.dll丟失問題的方法。 方法一&#xff1a;重啟電腦 重啟電腦是一種簡…

參數高效微調PEFT(三)快速入門LoRA、AdaLoRA

參數高效微調PEFT(三)快速入門LoRA、AdaLoRA 我們已經了解了HuggingFace中peft庫的幾種高效微調方法。 參數高效微調PEFT(一)快速入門BitFit、Prompt Tuning、Prefix Tuning 參數高效微調PEFT(二)快速入門P-Tuning、P-Tuning V2 今天我們繼續了解大火的高效微調方法LoRA以及…

MyBatis基礎理解教程,詳細分步基礎查詢表數據練習(通俗易懂、實時更新)

一、MyBatis是什么 MyBatis 是一個持久層框架&#xff0c;簡化JDBC開發&#xff0c;它提供了一個從 Java 應用程序到 SQL 數據庫的橋梁&#xff0c;用于數據的存儲、檢索和映射。MyBatis 支持基本的 SQL 操作、高級映射特性以及與 Maven 等構建工具的集成。 二、持久層是什么…

IDEA增加.gitignore文件后的處理

IDEA增加 .gitignore 文件后&#xff0c;但還是被 git 跟蹤了。 我的文件已經被添加到 .gitignore 中&#xff0c;但仍然被 Git 跟蹤&#xff0c; 文件被修改后commint中就會存在此文件。 原因: 文件已經被提交過了 如果文件在添加到 .gitignore 之前已經被提交到 Git 倉庫中,…

Spring boot集成通義千問大模型

Spring boot集成通義千問大模型 背景 我在用idea進行java開發時發現了通義靈碼這款免費的智能代碼補全插件&#xff0c;用了一段時間了&#xff0c;感覺很不錯。就想著在自己的項目中也能集成通義千問大模型實現智能回答&#xff0c;畢竟對接openai需要解決網絡問題&#xff…

戰略合作 | 竹云賦能雁塔區數字經濟高質量發展

2024年5月30日&#xff0c;由西安市數據局指導&#xff0c;中共西安市雁塔區委、西安市雁塔區人民政府主辦的 “雁塔區企業數字化轉型發展大會” 在西安開幕。 本次活動以“數智雁塔&#xff0c;引領未來”為主題&#xff0c;特邀業內150余位政府、數字化服務企業、傳統行業企…