1 系統(tǒng)原理圖
2 現(xiàn)象
當(dāng)按鍵Key1被按下時,LCD1602顯示的數(shù)值加1,每按下一次,自增1;當(dāng)按鍵Key2被按下時,LCD1602顯示的數(shù)值自減1;當(dāng)按鍵Key3被按下時,單片機將LCD1602顯示的數(shù)值保存在AT24C02中,掉電不丟失;當(dāng)按鍵Key4被按下時,單片機從AT24C02中讀取數(shù)據(jù),并顯示在LCD1602。
3 參考程序
(1)主函數(shù)
#include #include 'delayms.h' #include 'key.h' #include 'lcd1602.h' #include 'at24c02.h' unsigned char KeyNum; unsigned int Num; void main() { LCD1602_Init(); LCD1602_ShowNum(1,1,Num,5); while(1) { KeyNum=key(); if(KeyNum==1) //K1按鍵,Num自增 { Num++; LCD1602_ShowNum(1,1,Num,5); } if(KeyNum==2) //K2按鍵,Num自減 { Num--; LCD1602_ShowNum(1,1,Num,5); } if(KeyNum==3) //K3按鍵,向AT24C02寫入數(shù)據(jù) { AT24C02_WriteByte(0,Num%256); delayms(5); AT24C02_WriteByte(1,Num/256); delayms(5); LCD1602_ShowString(2,1,'Write is OK'); delayms(1000); LCD1602_ShowString(2,1,' '); } if(KeyNum==4) //K4按鍵,從AT24C02讀取數(shù)據(jù) { Num=AT24C02_ReadByte(0); Num|=AT24C02_ReadByte(1)<<8; LCD1602_ShowNum(1,1,Num,5); LCD1602_ShowString(2,1,'Read is OK'); delayms(1000); LCD1602_ShowString(2,1,' '); } } } (2)I2C函數(shù) #ifndef _i2c_h_ #define _i2c_h_ void I2C_Start(void); void I2C_Stop(void); void I2C_SendByte(unsigned char Byte); unsigned char I2C_ReceiveByte(void); void I2C_SendAck(unsigned char AckBit); unsigned char I2C_ReceiveAck(void); #endif #include sbit I2C_SCL=P2^1; sbit I2C_SDA=P2^0; /** * @brief I2C通信開始 * @param 無 * @retval 無 */ void I2C_Start(void) { I2C_SCL=1; //空閑狀態(tài) I2C_SDA=1; //空閑狀態(tài) I2C_SDA=0; I2C_SCL=0; } /** * @brief I2C通信結(jié)束 * @param 無 * @retval 無 */ void I2C_Stop(void) { I2C_SDA=0; I2C_SCL=1; //回到空閑狀態(tài) I2C_SDA=1; //回到空閑狀態(tài) } /** * @brief I2C主機向從機發(fā)送一個字節(jié),SCL為同步信號,低電平寫數(shù)據(jù) * @param Byte 要發(fā)送的字節(jié) * @retval 無 */ void I2C_SendByte(unsigned char Byte) { unsigned char i; for(i=0;i<8;i++) //一個字節(jié),8bit { I2C_SDA=Byte&(0x80>>i); //SCL為低電平,主機為發(fā)送器,寫數(shù)據(jù) I2C_SCL=1; //SCL為高電平,從機為接收器,讀數(shù)據(jù) I2C_SCL=0; //時序要求,51單片機速度比較慢 } } /** * @brief I2C主機接收從機一個字節(jié),SCL為同步信號,高電平讀數(shù)據(jù) * @param 無 * @retval 接收到的一個字節(jié)數(shù)據(jù) */ unsigned char I2C_ReceiveByte(void) { unsigned char i,Byte=0x00; I2C_SDA=1; //主機釋放數(shù)據(jù)線SDA for(i=0;i<8;i++) { I2C_SCL=1; //主機作為接收器 if(I2C_SDA) Byte|=(0x80>>i); //讀數(shù)據(jù) I2C_SCL=0; //從機作為發(fā)送器,寫數(shù)據(jù) } return Byte; } /** * @brief I2C主機發(fā)送應(yīng)答 * @param AckBit 應(yīng)答位,0為應(yīng)答,1為非應(yīng)答 * @retval 無 */ void I2C_SendAck(unsigned char AckBit) { I2C_SDA=AckBit; I2C_SCL=1; I2C_SCL=0; } /** * @brief I2C主機接收應(yīng)答位 * @param 無 * @retval 接收到的應(yīng)答位,0為應(yīng)答,1為非應(yīng)答 */ unsigned char I2C_ReceiveAck(void) { unsigned char AckBit; I2C_SDA=1; I2C_SCL=1; AckBit=I2C_SDA; I2C_SCL=0; return AckBit; } (3)AT24C02函數(shù) #ifndef _at24c02_h_ #define _at24c02_h_ void AT24C02_WriteByte(unsigned char WordAddress,Data); unsigned char AT24C02_ReadByte(unsigned char WordAddress); #endif #include #include 'i2c.h' #define AT24C02_ADDRESS 0xA0 /** * @brief AT24C02寫入一個字節(jié) * @param WordAddress 要寫入字節(jié)的地址 * @param Data 要寫入的數(shù)據(jù) * @retval 無 */ void AT24C02_WriteByte(unsigned char WordAddress,Data) { I2C_Start(); I2C_SendByte(AT24C02_ADDRESS); I2C_ReceiveAck(); I2C_SendByte(WordAddress); I2C_ReceiveAck(); I2C_SendByte(Data); I2C_ReceiveAck(); I2C_Stop(); } /** * @brief AT24C02讀取一個字節(jié) * @param WordAddress 要讀出字節(jié)的地址 * @retval 讀出的數(shù)據(jù) */ unsigned char AT24C02_ReadByte(unsigned char WordAddress) { unsigned char Data; I2C_Start(); I2C_SendByte(AT24C02_ADDRESS); I2C_ReceiveAck(); I2C_SendByte(WordAddress); I2C_ReceiveAck(); I2C_Start(); I2C_SendByte(AT24C02_ADDRESS|0x01); I2C_ReceiveAck(); Data=I2C_ReceiveByte(); I2C_SendAck(1); I2C_Stop(); return Data; } (4)LCD1602函數(shù) #ifndef __LCD1602_H__ #define __LCD1602_H__ void LCD1602_WriteCommand(unsigned char Command); void LCD1602_WriteData(unsigned char Data); void LCD1602_Init(void); void LCD1602_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char); void LCD1602_ShowString(unsigned char Line,unsigned char Column,unsigned char *String); void LCD1602_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); void LCD1602_ShowSignedNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); void LCD1602_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); void LCD1602_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length); #endif #include #include 'intrins.h' //引腳配置,硬件原理圖,普中A2 sbit LCD1602_RS = P2^6; sbit LCD1602_RW = P2^5; sbit LCD1602_E = P2^7; #define LCD1602_DATAPORT P0 /** * @brief LCD1602延時函數(shù) * @param xms=1, 延時1ms * @retval 無 */ void LCD1602_Delayms(unsigned char xms) //@11.0592MHz { unsigned char i, j,k; for(k=0;k _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } } /** * @brief LCD1602寫命令,時序圖 * @param Command 要寫入的命令 * @retval 無 */ void LCD1602_WriteCommand(unsigned char Command) { LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DATAPORT = Command; LCD1602_E = 1; LCD1602_Delayms(1); //延時1ms LCD1602_E = 0; LCD1602_Delayms(1); //延時1ms } /** * @brief LCD1602寫數(shù)據(jù),時序圖 * @param Data 要寫入的數(shù)據(jù) * @retval 無 */ void LCD1602_WriteData(unsigned char Data) { LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DATAPORT = Data; LCD1602_E = 1; LCD1602_Delayms(1); //延時1ms LCD1602_E = 0; LCD1602_Delayms(1); //延時1ms } /** * @brief LCD1602初始化函數(shù) * @param 無 * @retval 無 */ void LCD1602_Init(void) { LCD1602_WriteCommand(0x38); //0011_1000 功能設(shè)置,設(shè)置16x2顯示,5x7點陣,8位數(shù)據(jù)接口 LCD1602_WriteCommand(0x0C); //0000_1100 顯示開關(guān)控制,顯示開,光標(biāo)關(guān),閃爍關(guān) LCD1602_WriteCommand(0x06); //0000_0110 輸入方式設(shè)置,數(shù)據(jù)寫后,AC自動加一,畫面不動 LCD1602_WriteCommand(0x01); //0000_0001 清屏,數(shù)據(jù)指針清零、所有顯示清零 } /** * @brief LCD1602設(shè)置光標(biāo)位置 * @param Line 行位置,范圍:1~2 * @param Column 列位置,范圍:1~16 * @retval 無 */ void LCD1602_SetCursor(unsigned char Line,unsigned char Column) { if(Line == 1) { LCD1602_WriteCommand(0x80|(Column-1)); //設(shè)置要存入數(shù)據(jù)的DDROM地址,第一行地址 } else { LCD1602_WriteCommand(0x80|(Column-1)+0x40); //設(shè)置要存入數(shù)據(jù)的DDROM地,第二行地址 } } /** * @brief 在LCD1602指定位置上顯示一個字符 * @param Line 行位置,范圍:1~2 * @param Column 列位置,范圍:1~16 * @param Char 要顯示的字符 * @retval 無 */ void LCD1602_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char) { LCD1602_SetCursor(Line,Column); LCD1602_WriteData(Char); } /** * @brief 在LCD1602指定位置上顯示所給字符串 * @param Line 行位置,范圍:1~2
上一篇:數(shù)字秒表+普中51單片機+江科大自化協(xié)
下一篇:蜂鳴器播放音樂+普中51單片機+江科大自化協(xié)
推薦閱讀最新更新時間:2025-06-07 23:39



設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- ?意法半導(dǎo)體大巴窯工廠落地創(chuàng)新冷卻系統(tǒng),提升可持續(xù)發(fā)展能力
- Nordic Semiconductor聯(lián)同Omnispace和Gatehouse Satcom完成5G NB-IoT衛(wèi)星演示
- 英偉達開啟“攻城略地”模式,擬在歐洲建設(shè)20座AI工廠
- 臺積電:日本JASM第二晶圓廠預(yù)計今年下半年動工
- 工信部:支持車企“60天賬期”承諾,促進產(chǎn)業(yè)健康發(fā)展
- 全球十大芯片代工廠最新排名!中芯國際沖擊世界第二
- 未來數(shù)字化工廠:重塑制造業(yè)格局
- 面對快速演進的 GenAI 模型,Gartner發(fā)布中國企業(yè)需做出的三項基礎(chǔ)設(shè)施關(guān)鍵決策
- 摩爾斯微電子與成都惠利特攜手合作,利用 Wi-Fi HaLow革新物聯(lián)網(wǎng)的連接
- 羅克韋爾自動化推出 PharmaSuite 12.00,加速實現(xiàn)安全、可擴展的部署