(正面)
(反面)



CLR P2.7(使能信號(hào)先置低電平)
CLR P2.6(RS低電平)
CLR P2.5(RW低電平)
LCALL DELAY1(延時(shí)一段時(shí)間 對(duì)應(yīng)時(shí)序圖TAS)
CLR P2.7(使使能信號(hào)置低電平)
SETB P2.7(使能信號(hào)置換高電平)
MOV P0,#08H(輸入08#對(duì)應(yīng)指令)
LCALL DELAY1(延時(shí)一段時(shí)間,對(duì)應(yīng)TC)
CLR P2.7
LCALL DELAY1
SETB P2.7
LCALL DELAY(此處延時(shí)大于60ms相當(dāng)于讀忙了)
這個(gè)程序段可以看作一個(gè)指令
寫(xiě)入數(shù)據(jù):
同上 把CLR P2.6,改為SETB P2.6即可,其余相同
其中延時(shí)時(shí)間如上圖,只要超過(guò)最小值即可,最好不要過(guò)長(zhǎng)了。
三丶對(duì)12864的所有操作概括起來(lái)有4種:
1)、讀忙狀態(tài)(同時(shí)讀出指針地址內(nèi)容),初始化之后每次對(duì)12864的讀寫(xiě)均要進(jìn)行忙檢測(cè)。(我每次寫(xiě)一次完整指令都延時(shí)一段時(shí)間,相當(dāng)于讀忙了,下面就不再贅述)
2)、寫(xiě)命令:所有的命令可以查看指令表,后續(xù)講解指令的詳細(xì)用法。寫(xiě)地址也是寫(xiě)指令。
3)、寫(xiě)數(shù)據(jù):操作對(duì)象有DDRAM、CGRAM、GDRAM。
4)、讀數(shù)據(jù):操作對(duì)象也是DDRAM、CGRAM、GDRAM。
那我們要如何在12864上面顯示圖像或者字符呢?
下面就來(lái)介紹一下DDRAM

上圖所對(duì)應(yīng)的四個(gè)區(qū)是DDRAM所對(duì)應(yīng)的在ST7920上面的地址,其中能夠顯示的只有壹貳區(qū),那么我們只需要把字符所對(duì)應(yīng)的數(shù)據(jù)寫(xiě)進(jìn)DDRAM中,那么就可以讓12864顯示出我們想要的字符。
其中80H到87H為第一行
90H到97H為第二行(上半屏)
88H到8FH為第三行
98H到9FH 為第四行(下半屏)
下面我們來(lái)試著編寫(xiě)一下程序
(這幾個(gè)步驟很重要,學(xué)會(huì)了步驟就學(xué)會(huì)了12864的使用)
*網(wǎng)上有帶字庫(kù)12864詳細(xì)指令集,這里我就不打出來(lái)了,注意,我編寫(xiě)的輸入指令的指令碼是只對(duì)應(yīng)DB0到DB7的,和下面綠框那種一樣是沒(méi)有RW,RS,E位的,那些位我在編指令的時(shí)候就設(shè)定好了。
(1)功能設(shè)定




對(duì)應(yīng)指令1000 0000也就是給p0輸入#80H
DDRAM從80H開(kāi)始輸入指令,12864的DDRAM橫向地址會(huì)自動(dòng)讀取表中的數(shù)據(jù),每輸入兩個(gè)16位的數(shù)據(jù)如#41H,#41H,地址會(huì)自動(dòng)從80H跳到81H以此類(lèi)推,網(wǎng)上有詳細(xì)的運(yùn)作方式,可以上網(wǎng)查閱。

