LCD_1602, 學過單片機的朋友們都知道它了吧,可以說是用的最廣,最簡單,也是學液晶入門級別的一塊液晶了。LCD1602顧名思義就是兩行顯示的液晶,每行最多顯示16個字符(里面總共有160個字符),其中包括阿拉伯數字、英文字母的大小寫,常用符號,及日文的假名!每個字符對應一個ASCII碼,我們通過向液晶送相應符號的ASCII碼來顯示這個字符。
0x00:第一個(0x40) 0x01:第二個(0x48) 0x02:第三個(0x50) 0x03:第四個(0x58) 0x04:第五個(0x60) 0x05:第六個(0x68) 0x06:第七個(0x70) 0x07:第八個(0x78)
具體的流程是這樣的:“顯示字符的數組數據”--->"定義第幾個自定義字符"--->“像地址中發送數組數據”--->“規定顯示位置”--->“顯示第幾個自定義字符”--->OK!
自己想顯示什么字符或圖像可以自己計算一下對應的數組數據,最好自己弄一個取模軟件比較好,我一開始都是自己算的,感覺好麻煩。
/***** 下面我寫一個用51驅動LCD1602的程序 *****/
接口方面根據自己的實際電路決定。程序的完整版本下載: http://m.zg4o1577.cn/f/1602cc.rar
/* 這里是我自己的經驗:在數據手冊中說下降沿寫入命令,但是我用上升沿寫入也是好使的,這里我還是用下降沿吧;下面這條是重點,自習看下你板子上的晶振大小,最好是在下程序的時候看下具體大小事多少,如果你的晶振>11.5M的話最好在下面我標注的地方加延時,不然很可能什么都不顯示,而且找不到錯誤。 */
#include<reg52.h> sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2;//LCD的三個控制端 unsigned char table[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A}; void delay(unsigned int i) { while(--i); } void Read_busy() //忙檢測,DB7為1則busy,不能進行讀寫操作 ;每次讀寫前應"讀忙"檢測 { P0=0x00; RS=0; RW=1; EN=1; while(P0 & 0x80); EN=0; } void write_LCD_command(unsigned char value)//寫命令函數 { Read_busy(); RS=0; RW=0; EN=1; P0=value; delay(100); EN=0; } void write_LCD_data(unsigned char value)//寫命令函數 { Read_busy(); RS=1; RW=0; EN=1; P0=value; delay(100); EN=0; } void init_LCD() { write_LCD_command(0x38); //在這里加延時 delay(5); write_LCD_command(0x0c);//開顯示,不顯示光標,且不閃爍 //在這里加延時 delay(5); write_LCD_command(0x06);//每次寫入數據后地址指針加1 //在這里加延時 delay(5); write_LCD_command(0x01);//清屏 } void main() { unsigned char num; init_LCD(); write_LCD_command(0x40); //對CGRAM第一個自定義字符操作,若是第二個則為0x48,其次類推(上面有對頂的關系) for(num=0;num<8;num++) { write_LCD_data(table[num]); } write_LCD_command(0x80); //規定顯示在第一行第一個位置 write_LCD_data(0x00); //顯示第一個自定義字符 (0x40對應第一個:0x00) while(1); } /*到這里程序結束了,第一次寫可能說的不夠清晰,有不懂的可以留言給我^_^*/