在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在CGRAM中自定義字符呢?

GReq_mcu168 ? 來源:玩轉單片機 ? 作者:玩轉單片機 ? 2020-10-30 11:29 ? 次閱讀

一.接口

LCD1602是很多單片機愛好者較早接觸的字符型液晶顯示器,它的主控芯片是HD44780或者其它兼容芯片。與此相仿的是LCD12864液晶顯示器,它是一種圖形點陣顯示器,能顯示的內容比LCD1602要豐富得多,除了普通字符外,還可以顯示點陣圖案,帶有漢字庫的還可以顯示漢字,它的并行驅動方式與LCD1602相差無幾,所以,在這里花點時間是值得的。

一般來說,LCD1602有16條引腳,據說還有14條引腳的,與16腳的相比缺少了背光電源A(15腳)和地線K(16腳)。這塊LCD1602的型號是HJ1602A,是繪晶科技公司的產品,它有16條引腳。如圖1所示:

圖1

再來一張它的背面的,如圖2所示:



圖2

它的16條引腳定義如下:

引腳號 符號 引腳說明 引腳號 符號 引腳說明
1 VSS 電源 9 D2 數據端口
2 VDD 電源正極 10 D3 數據端口
3 VO 偏壓信號 11 D4 數據端口
4 RS 命令/數據 12 D5 數據端口
5 RW 讀/寫 13 D6 數據端口
6 E 使能 14 D7 數據端口
7 D0 數據端口 15 A 背光正極
8 D1 數據端口 16 K 背光負極

對這個表的說明:

1. VSS接電源地。

2. VDD接+5V。

3. VO是液晶顯示的偏壓信號,可接10K的3296精密電位器。或同樣阻值的RM065/RM063藍白可調電阻。見圖3。


圖3

4. RS是命令/數據選擇引腳,接單片機的一個I/O,當RS為低電平時,選擇命令;當RS為高電平時,選擇數據。

5. RW是讀/寫選擇引腳,接單片機的一個I/O,當RW為低電平時,向LCD1602寫入命令或數據;當RW為高電平時,從LCD1602讀取狀態或數據。如果不需要進行讀取操作,可以直接將其接VSS。

6. E,執行命令的使能引腳,接單片機的一個I/O。

7. D0—D7,并行數據輸入/輸出引腳,可接單片機的P0—P3任意的8個I/O口。如果接P0口,P0口應該接4.7K—10K的上拉電阻。如果是4線并行驅動,只須接4個I/O口。

8. A背光正極,可接一個10—47歐的限流電阻到VDD。

9. K背光負極,接VSS。見圖4所示。


圖4

二.基本操作

LCD1602的基本操作分為四種:

1. 讀狀態:輸入RS=0,RW=1,E=高脈沖。輸出:D0—D7為狀態字。

2. 讀數據:輸入RS=1,RW=1,E=高脈沖。輸出:D0—D7為數據。

3. 寫命令:輸入RS=0,RW=0,E=高脈沖。輸出:無。

4. 寫數據:輸入RS=1,RW=0,E=高脈沖。輸出:無。

讀操作時序圖(如圖5):


圖5

寫操作時序圖(如圖6):


圖6

時序時間參數(如圖7):


圖7

三.DDRAM、CGROM和CGRAM

DDRAM(Display Data RAM)就是顯示數據RAM,用來寄存待顯示的字符代碼。共80個字節,其地址和屏幕的對應關系如下(如圖8):


圖8

DDRAM相當于計算機的顯存,我們為了在屏幕上顯示字符,就把字符代碼送入顯存,這樣該字符就可以顯示在屏幕上了。同樣LCD1602共有80個字節的顯存,即DDRAM。但LCD1602的顯示屏幕只有16×2大小,因此,并不是所有寫入DDRAM的字符代碼都能在屏幕上顯示出來,只有寫在上圖所示范圍內的字符才可以顯示出來,寫在范圍外的字符不能顯示出來。這樣,我們在程序中可以利用下面的“光標或顯示移動指令”使字符慢慢移動到可見的顯示范圍內,看到字符的移動效果。

前面說了,為了在液晶屏幕上顯示字符,就把字符代碼送入DDRAM。例如,如果想在屏幕左上角顯示字符‘A’,那么就把字符‘A’的字符代碼41H寫入DDRAM的00H地址處即可。至于怎么寫入,后面會有說明。那么為什么把字符代碼寫入DDRAM,就可以在相應位置顯示這個代碼的字符呢?我們知道,LCD1602是一種字符點陣顯示器,為了顯示一種字符的字形,必須要有這個字符的字模數據,什么叫字符的字模數據,看看下面的這個圖就明白了(如圖9)。


圖9

上圖的左邊就是字符‘A’的字模數據,右邊就是將左邊數據用“○”代表0,用“■”代表1。從而顯示出‘A’這個字形。從下面的圖可以看出,字符‘A’的高4位是0100,低4位是0001,合在一起就是01000001b,即41H。它恰好與該字符的ASCII碼一致,這樣就給了我們很大的方便,我們可以在PC上使用P2=‘A’這樣的語法。編譯后,正好是這個字符的字符代碼。

在LCD1602模塊上固化了字模存儲器,就是CGROM和CGRAM,HD44780內置了192個常用字符的字模,存于字符產生器CGROM(Character Generator ROM)中,另外還有8個允許用戶自定義的字符產生RAM,稱為CGRAM(Character Generator RAM)。下圖(如圖12)說明了CGROM和CGRAM與字符的對應關系。從ROM和RAM的名字我們也可以知道,ROM是早已固化在LCD1602模塊中的,只能讀取;而RAM是可讀寫的。也就是說,如果只需要在屏幕上顯示已存在于CGROM中的字符,那么只須在DDRAM中寫入它的字符代碼就可以了;但如果要顯示CGROM中沒有的字符,比如攝氏溫標的符號,那么就只有先在CGRAM中定義,然后再在DDRAM中寫入這個自定義字符的字符代碼即可。和CGROM中固化的字符不同,CGRAM中本身沒有字符,所以要在DDRAM中寫入某個CGROM不存在的字符,必須在CGRAM中先定義后使用。程序退出后CGRAM中定義的字符也不復存在,下次使用時,必須重新定義。


圖10

上面這個圖(如圖10)說明的是5×8點陣和5×10點陣字符的字形和光標的位置。先來說5×8點陣,它有8行5列。那么定義這樣一個字符需要8個字節,每個字節的前3個位沒有被使用。例如,定義攝氏溫標的符號{0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}。


圖11

上面這個圖(如圖11)說明的是設置CGRAM地址指令。從這個指令的格式中我們可以看出,它共有aaaaaa這6位,一共可以表示64個地址,即64個字節。一個5×8點陣字符共占用8個字節,那么這64個字節一共可以自定義8個字符。也就是說,上面這個圖的6位地址中的DB5DB4DB3用來表示8個自定義的字符,DB2DB1DB0用來表示每個字符的8個字節。這DB5DB4DB3所表示的8個自定義字符(0--7)就是要寫入DDRAM中的字符代碼。我們知道,在CGRAM中只能定義8個自定義字符,也就是只有0—7這8個字符代碼,但在下面的這個表(如圖12)中一共有16個字符代碼(××××0000b--××××1111b)。實際上,如圖所示,它只能表示8個自定義字符 (××××0000b=××××1000b, ××××0001b=××××1001b……依次類推)。也就是說,寫入DDRAM中的字符代碼0和字符代碼8是同一個自定義字符。5×10點陣每個字符共占用16個字節的空間,所以CGRAM中只能定義4個這樣的自定義字符。

那么如何在CGRAM中自定義字符呢?在上面的介紹中,我們知道有一個設置CGRAM地址指令,同寫DDRAM指令相似,只須設置好某個自定義字符的字模數據,然后按照上面介紹的方法,設置好CGRAM地址,依次寫入這個字模數據即可。我們在后面的例子中再進行說明。


圖12

四.LCD1602指令

1.工作方式設置指令(如圖13)


