日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机12864带字库汇编使用教程

發布時間:2024/8/1 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机12864带字库汇编使用教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一丶引腳說明 Lcd12864(帶字庫版本,ST7920為主芯片驅動)

(正面)

?

(反面) 由于是帶字庫版本,與不帶字庫版本有出入,其部分引腳有不同 二丶接口時序 Mpu從模塊寫入資料

(時序圖很重要,能夠保證命令正確寫入ST7920芯片,讓12864屏幕正常使用) ?

??

這里我們采用并行模式,PSB,RS全部置高(PSB,RS所對應的引腳置高電平) (P2.6RS對應口,P2.5 RWP2.7 ED0-D7接在P0串口,PSB P3.2,RST P3.3??vcc5v?下面統一采取這種接法) 寫入指令:

CLR P2.7(使能信號先置低電平)

CLR P2.6(RS低電平)

CLR P2.5(RW低電平)

LCALL DELAY1(延時一段時間 對應時序圖TAS)

CLR P2.7(使使能信號置低電平)

SETB P2.7(使能信號置換高電平)

MOV P0,#08H(輸入08#對應指令)

LCALL DELAY1(延時一段時間,對應TC)

CLR P2.7

LCALL DELAY1

SETB P2.7

LCALL DELAY(此處延時大于60ms相當于讀忙了)

這個程序段可以看作一個指令

寫入數據:

同上? ???CLR P2.6,改為SETB P2.6即可,其余相同

其中延時時間如上圖,只要超過最小值即可,最好不要過長了。

?

三丶對12864的所有操作概括起來有4種

1)、讀忙狀態(同時讀出指針地址內容),初始化之后每次對12864的讀寫均要進行忙檢測。(我每次寫一次完整指令都延時一段時間,相當于讀忙了,下面就不再贅述)

2)、寫命令:所有的命令可以查看指令表,后續講解指令的詳細用法。寫地址也是寫指令。

3)、寫數據:操作對象有DDRAM、CGRAM、GDRAM。

4)、讀數據:操作對象也是DDRAM、CGRAM、GDRAM。

忙標志:BF BF標志提供內部工作情況。BF=1表示模塊在內部操作,此時模塊不接受外部指令和數據。BF=0時,模塊為準備狀態,隨時可接受外部指令和數據。 利用STATUS READ指令,可以將BF讀到DB7總線,從檢驗模塊之工作狀態。

那我們要如何在12864上面顯示圖像或者字符呢?

下面就來介紹一下DDRAM

上圖所對應的四個區是DDRAM所對應的在ST7920上面的地址,其中能夠顯示的只有壹貳區,那么我們只需要把字符所對應的數據寫進DDRAM中,那么就可以讓12864顯示出我們想要的字符。

其中80H到87H為第一行

90H到97H為第二行(上半屏)

88H到8FH為第三行

98H到9FH 為第四行(下半屏)

下面我們來試著編寫一下程序

(這幾個步驟很重要,學會了步驟就學會了12864的使用)

*網上有帶字庫12864詳細指令集,這里我就不打出來了,注意,我編寫的輸入指令的指令碼是只對應DB0到DB7的,和下面綠框那種一樣是沒有RW,RS,E位的,那些位我在編指令的時候就設定好了。

(1)功能設定

? (2)清屏指令



? (3)進入設定點

? (4)顯示狀態開關設置 ?

? 上面為初始化程序 (綠色框代表指令碼,可以輸入二進制也可以輸入16進制,只要保證p0口電平信號相對應就行了) ?
  • 設置DDRAM地址
?

對應指令1000 0000也就是給p0輸入#80H

DDRAM從80H開始輸入指令,12864的DDRAM橫向地址會自動讀取表中的數據,每輸入兩個16位的數據如#41H,#41H,地址會自動從80H跳到81H以此類推,網上有詳細的運作方式,可以上網查閱。

?

?