上圖很明顯,我輸入了三個(gè)#41H進(jìn)80H中,12864就自動(dòng)將第三個(gè)41#也就是大寫(xiě)A寫(xiě)進(jìn)81H中,這里提一下,帶字庫(kù)DDRAM12864一個(gè)地址可以寫(xiě)一個(gè)漢字兩個(gè)字母(廠家規(guī)定的,無(wú)法修改)
這里可以用查表的方式,一直往DDRAM寫(xiě)入數(shù)據(jù),但是寫(xiě)進(jìn)去的數(shù)據(jù)是這樣的,先填滿(mǎn)第一行,再填滿(mǎn)第三行,再填滿(mǎn)第二行,再填滿(mǎn)第四行
,那我這里就采用查不同表的方式,設(shè)DDRAM起始地址為80H的時(shí)候只查16個(gè)數(shù)據(jù),再設(shè)90H再查16個(gè)數(shù)據(jù),以此類(lèi)推。
下面我給仿真圖和指令
(注意,這里仿真要帶字庫(kù)的12864,不帶字庫(kù)的不能成功仿真,帶字庫(kù)的模型上網(wǎng)搜)


我設(shè)置的引腳和開(kāi)發(fā)板的設(shè)置引腳一致,直接插上去使用了,大家使用的時(shí)候可以看看開(kāi)發(fā)板的原理圖,一般都是一樣的,不行就改引腳
那普通的字符可以了,那怎么畫(huà)圖呢,廣告的需求肯定不能只有字符,還要有圖案,那怎么定制呢。下面就來(lái)介紹另一個(gè)RAM,CGRAM,也叫繪圖RAM。


這些都是點(diǎn)陣,繪圖RAM就是給這些點(diǎn)陣置1或置0,可以看到其實(shí)它本來(lái)是32行×256列的,但是分成了上下兩屏顯示,每個(gè)點(diǎn)對(duì)應(yīng)了屏幕上的一個(gè)點(diǎn)。要使用繪圖功能需要開(kāi)啟擴(kuò)展指令。然后寫(xiě)地址,再讀寫(xiě)數(shù)據(jù)。
這幅圖就是CDRAM對(duì)應(yīng)的地址,其實(shí)也是12864實(shí)際的樣子,水平位址對(duì)應(yīng)著DDRAM的80H到8FH,一共16格,每8格對(duì)應(yīng)一個(gè)半屏,共兩個(gè)半屏。一格一行一共對(duì)應(yīng)了16位的二進(jìn)制數(shù)字那么半個(gè)屏幕就是16*8(共8格,一格16列)*32(32行),一個(gè)半屏32行,一個(gè)整屏就是16*8*32*2=128*64所以稱(chēng)之為12864屏幕(很重要,一定要理解了)
那看到上圖bit0和bit15,可以知道,一個(gè)地址是先從高位讀到低位置,看起來(lái)很麻煩。但是后面取字模軟件可以幫你修改,那我這里向CGRAM輸入還是像DDRAM一樣,當(dāng)然,CGRAM和DDRAM的地址是一樣的,一旦讀夠16個(gè)二進(jìn)制數(shù)字,也就是兩個(gè)16進(jìn)制數(shù),也就是兩個(gè)字節(jié),就會(huì)自動(dòng)加一,DDRAM從80H到81H,那CGRAM對(duì)應(yīng)的地址也是一樣下面會(huì)提到。這是x坐標(biāo),但是y坐標(biāo)不會(huì),y坐標(biāo)要你輸入了16個(gè)數(shù)值后自己修改,也就是寫(xiě)完一行后要自己改。
(我這里寫(xiě)得不太清楚,LCD12864點(diǎn)陣型液晶顯示器總結(jié) - 吃不了就兜著走 可以看一下這個(gè)作者寫(xiě)的他寫(xiě)的很詳細(xì))
GDRAM的讀寫(xiě):
首先說(shuō)明對(duì)GDRAM的操作基本單位是一個(gè)字,也就是2個(gè)字節(jié),就是說(shuō)讀寫(xiě)GDRAM時(shí)一次最少寫(xiě)2個(gè)字節(jié),一次最少讀2個(gè)字節(jié)。
寫(xiě)數(shù)據(jù):先開(kāi)啟擴(kuò)展指令集(0x36),然后送地址,這里的地址與DDRAM中的略有不同,DDRAM中的地址只有一個(gè),那就是字地址。而GDRAM中的 地址有2個(gè),分別是字地址(列地址/水平地址X)和位地址(行地址/垂直地址Y),上圖中的垂直地址就是00H~31H,水平地址就是00H~15H,寫(xiě) 地址時(shí)先寫(xiě)垂直地址(行地址)再寫(xiě)水平地址(列地址),也就是連續(xù)寫(xiě)入兩個(gè)地址,然后再連續(xù)寫(xiě)入2個(gè)字節(jié)的數(shù)據(jù)。這里列舉個(gè)寫(xiě)地址的例子:寫(xiě)GDRAM地址指令是0x80+地址。被加上的地址就是上面列舉的X和Y,假設(shè)我們要寫(xiě) 第一行的2個(gè)字節(jié),那么寫(xiě)入地址就是0x00H(寫(xiě)行地址)然后寫(xiě)0x80H(列地址),之后才連續(xù)寫(xiě)入2個(gè)字節(jié)的數(shù)據(jù)(先高字節(jié)后低字節(jié))。
下面說(shuō)說(shuō)指令,其實(shí)和DDRAM基本一致,就是寫(xiě)寫(xiě)入CGRAM指令要先寫(xiě)x坐標(biāo),再寫(xiě)y坐標(biāo),其余步驟基本一樣,但是查表要注意了,因?yàn)槲揖帉?xiě)的程序RA寄存器只能讀到256位置,那我要分成4個(gè)表才能讀完整個(gè)屏
下面給出指令和仿真。