圖13

×:不關心,也就是說這個位是0或1都可以,一般取0。

DL:設置數據接口位數。

DL=1:8位數據接口(D7—D0)。

DL=0:4位數據接口(D7—D4)。

N=0:一行顯示。

N=1:兩行顯示。

F=0:5×8點陣字符。

F=1:5×10點陣字符。

說明:因為是寫指令字,所以RS和RW都是0。LCD1602只能用并行方式驅動,不能用串行方式驅動。而并行方式又可以選擇8位數據接口或4位數據接口。這里我們選擇8位數據接口(D7—D0)。我們的設置是8位數據接口,兩行顯示,5×8點陣,即0b00111000也就是0x38。(注意:NF是10或11的效果是一樣的,都是兩行5×8點陣。因為它不能以兩行5×10點陣方式進行顯示,換句話說,這里用0x38或0x3c是一樣的)。

2.顯示開關控制指令(如圖14)


圖14

D=1:顯示開,D=0:顯示關。

C=1:光標顯示,C=0:光標不顯示。

B=1:光標閃爍,B=0:光標不閃爍。

說明:這里的設置是顯示開,不顯示光標,光標不閃爍,設置字為0x0c。

3.進入模式設置指令(如圖15、16)


圖15

I/D=1:寫入新數據后光標右移。

I/D=0:寫入新數據后光標左移。

S=1:顯示移動。

S=0:顯示不移動。


圖16

說明:這里的設置是0x06。

4.光標或顯示移動指令(如圖17、18)


圖17


圖18

說明:在需要進行整屏移動時,這個指令非常有用,可以實現屏幕的滾動顯示效果。初始化時不使用這個指令。

5.清屏指令(如圖19)


圖19

說明:清除屏幕顯示內容。光標返回屏幕左上角。執行這個指令時需要一定時間。

6.光標歸位指令(如圖20)

圖20

說明:光標返回屏幕左上角,它不改變屏幕顯示內容。

7.設置CGRAM地址指令(如圖21)


圖21

說明:這個指令在上面已經介紹過。用法在后面例子中說明。

8.設置DDRAM地址指令(如圖22)


圖22

說明:這個指令用于設置DDRAM地址。在對DDRAM進行讀寫之前,首先要設置DDRAM地址,然后才能進行讀寫。前面我們說過,DDRAM就是LCD1602的顯示存儲器。我們要在它上面進行顯示,就要把要顯示的字符寫入DDRAM。同樣,我們想知道DDRAM某個地址上有什么字符,也要先設置DDRAM地址,然后將它讀出到單片機。

9.讀忙信號和地址計數器AC(如圖23)


圖23

說明:這個指令用來讀取LCD1602狀態。對于單片機來說,LCD1602屬于慢速設備。當單片機向其發送一個指令后,它將去執行這個指令。這時如果單片機再次發送下一條指令,由于LCD1602速度較慢,前一條指令還未執行完畢,它將不接受這新的指令,導致新的指令丟失。因此這條讀忙指令可以用來判斷LCD1602是否忙,能否接收單片機發來的指令。當BF=1,表示LCD1602正忙,不能接受單片機的指令;當BF=0,表示LCD1602空閑,可以接收單片機的指令。RS=0,表示是指令;RW=1,表示是讀取。這條指令還有一個副產品:即可以得到地址記數器AC的值(address counter)。LCD1602維護了一個地址計數器AC,用來記錄下一次讀寫CGRAM或DDRAM的位置。需要強調的是:這條指令我一次也沒有執行成功。很多網友似乎也是這樣。好在我們有另外的辦法,也就是延時。通過查看每條指令的執行時間,再經過一些試驗,可以確定指令的延時。這樣就可以在上一條指令執行完畢后再執行下一條指令了。

10.寫數據到CGRAM或DDRAM指令(如圖24)


圖24

說明:RS=1,數據;RW=0,寫。指令執行時,要在DB7—DB0上先設置好要寫入的數據,然后執行寫命令。

11.從CGRAM或DDRAM讀數據指令(如圖25)