上圖很明顯,我輸入了三個#41H進80H中,12864就自動將第三個41#也就是大寫A寫進81H中,這里提一下,帶字庫DDRAM12864一個地址可以寫一個漢字兩個字母(廠家規定的,無法修改)

?
  • 輸入DDRAM地址
?

這里可以用查表的方式,一直往DDRAM寫入數據,但是寫進去的數據是這樣的,先填滿第一行,再填滿第三行,再填滿第二行,再填滿第四行

,那我這里就采用查不同表的方式,設DDRAM起始地址為80H的時候只查16個數據,再設90H再查16個數據,以此類推。

?

下面我給仿真圖和指令

(注意,這里仿真要帶字庫的12864,不帶字庫的不能成功仿真,帶字庫的模型上網搜)

?

?

我設置的引腳和開發板的設置引腳一致,直接插上去使用了,大家使用的時候可以看看開發板的原理圖,一般都是一樣的,不行就改引腳

?

那普通的字符可以了,那怎么畫圖呢,廣告的需求肯定不能只有字符,還要有圖案,那怎么定制呢。下面就來介紹另一個RAM,CGRAM,也叫繪圖RAM。

?

?

這些都是點陣,繪圖RAM就是給這些點陣置1或置0,可以看到其實它本來是32行×256列的,但是分成了上下兩屏顯示,每個點對應了屏幕上的一個點。要使用繪圖功能需要開啟擴展指令。然后寫地址,再讀寫數據。

?

這幅圖就是CDRAM對應的地址,其實也是12864實際的樣子,水平位址對應著DDRAM的80H到8FH,一共16格,每8格對應一個半屏,共兩個半屏。一格一行一共對應了16位的二進制數字那么半個屏幕就是16*8(共8格,一格16列)*32(32行),一個半屏32行,一個整屏就是16*8*32*2=128*64所以稱之為12864屏幕(很重要,一定要理解了)

?

那看到上圖bit0和bit15,可以知道,一個地址是先從高位讀到低位置,看起來很麻煩。但是后面取字模軟件可以幫你修改,那我這里向CGRAM輸入還是像DDRAM一樣,當然,CGRAM和DDRAM的地址是一樣的,一旦讀夠16個二進制數字,也就是兩個16進制數,也就是兩個字節,就會自動加一,DDRAM從80H到81H,那CGRAM對應的地址也是一樣下面會提到。這是x坐標,但是y坐標不會,y坐標要你輸入了16個數值后自己修改,也就是寫完一行后要自己改。

(我這里寫得不太清楚,LCD12864點陣型液晶顯示器總結 - 吃不了就兜著走 可以看一下這個作者寫的他寫的很詳細)

?

??GDRAM的讀寫:

??首先說明對GDRAM的操作基本單位是一個字,也就是2個字節,就是說讀寫GDRAM時一次最少寫2個字節,一次最少讀2個字節。

?

