標(biāo)題: 51單片機初學(xué)之手工玩轉(zhuǎn)12864顯示屏 [打印本頁]
作者: 慢慢思考 時間: 2025-11-30 16:22
標(biāo)題: 51單片機初學(xué)之手工玩轉(zhuǎn)12864顯示屏
本帖最后由 慢慢思考 于 2025-12-1 11:36 編輯
什么叫做手工玩轉(zhuǎn)?就是不要單片機,只要幾個撥碼開關(guān)一個按鈕開關(guān)加幾個電阻,就能在12864屏上顯示出你想要顯示的東西。
看下圖,這個就是已完成的實物,就這點東西哦:
實物圖.jpg (210.62 KB, 下載次數(shù): 0)
下載附件
2025-11-30 15:55 上傳
12864屏能干什么?它能顯示字符包括漢字,也能顯示圖形。
顯示屏嘛,目前為止,都是點陣式的,靠亮滅一個個的點來顯示字符或圖形。12864,就是說它的點陣,是橫向128個點縱向64個點,形成一個矩陣。
這個12864屏屬于單色屏,于是每個點的狀態(tài)參數(shù)只有兩個即亮與不亮,可以標(biāo)記為1與0,所以,對每個點的控制只需一位就夠了,也就是說你輸入一比特即8位數(shù)據(jù)就可以控制8個點。
在它本身的功能設(shè)計上,它有兩種工作模式,一種是字符顯示模式,一個是圖形顯示模式。
所謂字符顯示模式,就是你想讓它顯示一個什么字符,你直接輸入這個字符的編碼就行了,比如你要輸入“2”這個數(shù)字,你查表,它的編碼是十六進制數(shù)0x32,你把這個0x32按12864屏的操作規(guī)定輸入進去就可以顯示出來了。這個屏在字符顯示模式下,它是被設(shè)計成8*4個小方塊的,也就是說它被分成了4行,每行分成8個小方塊,則每個小方塊就是橫向16個點縱向16個點。每個小方塊又被分成了左右兩塊,每塊都可以顯示一個8*16點陣的字符,每個8*16點陣字符由一個8位二進制數(shù)作為這個字符的編碼來控制它的顯示,比如上面說的你要顯示數(shù)字2,則0x32(二進制數(shù)00110010)就是它的完整的編碼值。
所謂圖形顯示模式,就是說若是你要想在屏在顯示什么東西,包括字符,你得先把這個你要顯示的東西變成由許多點組成的圖形,然后你得一個點一個點地去操作點亮它們以在屏幕上顯示出來。
這兩個顯示模式是可以切換的,向顯示屏輸入相關(guān)指令就行了。很重要的一點,這個屏上電復(fù)位后,它的顯示模式是字符模式,也就是說,它上電后你就可以直接使用字符模式了。
好了,我們先來實驗它的字符顯示功能,我們來讓它顯示數(shù)字“2”。
想要使用一種電路模塊,當(dāng)然先得看看它的使用說明書,說明書先看什么?接口啊,看了它,才好先把電路圖搭建起來。
接口表.png (4.66 MB, 下載次數(shù): 0)
下載附件
2025-11-30 15:59 上傳
這個電路這樣搭建:為了增強對它的功能和實現(xiàn)方法的體驗感,也為了讓實驗更加簡單,我們不走尋常路,不用單片機來控制它,而是用撥碼開關(guān)和按鈕開關(guān)來控制。具體電路圖如下:
12864屏手工電路圖.png (1.41 MB, 下載次數(shù): 0)
下載附件
2025-11-30 16:00 上傳
此電路中,開關(guān)KRW的作用是用于告訴該屏我現(xiàn)在是要向你寫入數(shù)據(jù)還是讀取你內(nèi)部的數(shù)據(jù),本電路中開關(guān)的ON位置為寫入;KRS的作用是確定放在數(shù)據(jù)端口的數(shù)據(jù)是命令類數(shù)據(jù)還是即將要顯示的內(nèi)容,開關(guān)ON的位置為命令;KEN的作用是給屏發(fā)信號要求它讀取數(shù)據(jù)口的數(shù)據(jù),撥動開關(guān)放置好數(shù)據(jù)之后,按一下就行了;KDB0~KDB7的作用是改變數(shù)據(jù)端口電位的高低來實現(xiàn)向這個端口上放置我們想要輸入的數(shù)據(jù)的目的,開關(guān)ON位置為置0。
搭建好的電路實物圖已經(jīng)在前面給出了。
電路搭建完成并通電后,首先要調(diào)節(jié)可調(diào)電阻R1以調(diào)節(jié)其對比度到能顯示內(nèi)容,這個要是沒調(diào)節(jié)到位,那是顯示不出內(nèi)容的,那接下來的實驗必然失敗。調(diào)節(jié)的方法是邊調(diào)節(jié)邊肉眼觀察屏幕,如果全屏是均勻一色,那不對,應(yīng)該是可以看到一個個的小方格,它應(yīng)該是128*64個小方格,如下圖就算調(diào)節(jié)到位了:
調(diào)整屏.jpg (292.8 KB, 下載次數(shù): 0)
下載附件
2025-11-30 16:02 上傳
好了,下面我們就開始做實驗了,先試試輸入它的命令,試哪一條呢?這時自然是要查它的指令表了,先看字符模式下的命令表,也就是手冊上說的基本指令表:
基本指令集.png (6.69 MB, 下載次數(shù): 0)
下載附件
2025-12-1 11:36 上傳
我們先前不是說要顯示數(shù)字2么?它的二進制編碼我們已經(jīng)知道是00110010,接下來,我們把撥碼開關(guān)撥到這個狀態(tài),然后KRS開關(guān)為OFF,KRW開關(guān)為ON,完畢,按一下KEN,沒顯示?怎么回事?是我們這個手工實驗的思路不成立么?不慌,再查上述指令表,發(fā)現(xiàn)里面有一個“顯示狀態(tài)開/關(guān)”指令,是不是因為這個指令沒有設(shè)置而導(dǎo)致其不顯示呢?管它呢,試試不就知道了。
這個指令的二進制,已經(jīng)在上述表中寫得很清楚了,全開就是00001111,我們把這個撥碼開關(guān)撥到這個狀態(tài),然后我們看到這個屬于命令類、輸入式,那自然得將KRS改撥到ON位置,再按KEN,好,我們就看到了一個閃爍的白色的方塊,看來我們的思路是沒有問題的。
關(guān)于這個按按鈕輸入數(shù)據(jù)的方法,前面一篇已經(jīng)講過實驗了,在這里能用到這個屏的身上,說明這個屏內(nèi)部應(yīng)該也有個中央控制單元。
接下來,我們再讓數(shù)據(jù)端口處于00110010的狀態(tài),KRS為OFF,再按KEN,2就出來了不是?再按,再按,我們發(fā)現(xiàn),屏幕上會從左到右顯示出一個一個的“2”,然后,一行滿了之后,它跑到第三行去了,然后是才是第二行,然后是第四行。這個,誰的問題?屏幕本身的問題,它的設(shè)計就是這樣的,有點傷腦筋,我們在以后的應(yīng)用中得注意處理這個問題,不然的話,你知道的。
還有,我們在按按鈕時,我們有可能發(fā)現(xiàn)按一下按鈕會出現(xiàn)兩個及以上的“2”,這個問題,就是按鈕的問題了,它可能接觸不良,正宗的說法叫“抖動”,這個抖動,在我們以后的按鍵應(yīng)用程序中,是有相應(yīng)的處理方法的。在這里,我們可以思考一下,在我們進行命令輸入時,這個抖動會不會有什么影響?為什么?然后做實驗來驗證你的判斷。
想試試它能不能輸入漢字么?簡單,查中文字型表(顯示屏手冊后附),隨便查一個字,比如“北”字,編碼十六進制數(shù)是B1B1,換算成二進制數(shù)就是10110001 10110001,然后我們把撥碼開關(guān)調(diào)成10110001狀態(tài),KRS為數(shù)據(jù)狀態(tài),KRW為輸入狀態(tài),完成后按兩下KEN,看,“北”字出來了。
好了,手工控制12864屏算是成功了,接下來,看你的興趣,試一試對“顯示狀態(tài)開/關(guān)”指令改變DB0~DB2的電位狀態(tài)再進行輸入,看看會出現(xiàn)什么現(xiàn)象。其它的指令,你也可以按這個方法一一試試,這個方法,比用單片機去操作,簡單直觀快捷得多。
這里補充一點知識,手冊上沒說清楚的:這個12864屏的設(shè)計,怎么說呢,你把它當(dāng)作一個256*32的點陣屏,然后它被豎向劃了一刀,分成了左右兩個屏,然后設(shè)計者把右邊的那半個屏放在了左半邊屏的下方,組成了一個128*64的屏,所以,我們看到連續(xù)輸入時,它是從第一行跑到了第三行,再去的第二行。這個理解很重要,它不僅關(guān)系到在字符模式下的應(yīng)用,也關(guān)系到其在圖形模式下的應(yīng)用,它直接關(guān)系到要顯示的內(nèi)容的定位問題,也就是在屏幕上的顯示位置問題。
在應(yīng)用這個屏?xí)r,我們想在自己設(shè)想的位置上顯示一個內(nèi)容,就得先知道這個屏在設(shè)計上的定位方式,在字符顯示模式下,我們前面已經(jīng)說了,它是被分成了橫向8縱向4共32個方塊的,也就是說,給它32個地址就可以全部定位了,于是,在設(shè)計上,它采用了一維定位方式,也就是把這32個方塊按排成一行的方式來編排地址,這個字符地址指令的標(biāo)志位是DB7位,也即這DB7位為1時,即表示這條指令后面DB6~DB0([DB6:DB0])為字符的坐標(biāo)值(地址值),顯示屏上左上角的第一個方塊為首個顯示方塊,其地址值為0,加上DB7標(biāo)志位的1值,就是十六進制的80,所以,我們在表上看到在字符模式下,定位首個方塊時,要求輸入的是0x80,而最后一個字符的坐標(biāo)則是0x9F。
這個屏的設(shè)計是很奇特的,前面我們已經(jīng)說過了,它的每個方塊在字符模式下是可以顯示兩個8*16點陣字符的,也就是說每一行它可以顯示16個8*16點陣字符,但它的定位方式在橫向上又只有8個值,那每一塊的第二個字符的定位是怎么確定的呢?首先定位這一個方塊,然后前后兩個字符的編碼連續(xù)輸入,真是有點傷腦筋。
這個在屏的字符模式下的手工控制看來是成功的,做到這里,是不是有那種本來覺得很高大上很神秘的單片機,原來卻是如此的簡單?接下來,你是不是應(yīng)該很有把握地連上單片機去操控它了?在這里提醒一下,連上單片機之后你不一定能一次成功,你得先把這個屏的手冊看仔細(xì)想明白,這個看手冊的習(xí)慣應(yīng)該養(yǎng)好。如果你手工過了卻過不了程序,那你可得好好查查手冊。
圖形模式就是手冊里說的擴充指令模式。關(guān)于圖形模式下的手工控制,我就不講了,有興趣的可以自己試試。這里要提示的是,在圖形模式下,定位不再是一維的,而是二維的,X方向是256個點,每16個點增量一個坐標(biāo)值,也就是說X向的每一個坐標(biāo)值,它管著16個點,所以,X向的坐標(biāo)值是0~15;Y方向是32個點,每1個點增量一個坐標(biāo)值,也就是說它的32行點的每一行都有一個Y坐標(biāo)值,范圍是從0~31。為什么會是這個值?前面說過了,你可以把它看成是256*32的屏給分成兩半后再拼起來的,這個屏的設(shè)計反正就是這么奇怪。
圖形模式下坐標(biāo)的輸入方式也很奇特,它是同樣表達方式的指令,即標(biāo)志位同樣是DB7,后面跟的才是坐標(biāo)值,區(qū)分的方式就是輸入的先后順序,先輸入的數(shù)據(jù)為X坐標(biāo),后輸入的數(shù)據(jù)為Y坐標(biāo),說是必須兩個緊跟著輸入。然后要顯示的內(nèi)容數(shù)據(jù)也是兩個8位數(shù)據(jù)緊跟著輸入,控制該坐標(biāo)下的16個點的亮滅。
小貼士:撥碼開關(guān)的操作,用鑷子比較合適,徒手操作有點麻煩的。
想在字符模式下顯示漢字的話,該屏必須自帶中文字庫,否則,你只能在圖形模式下自己編制漢字顯示數(shù)據(jù)包。
請諸君批評指正,先謝了。
-
基本指令集.png
(1.09 MB, 下載次數(shù): 0)
下載附件
2025-11-30 16:01 上傳
作者: wjfw 時間: 2025-12-1 10:01
非常好的資料,太感謝了
作者: 慢慢思考 時間: 2025-12-1 11:43
本帖最后由 慢慢思考 于 2025-12-1 21:23 編輯
補充說明一下,電路圖中的KEN按鈕開關(guān)其實還是應(yīng)該用常開開關(guān),這個可以看它的時序圖,它是平時為低電位,放置數(shù)據(jù)之前先拉高電位,放置數(shù)據(jù)之后保持一定時間待數(shù)據(jù)端口電位穩(wěn)定之后,再拉低KENT處電位,此屏在此時讀取數(shù)據(jù),也就是說,這個屏是下降沿讀取數(shù)據(jù)。當(dāng)然,在這個實驗中,常閉開關(guān)也同樣會產(chǎn)生下降沿,所以也是可以用的,但是不規(guī)范。這個可以在這個實驗中來驗證。
作者: 慢慢思考 時間: 2025-12-1 22:43
還是想給大家提個醒,手冊上時序圖很清楚,寫入數(shù)據(jù)時,規(guī)范的做法是要先拉高EN后再放置數(shù)據(jù),然后再拉低EN;讀忙信號時,一定要先交出DB7端口的電位控制權(quán),也就是單片機要向這個端口輸出高電平,不然的話,你前面輸入的數(shù)據(jù)若是把這個端口的電位給拉低了,那你什么時候檢測它都是個低電位。如果你要讀出屏的其它數(shù)據(jù),則這一組端口的控制權(quán)都要先交出去。
我所看過的賣家提供的這個屏的例程,很難看到寫得很規(guī)范的,有的甚至不交出忙檢測端口的電位控制權(quán)就去做檢測。
天下文章一大抄,如果不了解清楚模塊的一些具體規(guī)定,抄對抄錯都不知道。
程序上機能通過,不等于程序沒毛病。
作者: man1234567 時間: 2025-12-2 11:35
初始化的命令也是這么搞上去的么 
作者: 慢慢思考 時間: 2025-12-2 21:25
帖子中那個控制屏幕與光標(biāo)的命令00001111(0x0F)不就是初始化的命令之一么?
本來就是個很簡單的玩藝,用單片機控制時,它的任何命令都是這么搞上去的。
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |