本帖最后由 nklug 于 2018-4-5 11:36 編輯
看懂時(shí)序圖,驅(qū)動(dòng)LCD1602液晶屏 作者:贛州 盧剛(nklug) [本人原創(chuàng),轉(zhuǎn)載請(qǐng)保留署名。2018年4月2日] 網(wǎng)購(gòu)了幾個(gè)LCD1602液晶屏,用STC驅(qū)動(dòng)它,開(kāi)始只是一個(gè)點(diǎn)亮了的藍(lán)屏,不見(jiàn)字符,費(fèi)了一番功夫才成功顯示出字符,F(xiàn)將驅(qū)動(dòng)LCD1602液晶屏的經(jīng)驗(yàn)總結(jié)如下,希望對(duì)初次使用的朋友有所幫助。 驅(qū)動(dòng)液晶屏,按下列步驟進(jìn)行: 1、 把的R/W接地(原因后述),調(diào)節(jié)對(duì)比度,使屏顯出一行白色矩形塊。
對(duì)比度調(diào)整.png (4.06 KB, 下載次數(shù): 72)
下載附件
調(diào)對(duì)比度
2018-4-2 11:05 上傳
我開(kāi)始的不成功,是省了V0接的電阻,讓它空著,以為也能顯示字符,只不過(guò)不好看罷了,不知大錯(cuò)特錯(cuò)。記著一定要接V0腳的調(diào)節(jié)對(duì)比度電阻并調(diào)試好,否則只是藍(lán)屏,不出字也不出矩形塊。調(diào)整對(duì)比度有兩種方法,介紹較多的是第一種標(biāo)準(zhǔn)接法,可調(diào)電阻用10K的。第二種接法據(jù)自己的實(shí)驗(yàn),R可用510歐(最后調(diào)試成功后改用3.3K)。
這一步目的是讓它顯示出一行淺白色矩形塊,注意無(wú)須太亮。
一行.png (3.07 MB, 下載次數(shù): 99)
下載附件
一行
2018-4-2 10:59 上傳
1602液晶屏只要加上了電壓,調(diào)整好對(duì)比度,沒(méi)接單片機(jī)也能顯示出一行矩形塊,只有初始化后才會(huì)出現(xiàn)兩行。利用這點(diǎn)可作液晶屏好壞的初步判斷。 2、 設(shè)置顯示模式,讓液晶屏顯示出兩行白色矩形塊。(實(shí)質(zhì)是寫好寫命令的子程序。)
IMG_20180329_153124.jpg (1.14 MB, 下載次數(shù): 73)
下載附件
兩行
2018-4-2 11:00 上傳
通常推薦的初始化過(guò)程: 延時(shí)15ms 寫指令38H 延時(shí)5ms 寫指令38H 延時(shí)5ms 寫指令38H 延時(shí)5ms (以上都不檢測(cè)忙信號(hào)) (以下都要檢測(cè)忙信號(hào)) 寫指令38H ———————— 寫指令08H關(guān)閉顯示 寫指令01H顯示清屏 寫指令0cH顯示開(kāi)及光標(biāo)設(shè)置 完畢 我們讓程序完成四次寫38H指令就停下來(lái),后四步暫不執(zhí)行。只要四次寫指令38H成功,液晶屏就會(huì)出現(xiàn)兩行矩形塊。為什么要四次呢?不清楚。就照他的辦好了。 能出現(xiàn)兩行矩形塊,說(shuō)明寫指令的子程序是正確的,后面的事也就好辦了。若不成功,則對(duì)照1602屏的寫操作時(shí)序,仔細(xì)修改程序。我開(kāi)始的不成功,第二個(gè)原因就是沒(méi)弄清時(shí)序,胡亂寫沒(méi)成功就生搬硬套網(wǎng)上程序。 1602屏寫操作的時(shí)序圖:
時(shí)序.jpg (44.18 KB, 下載次數(shù): 95)
下載附件
時(shí)序
2018-4-2 11:03 上傳
時(shí)序時(shí)間參數(shù):
參數(shù).jpg (36.05 KB, 下載次數(shù): 93)
下載附件
參數(shù)
2018-4-2 11:03 上傳
從時(shí)序圖確定子程序步驟如下:①為RS和R/W賦值;②為D0~D7數(shù)據(jù)口賦值,延時(shí)后再設(shè)置E;③將E置高電平,E=1;延時(shí)tpw;④將E清零,產(chǎn)生重要的執(zhí)行下降沿;⑤下降沿后要延時(shí)tHD2,確保數(shù)據(jù)口在這段時(shí)間內(nèi)不變;⑥依靠子程序以后的延時(shí),來(lái)滿足E信號(hào)周期最小值tc。 我用STC12C5201AD 6M晶振驅(qū)動(dòng)1602屏,根據(jù)每步程序所要用的時(shí)間和時(shí)序要求,寫的代碼如下,實(shí)際運(yùn)行通過(guò)。 ;***************************** ;1602寫命令,命令存在LCD_DAT, ;***************************** PR_CMD: CLR LCD_RS ; ①為RS和R/W賦值 CLR LCD_RW ;實(shí)際上R/W腳接地了,此句可無(wú) MOV LCD_DATA,LCD_DAT ; ②為D0~D7數(shù)據(jù)口賦值
SETB LCD_EN ;③將E置高電平 NOP ;延時(shí) CLR LCD_EN ; ④將E清零,產(chǎn)生重要的下降沿 lcall uS40 ;⑤下降沿后延時(shí) RET 將38H改為34H,是一行5*10模式,顯示如下圖:
IMG_20180329_153427.jpg (1.35 MB, 下載次數(shù): 90)
下載附件
一行5*10
2018-4-2 11:08 上傳
3、 完成初始化程序的后四步。 資料說(shuō)寫指令38H后,后面的每步都要檢測(cè)忙信號(hào)。因?yàn)?602屏是個(gè)慢性子,上步?jīng)]執(zhí)行完就來(lái)下一步,下一步就執(zhí)行不了。我這樣想,若上一步?jīng)]完成,則檢忙這步也應(yīng)該不能運(yùn)行,檢忙能運(yùn)行則上一步定是已經(jīng)完成了。很多人說(shuō)是用延時(shí)替代檢忙。我呢?用延時(shí)1mS來(lái)代替檢忙。 不讀讀忙信號(hào),也不讀數(shù)據(jù)了(不用命令9和命令11),則可直接將R/W接地,還可省一根接線。這就是第一步把R/W接地的原因。 我的初始化過(guò)程: 延時(shí)15ms 寫指令38H 延時(shí)5ms 寫指令38H 延時(shí)5ms 寫指令38H 延時(shí)5ms 寫指令38H 延時(shí)1mS 寫指令08H關(guān)閉顯示 延時(shí)1mS 寫指令01H顯示清屏 延時(shí)1mS 延時(shí)1mS 寫指令0cH顯示開(kāi)及光標(biāo)設(shè)置 延時(shí)1mS 完畢 后面的五步都將原來(lái)的檢測(cè)忙改為延時(shí),試驗(yàn)結(jié)果延時(shí)160uS不夠,延時(shí)1mS至5mS都行,其余沒(méi)試。 我試驗(yàn)過(guò),整個(gè)初始化過(guò)程中,只用第一步寫38H指令和最后一步寫指令0CH也可以,中間六步省去也行。為保險(xiǎn)其見(jiàn),仍寫八個(gè)指令。 4、 顯示字符。 寫數(shù)據(jù)子程序與寫命令子程序基本相同,僅R/S的值不同。運(yùn)行本子程序前先延時(shí)1mS,確保前一步運(yùn)行已經(jīng)完成。 ;***************************** ;1602寫數(shù)據(jù),數(shù)據(jù)存在LCD_DAT ;***************************** PR_DATA: SETB LCD_RS ;RS高 數(shù)據(jù) CLR LCD_RW ; 實(shí)際上R/W腳接地了,此句可無(wú) MOV LCD_DATA,LCD_DAT
SETB LCD_EN ;先置高 nop ;延時(shí) CLR LCD_EN ;產(chǎn)生下降沿 執(zhí)行 lcall us40 RET 寫字符成功,屏的白色塊上就會(huì)出現(xiàn)更亮的字符,所以調(diào)對(duì)比度時(shí)白色塊不要調(diào)得太亮了。
塊上字.png (4.82 MB, 下載次數(shù): 91)
下載附件
塊上字
2018-4-2 11:08 上傳
5、 再次調(diào)整對(duì)比度。 調(diào)v0腳上的電阻,使得白色塊消失,只留下的清晰字符。我原是用一個(gè)510歐電阻接地,現(xiàn)改為用一個(gè)3.3K電阻接地。若是用第一種接法,旋轉(zhuǎn)一下中間觸點(diǎn)位置就行了。 液晶屏A,K分別接電源正負(fù)點(diǎn)亮背景燈,可在電源正與A之間串一個(gè)10~15歐電阻,適當(dāng)降低點(diǎn)亮度,延長(zhǎng)燈壽命。 這是試驗(yàn)程序顯示了幾個(gè)字母的樣子:
字符.png (1.98 MB, 下載次數(shù): 104)
下載附件
字符
2018-4-2 11:09 上傳
6、 總結(jié):先設(shè)置好硬件(顯出白色矩形塊),再把握好時(shí)序?qū)懗绦颉?/div> 能顯示字符,自然也就能在實(shí)際應(yīng)用中顯示時(shí)間電壓之類的數(shù)據(jù)了。 7、 我的試驗(yàn)程序: - ;STC12C5201AD6M晶體 驅(qū)動(dòng)LCD1602屏
- ;作者:贛州 盧剛(nklug)
- ;2018年3月
- ;*******************
- ;端口引腳定義
- LCD_RS BIT P2.6 ;1602數(shù)據(jù)命令選擇端口
- LCD_RW BIT P2.7 ;1602讀寫選擇端口
- LCD_EN BIT P3.7 ;1602使能端口
- LCD_DATA EQU P1 ;1602數(shù)據(jù)端口
- ;變量聲明
- ALL_FLAG EQU 20H ;標(biāo)志位
- LCD_FLAG EQU ALL_FLAG.7 ;1602讀忙標(biāo)志位
- LCD_DAT EQU 30H ;1602數(shù)據(jù)命令字
- DELAYED EQU 31H ;延時(shí)字
- ORG 0000H
- SJMPSTART
- ORG 0030H
- START:
- lcall LCD_INIT ;初始化液晶
- lcall uS160
- MOV lcd_dat,#84H ;寫在何位置
- lcall PR_CMD
- mov 50H,#3
- lcall uS160
- mov LCD_DAT,#01101110B ;字母n的代碼
- lcall PR_DATA
- lcall uS160
- mov LCD_DAT,#01101011B ;字母k的代碼
- lcall PR_DATA
- lcall uS160
- mov LCD_DAT,#01101100B ;字母l的代碼
- lcall PR_DATA
- lcall uS160
- mov LCD_DAT,#01110101B ;字母u的代碼
- lcall PR_DATA
- lcall uS160
- mov LCD_DAT,#01100111B ;字母g的代碼
- lcall PR_DATA
- AJMP $
- ;***************
- ;1602初始化
- ;***************
- LCD_INIT:
- MOV DELAYED,#15
- LCALL DELAY1MS
- MOV LCD_DAT,#38H
- LCALL PR_CMD
- MOV DELAYED,#5
- LCALL DELAY1MS
- MOV LCD_DAT,#38H
- LCALL PR_CMD
- MOV DELAYED,#5
- LCALL DELAY1MS
- MOV LCD_DAT,#38H ;上三次下一次設(shè)38H,在運(yùn)行過(guò)多次的片子試過(guò)僅用第一次設(shè)38H也是可以的。
- LCALL PR_CMD ;估計(jì)這是多次初始化后的原故,為保險(xiǎn)還是這樣多次的設(shè)置38H好。
- ;*****上面要重復(fù)3次*****
- ;*****下面設(shè)置的間隔若用延時(shí)160uS則不行,用1mS至5mS都可****
- MOV DELAYED,#1
- LCALL DELAY1MS
- ; LCALL uS160
- MOV LCD_DAT,#38H ;#00111000B 使用8位數(shù)據(jù),顯示兩行,使用5×7的字型
- LCALL PR_CMD
- MOV DELAYED,#1
- LCALL DELAY1MS
- ; LCALL uS160
- MOV LCD_DAT,#08H ;顯示關(guān)無(wú)光標(biāo) 光標(biāo)閃 無(wú)也可以
- LCALL PR_CMD
- MOV DELAYED,#1
- LCALL DELAY1MS
- ; LCALL uS160
- MOV LCD_DAT,#01H ;#00000001H ;清屏 無(wú)也可以
- LCALL PR_CMD
- MOV DELAYED,#1
- LCALL DELAY1MS
- ; LCALL uS160
- MOV LCD_DAT,#06H ;;字符不動(dòng),光標(biāo)自動(dòng)右移一格 無(wú)也可以
- LCALL PR_CMD
- MOV DELAYED,#1
- LCALL DELAY1MS
- ; LCALL uS160
- MOV LCD_DAT,#00001100B ;顯示器開(kāi),無(wú)光標(biāo)
- LCALL PR_CMD
- RET
- ;*******************************
- ;1602寫數(shù)據(jù),數(shù)據(jù)存在LCD_DAT
- ;*******************************
- PR_DATA:
- SETB LCD_RS ;RS高 數(shù)據(jù)
- CLR LCD_RW ;RW低 寫
- MOV LCD_DATA,LCD_DAT
-
- SETB LCD_EN ;先置高
- nop ;延時(shí)
- CLR LCD_EN ;產(chǎn)生下降沿 執(zhí)行
- lcall us40
- RET
- ;********************************
- ;1602寫命令,命令存在LCD_DAT
- ;*******************************
- PR_CMD:
- CLR LCD_RS
- CLR LCD_RW
- MOV LCD_DATA,LCD_DAT
-
- SETB LCD_EN ;先置高
- NOP
- CLR LCD_EN
- lcall uS40
- RET
- ;;*****************************************
- ;延時(shí),延時(shí)時(shí)間=1毫秒*次數(shù) 次數(shù)在DELAYED
- ;*****************************************
- DELAY1MS: ;6.000MHz 1ms
- mov R7,#6
- D_1:mov R6,#200
- D_2: djnzR6,D_2
- djnz R7,D_1
- djnz DELAYED,DELAY1MS
- ret
- ;***********
- ;160uS延時(shí)
- ;***********
- uS160:
- mov 42H,#192
- us160_a:
- djnz 42h,us160_a
- ret
- ;***********
- ;40uS延時(shí)
- ;***********
- uS40:
- mov 42H,#192
- us40_a:
- djnz 42h,us40_a
- ret
- END
復(fù)制代碼
|