下面拉屏和閃爍我就簡(jiǎn)要說(shuō)一下思路
閃爍我是通過(guò)不停地睡眠喚醒來(lái)實(shí)現(xiàn),這里睡眠指令要開(kāi)拓展指令,然后寫(xiě)一個(gè)循環(huán)和跳出循環(huán)的指令,通過(guò)兩個(gè)按鈕或者一個(gè)開(kāi)關(guān)實(shí)現(xiàn),也可以通過(guò)反白來(lái)實(shí)現(xiàn),其實(shí)會(huì)寫(xiě)步驟就完成大部分了,剩余的其實(shí)都是不斷地調(diào)試和檢查錯(cuò)誤。
拉屏(仿真跑不了卷屏)

功能:SR=1: AC5~AC0 為垂直卷動(dòng)地址,SR=0:。
那這里要說(shuō)一下了,怎么實(shí)現(xiàn)拉屏呢。其實(shí)12864里自帶了一個(gè)指令叫做卷動(dòng)地址設(shè)置,它規(guī)定了只會(huì)向上滾動(dòng),而因?yàn)橐还彩怯?4列的但是上面CGRAM為什么只有32行呢,那是因?yàn)槠渲?/p>

A0到A7對(duì)應(yīng)第一個(gè)屏中實(shí)際的第三行,其實(shí)它們也是可以輸入數(shù)據(jù)的,只是沒(méi)使用卷動(dòng)指令時(shí)無(wú)法看到,那我假設(shè)
設(shè)置拉屏的行數(shù)為16吧,那80H就到了原來(lái)的B0哪里,一整行都替換了,然后A0就到90H一行,90H就到80H,其實(shí)就是一行推著整個(gè)半屏都在運(yùn)動(dòng),但是12864的一行實(shí)際上是80H到8FH,上下半屏都在動(dòng),但不會(huì)相互影響
實(shí)際的一行:
80H | 8FH | ||||||||||||||
90H | 9FH | ||||||||||||||
A0H | AFH | ||||||||||||||
B0H | BFH |
所以一整個(gè)屏都會(huì)移動(dòng)

(下圖是半個(gè)屏,下面因?yàn)槲乙呀?jīng)實(shí)現(xiàn)全屏不方便改了,就只看上半屏吧)