??寫數據:先開啟擴展指令集(0x36,然后送地址,這里的地址與DDRAM中的略有不同,DDRAM中的地址只有一個,那就是字地址。而GDRAM中的 地址有2個,分別是字地址(列地址/水平地址X)和位地址(行地址/垂直地址Y),上圖中的垂直地址就是00H~31H,水平地址就是00H~15H,寫 地址時先寫垂直地址(行地址)再寫水平地址(列地址),也就是連續寫入兩個地址,然后再連續寫入2個字節的數據。這里列舉個寫地址的例子:寫GDRAM地址指令是0x80+地址。被加上的地址就是上面列舉的XY,假設我們要寫 第一行的2個字節,那么寫入地址就是0x00H(寫行地址)然后寫0x80H(列地址),之后才連續寫入2個字節的數據(先高字節后低字節)。

下面說說指令,其實和DDRAM基本一致,就是寫寫入CGRAM指令要先寫x坐標,再寫y坐標,其余步驟基本一樣,但是查表要注意了,因為我編寫的程序RA寄存器只能讀到256位置,那我要分成4個表才能讀完整個屏

?

下面給出指令和仿真。

?

下面拉屏和閃爍我就簡要說一下思路

?

閃爍我是通過不停地睡眠喚醒來實現,這里睡眠指令要開拓展指令,然后寫一個循環和跳出循環的指令,通過兩個按鈕或者一個開關實現,也可以通過反白來實現,其實會寫步驟就完成大部分了,剩余的其實都是不斷地調試和檢查錯誤。

?

拉屏(仿真跑不了卷屏)

功能:SR=1: AC5~AC0 為垂直卷動地址,SR=0:。

那這里要說一下了,怎么實現拉屏呢。其實12864里自帶了一個指令叫做卷動地址設置,它規定了只會向上滾動,而因為一共是有64列的但是上面CGRAM為什么只有32行呢,那是因為其中

A0到A7對應第一個屏中實際的第三行,其實它們也是可以輸入數據的,只是沒使用卷動指令時無法看到,那我假設

?

設置拉屏的行數為16吧,那80H就到了原來的B0哪里,一整行都替換了,然后A0就到90H一行,90H就到80H,其實就是一行推著整個半屏都在運動,但是12864的一行實際上是80H到8FH,上下半屏都在動,但不會相互影響

?

實際的一行:

80H


?

?

?

?

?

?

?

?

?

?

?

?

?

?

8FH

90H


?

?

?

?

?

?

?

?

?

?

?

?

?

?

9FH

A0H


?

?

?

?

?

?

?

?

?

?

?

?

?

?

AFH

B0H


?

?

?

?

?

?

?

?

?

?

?

?

?

?

BFH

所以一整個屏都會移動

?

?

(下圖是半個屏,下面因為我已經實現全屏不方便改了,就只看上半屏吧)

?

那我要怎么實現全屏滾動呢,那么A0和B0行就開始有用了,那我只要將80H

對應的行,假設是CGRAM中的y??00H,x80H向上移,那我就設置成看起來從下半屏的最下面開始往上面升起,那就是Y 32H??X??88H,這一行。那這就開始有思路了,那我吧80H到88H的數據一起輸入到A8到AFH區域不就行了嗎,以此類推90H區到98H的就輸入到B8到BF中,88H的輸入到A0,98H的輸入到B0就ok了。

下面試一下

成功了(此處要說明一下,CGRAM的y坐標是到0到63,是可以設置到A0和B0位置的,網上教程說的不清不楚的,花費了我很多精力,上面說y是0到31是因為不設置卷動看不見,所以不顯示)

?

說明書心得:

說實話,這次我選的課題確實不算難度大的那一批了,網上也有很多的教程,但是由于要全部用匯編實現,工作量大了很多,我以為很快就能成功,沒想到過程真的是千辛萬苦,一個是仿真,可以說網上帶字庫的仿真幾乎沒有,那個Proteus的帶字庫模型還要自己在網上買,不斷調試,不斷測試才終于和開發板的一致。

不斷在網上搜索教程,看了半天居然是不帶字庫的,差點暈倒在桌子上。后面終于在網上找到ST7920的說明書,一看和天書一樣晦澀難懂,沒辦法,一個個不會的知識點慢慢學,實在不行就先看了1602的,這里很感謝知乎的北鸮他寫的一篇文章超詳細講解,LCD1602電路與驅動 真的很詳細清楚

然后是燒錄的問題,燒錄還好,因為網上的教程很詳盡明白,沒什么問題。然后就是不斷地寫程序,調仿真一直反復。然后不斷地看網上作者們寫的程序,吐槽一下,網上都是c語言的程序,匯編幾乎沒有,少有的幾個甚至有語法錯誤,看的時候都有點頭痛,那只好看著c語言思路來寫匯編了,感謝網絡上各位熱心的作者,他們無償地分享知識,而且教的很棒,真的非常感謝他們。

?

?



單片機源程序如下:
  • AJMP MAIN
  • TAB1:
  • DB #41H,#41H,#41H,#41H,#41H,#41H,#41H,#41H,#41H,#41H,#41H,#41H,#41H,#41H
  • ,#41H,#41H
  • TAB2: DB "元旦快樂大家好"
  • //帶字庫的很方便,直接按這個格式輸入漢字就行 一行7漢字,沒有字的地方記得輸入空格,空格占半個地址位
  • TAB3: DB "我你不合格 ",07FH,05FH,06FH
  • TAB4: DB "哦哦哦哦哦 ",07FH,05FH,06FH? ?? ?? ?? ?
  • //想改字符漢字直接改表就行,漢字要打在引號里面
  • MAIN:
  • SETB P3.2
  • LCALL DELAY1
  • CLR??P3.3
  • LCALL DELAY1
  • SETB P3.3
  • LCALL DELAY1
  • //初始化
  • CLR P2.6
  • CLR P2.5
  • MOV P0,#30H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //寫入#30H對應的指令
  • CLR P2.7
  • CLR P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,#08H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //寫入#08H的指令
  • CLR P2.7
  • CLR P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,#0CH
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //開屏
  • CLR P2.7
  • CLR P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,#01H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //清屏指令
  • CLR P2.7
  • CLR P2.6
  • ACALL DELAY1
  • CLR P2.5
  • MOV P0,#80H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //光標設置
  • CLR P2.7
  • CLR P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,#80H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //設置DDRAM地址
  • CLR P2.7
  • SETB P2.6
  • ACALL DELAY1
  • CLR P2.5
  • MOV R2,#15D
  • MOV DPTR,#TAB1
  • LOOP:MOV A,R0
  • INC R0
  • MOVC A,@A+DPTR
  • SETB P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,A
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • DJNZ R2,LOOP
  • //查表指令
  • CLR P2.6
  • ACALL DELAY1
  • CLR P2.5
  • MOV P0,#90H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //設置DDRAM地址
  • MOV R2,#15D
  • MOV DPTR,#TAB2
  • MOV R0,#00H
  • LOOP1:MOV A,R0
  • INC R0
  • MOVC A,@A+DPTR
  • SETB P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,A
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • DJNZ R2,LOOP1
  • //查表指令
  • CLR P2.6
  • ACALL DELAY1
  • CLR P2.5
  • MOV P0,#88H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //設置DDRAM地址
  • MOV R2,#15D
  • MOV DPTR,#TAB3
  • MOV R0,#00H
  • LOOP2:MOV A,R0
  • INC R0
  • MOVC A,@A+DPTR
  • SETB P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,A
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • DJNZ R2,LOOP2
  • //查表指令
  • CLR P2.6
  • ACALL DELAY1
  • CLR P2.5
  • MOV P0,#98H
  • LCALL DELAY1
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • //設置DDRAM地址
  • MOV R2,#15D
  • MOV DPTR,#TAB4
  • MOV R0,#00H
  • LOOP3:MOV A,R0
  • INC R0
  • MOVC A,@A+DPTR
  • SETB P2.6
  • LCALL DELAY1
  • CLR P2.5
  • MOV P0,A
  • SETB P2.7
  • LCALL DELAY1
  • CLR P2.7
  • LCALL DELAY1
  • DJNZ R2,LOOP3
  • //查表指令
  • ? ?? ?? ?? ?
  • DELAY1:
  • MOV??R7,#100? ?;單周期指令(1us)
  • D1:??
  • ??MOV??R6,#100??;單周期指令(1us)? ?? ???
  • ??DJNZ R6,[? ?? ???DISCUZ_CODE_3? ?? ???]nbsp;? ???;雙周期指令(2us)//該指令自身執行R6次? ?? ???
  • ??DJNZ R7,D1? ???;雙周期指令(2us)//D1執行R7次??
  • RET
  • END
  • 復制代碼

    總結

    以上是生活随笔為你收集整理的单片机12864带字库汇编使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。