![]() |
發布時間: 2017-5-5 10:43
正文摘要:程序如下: #include <reg51.h> #define uint unsigned int #define uchar unsigned char sbit rs=P3^5; sbit rw=P3^6; sbit e=P3^7; uchar table; char en; /*uchar code table1[]="Huan Ying ... |
謝謝分享,我下個學習一下。 |
謝謝分享,我下個學習一下。 |
本帖最后由 zl2168 于 2017-5-7 20:38 編輯 實例67 LCD1602顯示屏顯示 本例編制的LCD 1602顯示程序標準化程度很好,若要顯示其他字符,只需給數組x[16]、y[16]重新賦值即可。 先Proteus仿真一下,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1 。書中電路和程序設計有詳細說明,程序語句條條有注解。 仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。 |
#include <reg51.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char #define lcd_data P0 sbit RS=P2^5; sbit RW=P2^6; sbit E=P2^7; /*uchar code table1[]="Huan Ying Cheng Zuo"; uchar code table2[]="Li Gong Nan Yuan Dao Le"; uchar code table3[]="Li Gong Xue Yuan Dao Le"; uchar code table4[]="Hua ban Qiao Dao Le"; uchar code table5[]="Xie Xie Cheng Zuo"; */ uchar code table1[]="LCD1206 check ok"; uchar code table2[]="study up"; void lcd_w_cmd(unsigned char com); //寫命令字函數 void lcd_w_dat(unsigned char dat); //寫數據函數 unsigned char lcd_r_start(); //讀狀態函數 void lcd_int1(); //LCD初始化函數 void delay (uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void delay1() { _nop_(); _nop_(); _nop_(); } unsigned char lcd_r_start() { unsigned char s; RW=1; //RW=1,RS=0,讀LCD狀態 delay1(); RS=0; delay1(); E=1; //E端時序 delay1(); s=lcd_data; //從LCD的數據口讀狀態 delay1(); E=0; delay1(); RW=0; delay1(); return(s); //返回讀取的LCD狀態字 } //函數名:lcd_w_cmd //函數功能:寫命令字 //形式參數:命令字已存入com單元中 //返回值:無 void lcd_w_cmd(unsigned char com) { unsigned char i; do { // 查LCD忙操作 i=lcd_r_start(); // 調用讀狀態字函數 i=i&0x80; // 與操作屏蔽掉低7位 delay(2); } while(i!=0); // LCD忙,繼續查詢,否則退出循環 RW=0; delay1(); RS=0; // RW=1,RS=0,寫LCD命令字 delay1(); E=1; //E端時序 delay1(); lcd_data=com; //將com中的命令字寫入LCD數據口 delay1(); E=0; delay1(); RW=1; delay(255); } //函數名:lcd_w_dat //函數功能:寫數據 //形式參數:數據已存入dat單元中 //返回值:無 void lcd_w_dat(unsigned char dat) { unsigned char i; do { // 查忙操作 i=lcd_r_start(); // 調用讀狀態字函數 i=i&0x80; // 與操作屏蔽掉低7位 delay(2); } while(i!=0); // LCD忙,繼續查詢,否則退出循環 RW=0; delay1(); RS=1; // RW=1,RS=0,寫LCD命令字 delay1(); E=1; // E端時序 delay1(); lcd_data=dat; // 將dat中的顯示數據寫入LCD數據口 delay1(); E=0; delay1(); RW=1; delay(255); } void lcd_init() { lcd_w_cmd(0x38); // 設置工作方式 lcd_w_cmd(0x0c); // 設置光標 lcd_w_cmd(0x01); // 清屏 lcd_w_cmd(0x06); // 設置輸入方式 lcd_w_cmd(0x80); // 設置初始顯示位置 } void main() { uchar n,m=0; lcd_init(); lcd_w_cmd(0x80); for(m=0;m<16;m++) { lcd_w_dat(table1[m]); delay(200); } while(1) { lcd_w_cmd(0xC4); for(n=0;n<8;n++) { lcd_w_dat(table2[n]); delay(200); } } } 程序附上,你可以看看。我只改變了,使能端,你可以改。 |
1602.png (9.66 KB, 下載次數: 48)
你的主程序不應該寫while(1);等待,還有你1602的各個函數有誤