那我要怎么實(shí)現(xiàn)全屏滾動(dòng)呢,那么A0和B0行就開(kāi)始有用了,那我只要將80H
對(duì)應(yīng)的行,假設(shè)是CGRAM中的y 00H,x80H向上移,那我就設(shè)置成看起來(lái)從下半屏的最下面開(kāi)始往上面升起,那就是Y 32H X 88H,這一行。那這就開(kāi)始有思路了,那我吧80H到88H的數(shù)據(jù)一起輸入到A8到AFH區(qū)域不就行了嗎,以此類(lèi)推90H區(qū)到98H的就輸入到B8到BF中,88H的輸入到A0,98H的輸入到B0就ok了。
下面試一下

成功了(此處要說(shuō)明一下,CGRAM的y坐標(biāo)是到0到63,是可以設(shè)置到A0和B0位置的,網(wǎng)上教程說(shuō)的不清不楚的,花費(fèi)了我很多精力,上面說(shuō)y是0到31是因?yàn)椴辉O(shè)置卷動(dòng)看不見(jiàn),所以不顯示)
說(shuō)明書(shū)心得:
說(shuō)實(shí)話(huà),這次我選的課題確實(shí)不算難度大的那一批了,網(wǎng)上也有很多的教程,但是由于要全部用匯編實(shí)現(xiàn),工作量大了很多,我以為很快就能成功,沒(méi)想到過(guò)程真的是千辛萬(wàn)苦,一個(gè)是仿真,可以說(shuō)網(wǎng)上帶字庫(kù)的仿真幾乎沒(méi)有,那個(gè)Proteus的帶字庫(kù)模型還要自己在網(wǎng)上買(mǎi),不斷調(diào)試,不斷測(cè)試才終于和開(kāi)發(fā)板的一致。
不斷在網(wǎng)上搜索教程,看了半天居然是不帶字庫(kù)的,差點(diǎn)暈倒在桌子上。后面終于在網(wǎng)上找到ST7920的說(shuō)明書(shū),一看和天書(shū)一樣晦澀難懂,沒(méi)辦法,一個(gè)個(gè)不會(huì)的知識(shí)點(diǎn)慢慢學(xué),實(shí)在不行就先看了1602的,這里很感謝知乎的北鸮,他寫(xiě)的一篇文章超詳細(xì)講解,LCD1602電路與驅(qū)動(dòng) 真的很詳細(xì)清楚
然后是燒錄的問(wèn)題,燒錄還好,因?yàn)榫W(wǎng)上的教程很詳盡明白,沒(méi)什么問(wèn)題。然后就是不斷地寫(xiě)程序,調(diào)仿真一直反復(fù)。然后不斷地看網(wǎng)上作者們寫(xiě)的程序,吐槽一下,網(wǎng)上都是c語(yǔ)言的程序,匯編幾乎沒(méi)有,少有的幾個(gè)甚至有語(yǔ)法錯(cuò)誤,看的時(shí)候都有點(diǎn)頭痛,那只好看著c語(yǔ)言思路來(lái)寫(xiě)匯編了,感謝網(wǎng)絡(luò)上各位熱心的作者,他們無(wú)償?shù)胤窒碇R(shí),而且教的很棒,真的非常感謝他們。
12864匯編教程.docx
(2.48 MB, 下載次數(shù): 73)




無(wú)名!! 發(fā)表于 2023-1-13 09:52
很棒啊,這匯編整的

kdaodsi 發(fā)表于 2022-12-30 00:10
下面是改正過(guò)的代碼:
AJMP MAIN
TAB1:DB 041H,041H,041H,041H,041H,041H,041H,041H,041H,041H,03H,03H,0 ...
kdaodsi 發(fā)表于 2022-12-30 00:10
下面是改正過(guò)的代碼:
AJMP MAIN
TAB1:DB 041H,041H,041H,041H,041H,041H,041H,041H,041H,041H,03H,03H,0 ...
| 歡迎光臨 (http://www.denmoz.com/bbs/) | Powered by Discuz! X3.1 |