第一次寫教程哈,多多包涵/羞射 先介紹下lcd1602芯片,LCD1602 分為帶背光和不帶背光兩種,基控制器大部分為 HD44780,帶背光的比不帶背光的厚,是否帶背光在應用中并無差別. 字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點陣式LCD,目前常用16*1,16*2,20*2和40*2行等的模塊。lcd1602即為1602字符型液晶顯示器為例,介紹其用法。一般1602字符型液晶顯示器實物如圖所示。 正面
背面
LCD1602主要技術參數(shù): 顯示容量:16×2個字符 芯片工作電壓:4.5—5.5V 工作電流:2.0mA(5.0V) 模塊最佳工作電壓:5.0V 字符尺寸:2.95×4.35(W×H)mm 引腳功能說明 LCD1602采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表所示: 各引腳接口
第1腳:VSS為地電源。 第2腳:VDD接5V正電源。 第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。 第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。 第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。 第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。 第15腳:背光源正極。 第16腳:背光源負極。
LCD地址映射圖
注釋:1602為2行16列,屏幕所能顯示的地址為00H~0FH(第一行),40H~4FH(第二行),其他地址可以存儲待顯示的數(shù)據(jù)。這就給我們的花樣顯示提供了條件哈:-D
運行時序圖:
注釋:這里的讀操作指的是C51讀1602的總線數(shù)據(jù),RS=0,RW=1的時候,E給高電平則可以讀到顯示屏的狀態(tài),這個功能一般用于讀忙,除了初始化之外,每次對1602進行讀寫操作都要讀忙檢測,當總線最高為STAD7=1則為繁忙,禁止讀寫操作。
注釋:這里指的是C51往1602寫數(shù)據(jù)/命令,通過使能E的高脈沖寫入,在E的下降沿就執(zhí)行寫入的命令或者顯示寫入的數(shù)據(jù)。
接下來簡要介紹下1602的相關指令 指令表(詳細命令請查閱相關手冊)
常用命令 :0x80+0xdd:dd為地址,這條命令用于設置顯示起點坐標 0x0c :開顯示,無光標,光標不閃爍 。一般做帶鍵盤輸入的才加入光標,如計算器。常用的計量顯示不顯示光標。 0x06 :寫一個數(shù)據(jù),地址指針加1,由1602地址表可以看出,實際上就是設置成從左往右寫數(shù)據(jù)而已。 0x38 : 設置顯示模式,16x2顯示 5x7點陣,8位數(shù)據(jù)接口。端口不夠用時,這個命令也可以換用4位數(shù)據(jù)接口的。 0x01 :清屏。
電路連接圖: 這里用的帶背光的1602
接下來寫相關子程序: //寫入命令子函數(shù) void LcdWriteCom(unsigned char com) { LCD_RS=0; LCD_RW=0; LCD_GPIO=com; delay1ms(1); LCD_E=1; delay1ms(1); LCD_E=0; } //寫入數(shù)據(jù)子函數(shù) void LcdWriteData(unsigned char dat) { LCD_RS=1; LCD_RW=0; LCD_GPIO=dat; delay1ms(1); LCD_E=1; delay1ms(1); LCD_E=0; } //讀忙子函數(shù) bit LCD_bz(void) { bit bz; LCD_RS=0; LCD_RW=1; LCD_E=1; delay1ms(10); P0=0xff; //C51單片機讀引腳要先置高電平,原因不贅述,很多資料沒有這一步驟,大家格外注意下 bz=(bit)(LCD_GPIO&0x80); LCD_E=0; return bz; }
//延時子程序 void delay1ms(unsigned int t) { unsigned int i,j; //節(jié)約內(nèi)存起見,建議用uchar,由于后面要做動態(tài)顯示,為了滿足顯示效果,這里用了uint for(i=0;i { for(j=0;j<300;j++); } } //初始化顯示屏程序 void LcdInit() { LcdWriteCom(0x38);//顯示模式2行16列 LcdWriteCom(0x0c);//開顯示 無光標 不閃爍 LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏 LcdWriteCom(0x80);//設置(0,0)為起點 }
主程序: //我們要把第一行做成一個16字符固定顯示,第二行做成滾動顯示25字符 //這里采用的是1602指針右移的基礎命令而不是整屏右移命令
#include #define LCD_GPIO P0 void LcdWriteCom(unsigned char); //寫入命令子函數(shù)聲明 void LcdWriteData(unsigned char);//寫入數(shù)據(jù)子函數(shù)聲明 void LcdInit();//顯示屏初始化子函數(shù)聲明 void delay1ms(unsigned int);//延時函數(shù)聲明 bit LCD_bz(void);//讀忙函數(shù)聲明 sbit LCD_RW=P2^5; sbit LCD_RS=P2^6; sbit LCD_E=P2^7; unsigned char displayDate1[]=" I'm Cesar ";//一共16個字符(包括空格在內(nèi)) unsigned char displayDate2[]=" Please add QQ775222573 ";//一共25個字符 void main(void) { unsigned char i=0,j=0,n=0; LcdInit(); LcdWriteCom(0x80);//設置坐標為第一行第一個字符 for(i=;i<16;i++) { LcdWriteData(displayDate1[ i]); } while(1)
{ if(LCD_bz()) continue;//讀忙,結(jié)束本次循環(huán)
LcdWriteCom(0x80+0x40);//設置第二行第一個字符起點 for(j=n;j<25+n;j++)//我們沒有進行整屏右移,但是我們進行了數(shù)組右移O(∩_∩)O~ { LcdWriteData(displayDate2[j]); } n++;//數(shù)組的顯示起點右移,這樣實現(xiàn)了滾動 if(n>=(25-15))//當顯示移到最右邊時,停頓片刻,返回起點再次循環(huán) { n=0; delay1ms(2000); } delay1ms(600); } } 下載到C51調(diào)試結(jié)果:
好了,本次教程結(jié)束,寫了一個上午,吃飯去了/(ㄒoㄒ)/~~。 |