文章目錄
- 前言
- 一、代碼模塊化是什么?
- 二、使用步驟
- 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); }}
總結
這是一種比較簡單的封裝方法,會引發一些問題,但是能用,有空看看進一步怎么優化