圖25

說明:RS=1,數據;RW=1,讀。先設置好CGRAM或DDRAM的地址,然后執行讀取命令。數據就被讀入后DB7—DB0。

五.實例

下面我們就以一個實例來結束這篇文章。先介紹一下背景:單片機最小系統(擴充了外部RAM 62256)。采用STC89C52RC,晶振22.1184MHZ。以5×8點陣,16×2行,8位數據端口。首先在第一行顯示“I love MCU!”,第二行顯示“LCD1602 Test!”。延時一段時間,清屏。然后在第一行顯示自定義字符:攝氏溫標標志。第二行顯示圓周率(pai)標志。再延時一段時間,清屏。最后在第一行顯示“Welcome to my blog!”,顯示方式是從屏幕右面移入,左面移出。周而復始(如圖26)。


圖26

責任編輯:lq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6065

    文章

    44944

    瀏覽量

    648039
  • 接口
    +關注

    關注

    33

    文章

    8968

    瀏覽量

    153347
  • LCD1602
    +關注

    關注

    14

    文章

    607

    瀏覽量

    53389

原文標題:單片機顯示原理

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    KiCad 自定義規則(KiCon 演講)

    “ ?Seth Hillbrand 在 KiCon US 2025 上為大家介紹了 KiCad 的規則系統,并詳細講解了自定義規則的設計與實例。? ” ? 演講主要圍繞 加強 KiCad 自定義
    的頭像 發表于 06-16 11:17 ?124次閱讀
    KiCad <b class='flag-5'>中</b>的<b class='flag-5'>自定義</b>規則(KiCon 演講)

    HarmonyOS應用自定義鍵盤解決方案

    自定義鍵盤是一種替換系統默認鍵盤的解決方案,可實現鍵盤個性化交互。允許用戶結合業務需求與操作習慣,對按鍵布局進行可視化重構、設置多功能組合鍵位,使輸入更加便捷和舒適。在安全防護層面,自定義鍵盤可以
    的頭像 發表于 06-05 14:19 ?454次閱讀

    LabVIEW運動控制(三):EtherCAT運動控制器的高效加工指令自定義封裝

    LabVIEW高效加工指令自定義封裝
    的頭像 發表于 04-08 13:49 ?2336次閱讀
    LabVIEW運動控制(三):EtherCAT運動控制器的高效加工指令<b class='flag-5'>自定義</b>封裝

    MIMXRT1176如何在MBDT中正確實現自定義LUT?

    (peripherals.c peripherals.h),但我注意到它們在編譯時被覆蓋了。 如何在 MBDT 中正確實現自定義 LUT?此外,有沒有辦法修改默認 LUT 而不在編譯期間重置它?
    發表于 04-08 07:56

    如何添加自定義單板

    在開發過程,用戶有時需要創建自定義板配置。本節將通過一個實例講解用戶如何創建屬于自己的machine,下面以g2l-test.conf為例進行說明。
    的頭像 發表于 03-12 14:43 ?514次閱讀

    如何快速創建用戶自定義Board和App工程

    可將該文件夾復制到用戶自定義的工作目錄(workspace),基于此模板進行開發。本模板主要牽涉到的用戶自定義的文件有:用戶板級文件Board用戶應用程序App用
    的頭像 發表于 02-08 13:38 ?438次閱讀
    如何快速創建用戶<b class='flag-5'>自定義</b>Board和App工程

    Altium Designer 15.0自定義元件設計

    電子發燒友網站提供《Altium Designer 15.0自定義元件設計.pdf》資料免費下載
    發表于 01-21 15:04 ?0次下載
    Altium Designer 15.0<b class='flag-5'>自定義</b>元件設計

    think-cell:自定義think-cell(四)

    C.5 設置默認議程幻燈片布局 think-cell 議程可以在演示文稿中使用特定的自定義布局來定義議程、位置和議程幻燈片上的其他形狀,例如標題或圖片。通過將此自定義布局添加到模板,您可以為整個組織
    的頭像 發表于 01-13 10:37 ?474次閱讀
    think-cell:<b class='flag-5'>自定義</b>think-cell(四)

    think-cell;自定義think-cell(一)

    本章介紹如何自定義 think-cell,即如何更改默認顏色和其他默認屬性;這是通過 think-cell 的樣式文件完成的,這些文件將在前四個部分中進行討論。 第五部分 C.5 設置默認議程幻燈片
    的頭像 發表于 01-08 11:31 ?646次閱讀
    think-cell;<b class='flag-5'>自定義</b>think-cell(一)

    創建自定義的基于閃存的引導加載程序(BSL)

    電子發燒友網站提供《創建自定義的基于閃存的引導加載程序(BSL).pdf》資料免費下載
    發表于 09-19 10:50 ?0次下載
    創建<b class='flag-5'>自定義</b>的基于閃存的引導加載程序(BSL)

    如何創建TestStand自定義步驟

    在之前的課程簡單地介紹過TestStand自帶的一些步驟類型,如測試、消息彈窗、賦值、標簽等等,這些簡單的步驟從TestStand的插入選版中就可以添加到序列。那么在使用如果碰到需要實現更加靈活、復雜的功能,使用自帶的一些
    的頭像 發表于 09-11 14:46 ?2280次閱讀
    如何創建TestStand<b class='flag-5'>自定義</b>步驟

    請問multisim怎么自定義元器件?

    為什么我在multisim自定義元器件始終出不了想要的波形效果?同一個pspice模型我同學之前都定義正確了,現在我想再來試一下結果一直失敗
    發表于 09-10 06:16

    EtherCAT運動控制器PT/PVT實現用戶自定義軌跡規劃

    EtherCAT運動控制器PT/PVT實現用戶自定義軌跡規劃。
    的頭像 發表于 08-15 11:49 ?1143次閱讀
    EtherCAT運動控制器PT/PVT實現用戶<b class='flag-5'>自定義</b>軌跡規劃

    NVIDIA NeMo加速并簡化自定義模型開發

    如果企業希望充分發揮出 AI 的力量,就需要根據其行業需求量身定制的自定義模型。
    的頭像 發表于 07-26 11:17 ?1179次閱讀
    NVIDIA NeMo加速并簡化<b class='flag-5'>自定義</b>模型開發

    何在IDF框架中使用自定義的靜態庫和動態庫?

    基于商業需要,我們需要在 ESP-IDF v4.0-rc 這個版本的IDF開發與使用自定義庫,有如下問題請協助: 1如何利用IDF框架編寫自定義靜態庫和動態庫? 2如何在IDF框架中
    發表于 06-25 07:57
    主站蜘蛛池模板: 亚洲午夜顶级嘿嘿嘿影院 | 色噜噜狠狠狠综合曰曰曰 | 成人精品视频一区二区三区 | 亚洲一区二区影视 | 未满十八18周岁禁止免费国产 | 黄网站在线播放 | 色综合久久久久久久久久久 | 亚洲免费在线观看 | 曰本裸色私人影院噜噜噜影院 | 好紧好湿好黄的视频 | 永久免费人成网ww555kkk手机 | 午夜欧美精品久久久久久久久 | 成人伊在线影院 | 二区三区在线 | 色狠狠综合网 | xx综合网| 免费两性的视频网站 | 天天插天天搞 | 伊人天堂在线 | 久久亚洲成人 | 久青草国产手机在线观 | 四虎4545www国产精品 | 国产人人爱 | 超级乱淫视频播放日韩 | 天天色天天射天天干 | 女女综合网 | 美女被啪到哭网站在线观看 | 免费看美女午夜大片 | 色婷婷婷丁香亚洲综合不卡 | xxxxbbbb欧美| 亚洲一区二区三区深夜天堂 | 韩国床戏合集三小时hd中字 | 天天色天天舔 | 亚洲激情四射 | 男人天堂网在线观看 | a毛片网站 | 久久99久久精品97久久综合 | 久久精品国产99久久72 | 伊人网址 | 亚洲欧美人成网站综合在线 | 成年女人色费视频免费 |