![單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/0486d840-7a8e-4dcb-b082-8ad8648cb952/0486d840-7a8e-4dcb-b082-8ad8648cb9521.gif)
![單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/0486d840-7a8e-4dcb-b082-8ad8648cb952/0486d840-7a8e-4dcb-b082-8ad8648cb9522.gif)
![單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/0486d840-7a8e-4dcb-b082-8ad8648cb952/0486d840-7a8e-4dcb-b082-8ad8648cb9523.gif)
![單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/0486d840-7a8e-4dcb-b082-8ad8648cb952/0486d840-7a8e-4dcb-b082-8ad8648cb9524.gif)
![單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/0486d840-7a8e-4dcb-b082-8ad8648cb952/0486d840-7a8e-4dcb-b082-8ad8648cb9525.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、51單片機(jī)驅(qū)動(dòng)LCD1602程序設(shè)計(jì)(C語(yǔ)言)電子愛(ài)好者社區(qū)4M#vfm/EZ4y字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來(lái)的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣,定義如下表所示:
2、; 字符型LCD的引腳定義HD44780內(nèi)置了DDRAM、CGROM和CGRAM。DDRAM就是顯示數(shù)據(jù)RAM,用來(lái)寄存待顯示的字符代碼。共80個(gè)字節(jié),其地址和屏幕的對(duì)應(yīng)關(guān)系如下表:也就是說(shuō)想要在LCD1602屏幕的第一行第一列顯示一個(gè)"A"字,就要向DDRAM的00H地址寫入“A”字的代碼就行了。但具體的寫入是要按LCD模塊的指令格式來(lái)進(jìn)行的。在1602中我們用前16個(gè)就行了。第二行也一樣用前1
3、6個(gè)地址。對(duì)應(yīng)如下: DDRAM地址與顯示位置的對(duì)應(yīng)關(guān)系電子愛(ài)好者社區(qū)-l:t#Vu(T S文本文件中每一個(gè)字符都是用一個(gè)字節(jié)的代碼記錄的。一個(gè)漢字是用兩個(gè)字節(jié)的代碼記錄。在PC上我們只要打開(kāi)文本文件就能在屏幕上看到對(duì)應(yīng)的字符是因?yàn)樵诓僮飨到y(tǒng)里和BIOS里都固化有字符字模。什么是字模?就代表了是在點(diǎn)陣屏幕上點(diǎn)亮
4、和熄滅的信息數(shù)據(jù)。例如“A”字的字模: 01110 10001 10001 10001
5、; 11111 10001 10001 上圖左邊的數(shù)據(jù)就是字模數(shù)據(jù),右邊就是將左邊數(shù)據(jù)用“”代表0,用“”代表1??闯鍪莻€(gè)“A”字了嗎?在文本文件中“A”字的代碼是41H,PC收到41H的代碼后就去字模文件中將代表A字的這一組數(shù)據(jù)送到顯卡去點(diǎn)亮屏幕上相應(yīng)的點(diǎn),你就看到“A”這
6、個(gè)字了。 剛才說(shuō)了想要在LCD1602屏幕的第一行第一列顯示一個(gè)"A"字,就要向DDRAM的00H地址寫入“A”字的代碼41H就行了,可41H這一個(gè)字節(jié)的代碼如何才能讓LCD模塊在屏幕的陣點(diǎn)上顯示“A”字呢?同樣,在LCD模塊上也固化了字模存儲(chǔ)器,這就是CGROM和CGRAM。HD44780內(nèi)置了192個(gè)常用字符的字模,存于字符產(chǎn)生器CGROM(Character Generator ROM)中,另外還有8個(gè)允許用戶自定義的字符產(chǎn)生RAM,稱為CGRAM(Character Generator RAM)。下圖說(shuō)明了CGROM和CGRAM與字符的對(duì)應(yīng)關(guān)系。電子愛(ài)好者社區(qū)5u
7、C*M.a+gj/_+a6LI a 從上圖可以看出,“A”字的對(duì)應(yīng)上面高位代碼為0100,對(duì)應(yīng)左邊低位代碼為0001,合起來(lái)就是01000001,也就是41H??梢?jiàn)它的代碼與我們PC中的字符代碼是基本一致的。因此我們?cè)谙駾DRAM寫C51字符代碼程序時(shí)甚至可以直接用P1'A'這樣的方法。PC在編譯時(shí)就把“A”先轉(zhuǎn)為41H代碼了。 字符代碼0x000x0F為用戶自定義的字符圖形RAM(對(duì)于5X8點(diǎn)陣的字符,可以存放8組,5X10點(diǎn)陣的字符,存放4組),就是CGRAM了。后面我會(huì)詳細(xì)說(shuō)的。 0x200x7F為標(biāo)準(zhǔn)的ASCII碼,0xA00xFF為日文字符和希臘文字符,其余字符碼(0
8、x100x1F及0x800x9F)沒(méi)有定義。那么如何對(duì)DDRAM的內(nèi)容和地址進(jìn)行具體操作呢,下面先說(shuō)說(shuō)HD44780的指令集及其設(shè)置說(shuō)明,請(qǐng)瀏覽該指令集,并找出對(duì)DDRAM的內(nèi)容和地址進(jìn)行操作的指令。共11條指令:1.清屏指令功能:<1> 清除液晶顯示器,即將DDRAM的內(nèi)容全部填入"空白"的ASCII碼20H; <2> 光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方;
9、 <3> 將地址計(jì)數(shù)器(AC)的值設(shè)為0。2.光標(biāo)歸位指令 功能:<1> 把光標(biāo)撤回到顯示器的左上方; <2> 把地址計(jì)數(shù)器(AC)的值設(shè)置為0; <3> 保持DDRAM的內(nèi)容不變。 3.進(jìn)入模式設(shè)
10、置指令功能:設(shè)定每次定入1位數(shù)據(jù)后光標(biāo)的移位方向,并且設(shè)定每次寫入的一個(gè)字符是否移動(dòng)。參數(shù)設(shè)定的 情況如下所示:位名 設(shè)置I/D 0=寫入新數(shù)據(jù)后光標(biāo)左移 1=寫入新數(shù)據(jù)后光標(biāo)右移S 0=寫入
11、新數(shù)據(jù)后顯示屏不移動(dòng) 1=寫入新數(shù)據(jù)后顯示屏整體右移1個(gè)字符4.顯示開(kāi)關(guān)控制指令功能:控制顯示器開(kāi)/關(guān)、光標(biāo)顯示/關(guān)閉以及光標(biāo)是否閃爍。參數(shù)設(shè)定的情況如下: 位名 設(shè)置
12、 D 0=顯示功能關(guān) 1=顯示功能開(kāi)
13、 C 0=無(wú)光標(biāo) 1=有光標(biāo)
14、0; B 0=光標(biāo)閃爍 1=光標(biāo)不閃爍5.設(shè)定顯示屏或光標(biāo)移動(dòng)方向指令功能:使光標(biāo)移位或使整個(gè)顯示屏幕移位。參數(shù)設(shè)定的情
15、況如下: S/C R/L 設(shè)定情況 &
16、#160; 0 0 光標(biāo)左移1格,且AC值減1 &
17、#160; 0 1 光標(biāo)右移1格,且AC值加1 &
18、#160; 1 0 顯示器上字符全部左移一格,但
19、光標(biāo)不動(dòng) 1 1 顯示器
20、上字符全部右移一格,但光標(biāo)不動(dòng)6.功能設(shè)定指令功能:設(shè)定數(shù)據(jù)總線位數(shù)、顯示的行數(shù)及字型。參數(shù)設(shè)定的情況如下: 位名 設(shè)置
21、 DL 0=數(shù)據(jù)總線為4位 1=數(shù)據(jù)總線為8位 &
22、#160; N 0=顯示1行 1=顯示2行
23、60; F 0=5×7點(diǎn)陣/每字符 1=5×10點(diǎn)陣/每字符7.設(shè)定CGRAM地址指令功
24、能:設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM的地址。8.設(shè)定DDRAM地址指令功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM的地址。9.讀取忙信號(hào)或AC地址指令功能:<1> 讀取忙碌信號(hào)BF的內(nèi)容,BF=1表示液晶顯示器忙,暫時(shí)無(wú)法接收單片機(jī)送來(lái)的數(shù)據(jù)或指令;當(dāng)BF=0時(shí),液晶顯示器可以接收單片機(jī)送來(lái)的數(shù)據(jù)或指令; <2> 讀取地址計(jì)數(shù)器(AC)的內(nèi)容。10.數(shù)據(jù)寫入DDRAM或CGRAM指令一覽功能:<1> 將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對(duì)應(yīng)的字符;&
25、#160; <2> 將使用者自己設(shè)計(jì)的圖形存入CGRAM。11.從CGRAM或DDRAM讀出數(shù)據(jù)的指令一覽功能:讀取DDRAM或CGRAM中的內(nèi)容?;静僮鲿r(shí)序:讀狀態(tài) 輸入:RS=L,RW=H,E=H 輸出:DB0DB7=狀態(tài)字寫指令 輸入:RS=L,
26、RW=L,E=下降沿脈沖,DB0DB7=指令碼 輸出:無(wú)讀數(shù)據(jù) 輸入:RS=H,RW=H,E=H 輸出:DB0DB7=數(shù)據(jù)寫數(shù)據(jù) 輸入:RS=H,RW=L,E=下降沿脈沖,DB0DB7=數(shù)據(jù) 輸出:無(wú)顯示操作的過(guò)程:電子愛(ài)好者社區(qū)Ta o首先確認(rèn)顯示的位置,即在第幾行,第幾個(gè)字符開(kāi)始顯示。也就是要顯示的地址,如下表所示的顯示地址。電子愛(ài)好者社區(qū) A3AV4Q P電子愛(ài)好者社區(qū)+U*d3_vk/d Z;s -g6s)X u%Eg0
27、電子愛(ài)好者社區(qū)gIXz3kgJ 第一行的顯示地址是0x800x8F,第二行的顯示地址是0xC00xCF。例如想要在第2行,第3個(gè)位置顯示一個(gè)字符,那么地址碼就是 0xC2。在編程過(guò)程中,通常編寫一個(gè)函數(shù)確定在某行某個(gè)位置顯示數(shù)據(jù)。函數(shù)需要 行參數(shù)(y),和 列參數(shù)(x)來(lái)確定顯示位置。程序參考如下:v9r9Ish+L5k0/*設(shè)置顯示位置*/3rigBZ0void LCD_set_xy( unsigned char x, unsigned char y )電子愛(ài)好者社區(qū) q,vF|%U8A/?gZ6n Et3Q0unsigned char address;Z K/Bk;7l-0
28、160; if (0 = y) x |= 0x80; /當(dāng)要顯示第一行時(shí)地址碼+0x80;電子愛(ài)好者社區(qū)siTizS,l else x |= 0xC0; /在第二行顯示是地址碼+0xC0;電子愛(ài)好者社區(qū);| QE_2Q&I NP'c Write_com(x); /發(fā)送地址碼 0x80-0x8F 或者0xC00xCF7TS$ogC(f t+Z6d6O UbK0 1c/.JBD0其次設(shè)置要顯示的內(nèi)容,即上面提到的CGROM內(nèi)的字符編碼。如顯示“A”,將編碼41H寫
29、入到液晶屏顯示即可。通常設(shè)置地址和顯示內(nèi)容用一個(gè)函數(shù)來(lái)完成。代碼參考如下:電子愛(ài)好者社區(qū)B8UiW(-X5s/功能:按指定位置顯示一個(gè)字符電子愛(ài)好者社區(qū)+kI5!x&q1Z/輸入:列顯示地址x(取值范圍0-15) 行顯示地址y(取值范圍0-1), 指定字符電子愛(ài)好者社區(qū),qZv0zqLKCJDvoid DisplayOneChar(unsigned char x, unsigned char y, unsigned char Data)21Q1.J;eZ0電子愛(ài)好者社區(qū)r&z#Q(J4jCf"J:D if (0 = y) x |=
30、0x80; /當(dāng)要顯示第一行時(shí)地址碼+0x80;電子愛(ài)好者社區(qū)"p;q'o'M9k.nj6H else x |= 0xC0; /在第二行顯示是地址碼+0xC0;Sm.w,*a0 Write_com(x); /發(fā)送地址碼電子愛(ài)好者社區(qū)I*XP"%xK Write_dat(Data); /發(fā)送要顯示的字符編碼電子愛(ài)好者社區(qū)MI)Y8s CTntn,h X Cu10T)y(f0顯示字符“A”調(diào)用過(guò)程如下代碼:pa,I!H6_WWgx"P0Displ
31、ayOneChar(0,0,0x41);/功能:在第1行 第1個(gè)字符 顯示一個(gè)大寫字母AXTPf#O'k0在C語(yǔ)言操作時(shí),還可以顯示整個(gè)字符串。定義一個(gè)字符串顯示函數(shù),可以通過(guò)直接輸入字符方式進(jìn)行顯示BlccL6xh Z0/功能:按指定位置顯示一串字符電子愛(ài)好者社區(qū)- eaEpD/輸入:列顯示地址x(取值范圍0-15) 行顯示地址y(取值范圍0-1), 指定字符串指針*p,要顯示的字符個(gè)數(shù)count (取值范圍1-16)o o;kMw0void DisplayListChar (unsigned char x,unsigned char y,unsigned char *p,unsig
32、ned char count)電子愛(ài)好者社區(qū)#Q1M4V b/CY2B V2;_0unsigned char i; 電子愛(ài)好者社區(qū)9k4lq:h&Fm*W for(i=0;i<count;i+)電子愛(ài)好者社區(qū),fEaA 電子愛(ài)好者社區(qū) |5u)yi(d:u1dkfT if (0 = y) x |= 0x80; /當(dāng)要顯示第一行時(shí)地址碼+0x80;H(Fm96eq9 N0Mr#r0 &
33、#160; else x |= 0xC0; /在第二行顯示是地址碼+0xC0;電子愛(ài)好者社區(qū)Ib4on D Write_com(x); /發(fā)送地址碼/z:t RFu9-N0 Write_dat(*p); /發(fā)送要顯示的字符編碼#U" (CIh0 x+;Q!rcs-Cy8P0
34、160; p+;"J:o/_2DNW0 4Yq82W +W0 J P"A00調(diào)用方法如下:電子愛(ài)好者社區(qū)jnH9bu+_|kDisplayListChar(0,0,"hello world",11); /液晶1602第一行顯示電子愛(ài)好者社區(qū)i)K MTAqDisplayListChar(0,1,&
35、quot;",12); /液晶1602第二行顯示舉個(gè)實(shí)例,就在LCD1602屏幕上第一行第一列顯示個(gè)“A”字。/先定義接口# include <AT89x51.h>/* P1-DB0DB7 P2.0-RS &
36、#160; P2.1-RW P2.2
37、-E*/# define LCD_DB P1 sbit LCD_RS=P20; sbit LCD_RW=P21;
38、0; sbit LCD_E=P22;/*定義函數(shù)*/# define uchar unsigned char# define uint unsigned intvoid LCD_init(void);/初始化函數(shù)void LCD_write_command(uchar command);/寫指令函數(shù)void LCD_write_data(uchar dat);/寫數(shù)據(jù)函數(shù)void LCD_disp_char(uchar x,uchar y,uchar dat);/
39、在某個(gè)屏幕位置上顯示一個(gè)字符,X(0-16),y(1-2)/void LCD_check_busy(void);/檢查忙函數(shù)。我沒(méi)用到此函數(shù),因?yàn)橥ㄟ^(guò)率極低。void delay_n40us(uint n);/延時(shí)函數(shù)/*/*初始化函數(shù)*void LCD_init(void)LCD_write_command(0x38);/設(shè)置8位格式,2行,5x7LCD_write_command(0x0c);/整體顯示,關(guān)光標(biāo),不閃爍LCD_write_command(0x06);/設(shè)定輸入方式,增量不移位LCD_write_command(0x01);/清除屏幕顯示delay_n40us(100);/實(shí)
40、踐證明,用for循環(huán)200次就能可靠完成清屏指令。/*/*寫指令函數(shù)*void LCD_write_command(uchar dat)LCD_DB=dat;LCD_RS=0;/指令LCD_RW=0;/寫入LCD_E=1;/允許LCD_E=0;delay_n40us(1);/實(shí)踐證明,我的LCD1602上,用for循環(huán)1次就能完成普通寫指令。/*/*寫數(shù)據(jù)函數(shù)*void LCD_write_data(uchar dat)LCD_DB=dat;LCD_RS=1;/數(shù)據(jù)LCD_RW=0;/寫入LCD_E=1;/允許LCD_E=0;delay_n40us(1);/*/*顯示一個(gè)字符函數(shù)*void L
41、CD_disp_char(uchar x,uchar y,uchar dat)uchar address;if(y=1) address=0x80+x;else address=0xc0+x;LCD_write_command(address);LCD_write_data(dat);/*/*檢查忙函數(shù)*void LCD_check_busy()
42、 /實(shí)踐證明,在我的LCD1602上,檢查忙指令通過(guò)率極低,以 /至于不能正常使用LCD。因此我沒(méi)有再用檢查
43、忙函數(shù)。而使do /用了延時(shí)的方法,延時(shí)還是非常好用的。我試了一下,用 &
44、#160; LCD_E=0; /for循環(huán)作延時(shí),普通指令只要1次循就可完成。清屏指令 LCD_RS=0; &
45、#160; /要用200次循環(huán)便能完成。 LCD_RW=1; LCD_DB=0xff; LCD_E=1; while(LCD_DB7
46、=1);*/*延時(shí)函數(shù)*void delay_n40us(uint n) uint i; uchar j; for(i=n;i>0;i-) for(j=0;j<2;j+);
47、0; /在這個(gè)延時(shí)循環(huán)函數(shù)中我只做了2次循環(huán), &
48、#160; /實(shí)踐證明我的LCD1602上普通的指令只需1次循環(huán)就能可靠完成。/*/*主函數(shù)*void main(void) LCD_init(); LCD_disp_char(0,1,A); while(1);/*具體電路的制作是很簡(jiǎn)單的,就接了兩個(gè)電阻,一個(gè)是10歐姆的背光限流電阻,另一個(gè)是2K的LCD極板電壓調(diào)節(jié)電阻。這兩個(gè)電阻
49、的阻值怎么定呢?背光比較簡(jiǎn)單,它就相當(dāng)于在后面接了幾個(gè)發(fā)光二極管,任何時(shí)候你只要在15、16腳串上個(gè)100歐的電位器接上電源,調(diào)節(jié)電位器,覺(jué)得亮度合適。此時(shí)的阻值便可。LCD液晶極板驅(qū)動(dòng)電壓調(diào)節(jié)電阻的確定就稍微麻煩一點(diǎn)。在各數(shù)據(jù)線,控制線接好關(guān)通上電源的前提下在第3腳(VEE)和地之間接一個(gè)10K的電位器。調(diào)節(jié)電位器。當(dāng)3腳電壓高時(shí)為全亮,電壓為0時(shí)為全暗(液晶全顯示為黑塊)。你用電位器把屏幕從全暗剛好調(diào)到變亮。這時(shí)便可調(diào)試程序。待屏幕能正確顯示后再細(xì)調(diào)電位器,使對(duì)比度合適。這時(shí)的阻值便可確定,然后換成等值的固定電阻焊上便可。組裝后: 具體電路圖: 接口說(shuō)明: 我們從CGROM表上可以看到,在
50、表的最左邊是一列可以允許用戶自定義的CGRAM,從上往下看著是16個(gè),實(shí)際只有8個(gè)字節(jié)可用。它的字符碼是0000000000000111這8個(gè)地址,表的下面還有8個(gè)字節(jié),但因?yàn)檫@個(gè)CGRAM的字符碼規(guī)定02位為地址,3位無(wú)效,47全為零。因此CGRAM的字符碼只有最后三位能用也就是8個(gè)字節(jié)了。等效為0000X111,X為無(wú)效位,最后三位為000111共8個(gè)。 如果我們要想顯示這8個(gè)用戶自定義的字符,操作方法和顯示CGROM的一樣,先設(shè)置DDRAM位置,再向DDRAM寫入字符碼,例如“A”就是41H?,F(xiàn)在我們要顯示CGRAM的第一個(gè)自定義字符,就向DDRAM寫入00000000B(00H),如果
51、要顯示第8個(gè)就寫入00000111(08H),簡(jiǎn)單吧! 現(xiàn)在我們來(lái)看怎么向這八個(gè)自定義字符寫入字模。有個(gè)設(shè)置CGRAM地址的指令大家還記得嗎?趕快再找出來(lái)看看。從這個(gè)指令可以看出指令數(shù)據(jù)的高2位已固定是01,只有后面的6位是地址數(shù)據(jù),而這6位中的高3位就表示這八個(gè)自定義字符,最后的3位就是字模數(shù)據(jù)的八個(gè)地址了。例如第一個(gè)自定義字符的字模地址為0100000001000111八個(gè)地址。我們向這8個(gè)字節(jié)寫入字模數(shù)據(jù),讓它能顯示出“”地址:01000000數(shù)據(jù):00010000 圖示:0100000100000110
52、 0100001000001001 0100001100001000 0100010000001000
53、60; 0100010100001001 0100011000000110 0100011100000000
54、 可以通過(guò)手動(dòng)提取的方法。如下圖所示,對(duì)應(yīng)一個(gè)字符顯示區(qū)域。每8個(gè)字節(jié),組成一個(gè)點(diǎn)陣數(shù)組。!R%US5e W B(o Y9|(yn&B0 6|6V0J3kpawZ;_0 電子愛(ài)好者社區(qū) S?$c.L#yC“日”的點(diǎn)陣數(shù)組即為 0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00 B$W+OHb4E;w 0電子愛(ài)好者社區(qū)ef-MgF"h(wtg.ZD:ZN0“車”字取模數(shù)組為
55、:0x00,0x0f,0x02,0x04,0x07,0x00,0x0f,0x00,電子愛(ài)好者社區(qū)Ri&?o5C 0x10,0x1e,0x00,0x10,0x1c,0x10,0x1e,0x10;q#XjX r&J%y0 C"OL AK c$x8V0 RH P4c!b8K%Vw4v0電子愛(ài)
56、好者社區(qū)+IN/B1I#Ig7z2iP?00Y JM5Q6d6D R10 將生成的點(diǎn)陣數(shù)組保存到CGRAM存儲(chǔ)器中,生成自定義字符。1602內(nèi)部CGRAM用于自定義的字符點(diǎn)陣的存儲(chǔ),總共64字節(jié)。由上一步點(diǎn)陣提取可知,每一個(gè)字符由8個(gè)字節(jié)數(shù)據(jù)組成。所以64字節(jié)CGRAM存儲(chǔ)器,能夠存儲(chǔ)8組自定義字符的點(diǎn)陣數(shù)組。按照CGRAM地址劃分為 07為第一組,815為第二組,依次類推5663為第8組數(shù)據(jù)。把自定義字符的數(shù)組按8個(gè)字節(jié)一組存儲(chǔ)到CGRAM中,程序代碼參考如下。Sl/U'W.?l7W0/功能:將自定義字符的編碼數(shù)組 寫入到CGRAM中.電子愛(ài)好者社
57、區(qū)VM/_CnJk/輸入:自定義字符的編碼數(shù)組電子愛(ài)好者社區(qū)!;Dmx,Qnvoid Write_CGRAM(unsigned char *p)電子愛(ài)好者社區(qū)UiW)I5I*DVu H1Q E7|%I:jf&K/w0unsigned char i,j,kk;電子愛(ài)好者社區(qū) 8D r1ML B S;sunsigned char tmp=0x40; /操作CGRAM的命令碼+U"d DgT;M0kk=0;電子愛(ài)好者社區(qū)fAE vdSj*Gfor(j=0;j<8;j+) /64 字
58、節(jié)存儲(chǔ)空間,可以生成 8 個(gè)自定義字符點(diǎn)陣R#gO1KqY0電子愛(ài)好者社區(qū)X$?9M%i6a5f'BG for(i=0;i<8;i+) / 8 個(gè)字節(jié)生成 1 個(gè)字符點(diǎn)陣電子愛(ài)好者社區(qū)x Et;jL/g_5 jh*aQ,F y;Q5lU(GV?0 Write_com(tmp+i); /操作CGRAM的命令碼+寫入CGRAM地址.電子愛(ài)好者社區(qū)%q F)f,
59、uwBM(s4 Yo Write_dat(pkk); /寫入數(shù)據(jù)S. P)Y8BT;_?_i0 kk+;電子愛(ài)好者社區(qū)+I/m&YY AJ 電子愛(ài)好者社區(qū)o5Dvwqn"C2D tmp += 8;電子愛(ài)好者社區(qū) T9Ht5A#S,Py:LC'80 上一步中,自定
60、義字符存儲(chǔ)到CGRAM的任意一組以后,每一個(gè)組(8個(gè)字節(jié))也有一個(gè)顯示編碼。按順序依次為00H07H 。顯示時(shí),只要調(diào)用每一組的編碼,即可以顯示相應(yīng)的字符。電子愛(ài)好者社區(qū)BeSk電子愛(ài)好者社區(qū) E40l/M? 電子愛(ài)好者社區(qū)y7!Utp注:內(nèi)部常用字符顯示時(shí),顯示編碼是從0x20開(kāi)始的。0x000x0f是專門留給自定義字符顯示的。0x000x07和0x080x0f內(nèi)容是一樣的。例如:調(diào)用0x01 位置和0x09位置,顯示的內(nèi)容是一樣的。Y"P5sy1h"4Nt0 直接按照單個(gè)字符的顯示方式調(diào)用顯示函數(shù),就可以顯示自定義字符了。代碼參考如下
61、:-Y A9G l02vK0 /在第1行,第7個(gè)位置顯示自定義漢字 “年”電子愛(ài)好者社區(qū) 9D7wc!lUQ1q DisplayOneChar(6,0,0); /顯示 "年" /CGRAM 碼 006I3N3H lL0說(shuō)明:此時(shí)“年”的8個(gè)字節(jié)點(diǎn)陣數(shù)組 ,存儲(chǔ)空間為CGRAM的 0007地址電子愛(ài)好者社區(qū)4u'y"lsq*UG也就是CGRAM的第1組數(shù)據(jù)存儲(chǔ)區(qū)域,編碼為0。 如果存儲(chǔ)在CGRAM的0815地址,那么編碼就應(yīng)該是 1了。 x S R$YM*N0很多
62、資料中,都沒(méi)有詳細(xì)介紹過(guò)CGRAM和CGROM的區(qū)別和用法,在1602調(diào)試過(guò)程中經(jīng)常會(huì)被搞混。這里總結(jié)一點(diǎn)小技巧,希望能給需要的人一點(diǎn)幫助。F?(R_7i0d(Q30以下是顯示效果:電子愛(ài)好者社區(qū)1Oe0c qn3*AC電子愛(ài)好者社區(qū) aI1pd#3 *p|m!O l電子愛(ài)好者社區(qū)0X2j*x9kZb#Q單個(gè)和兩個(gè)點(diǎn)陣的漢字顯示:電子愛(ài)好者社區(qū)dm ng4S電子愛(ài)好者社區(qū)4j6B5A*T0V$U :q!?X0 電子愛(ài)好者社區(qū)1Sh6_J:_lE%:y圖形顯示效果:電子愛(ài)好者社區(qū)Nu*cz下面一段程序讓這8個(gè)自定義字符顯示出一個(gè)心的圖案:# include <reg51.h>unsi
63、gned char table1=0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
64、0; 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
65、; 0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E, 0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00, &
66、#160; 0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01, 0
67、x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00, 0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00;/心圖案unsigned char table=0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00;
68、/字符 #define CLEARSCREEN LCD_write_command(0x01)/*定義接口*/#define LCDIO P2sbit LCD1602_RS=P30; sbit LCD1602_RW=P31; sbit LCD1602_EN=P32; /*定義函數(shù)*
69、/void LCD_write_command(unsigned char command);/寫入指令函數(shù)void LCD_write_dat(unsigned char dat);/寫入數(shù)據(jù)函數(shù)void LCD_set_xy( unsigned char x, unsigned char y );/設(shè)置顯示位置函數(shù)void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);/顯示一個(gè)字符函數(shù)void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char
70、*s);/顯示字符串函數(shù)void LCD_init(void);/初始化函數(shù)void delay_nms(unsigned int n);/延時(shí)函數(shù)/*/*初始化函數(shù)*/void LCD_init(void) CLEARSCREEN;/clear screen LCD_write_command(0x38);/set 8 bit data transmission mode LCD_write_command(0x0c);/open display (enable lcd display)LCD_write_command(0x80);/set lcd first display addres
71、s CLEARSCREEN;/clear screen/*/*寫指令函數(shù)*/ void LCD_write_command(unsigned char command) LCDIO=command; LCD1602_RS=0; LCD1602_RW=0; LCD1602_EN=0;
72、0; LCD1602_EN=1; delay_nms(10);/*/*寫數(shù)據(jù)函數(shù)*/void LCD_write_dat(unsigned char dat)LCDIO=dat;LCD1602_RS=1;LCD1602_RW=0;LCD1602_EN=0;delay_nms(1);LCD1602_EN=1;/*/*設(shè)置顯示位置*/void LCD_set_xy( unsigned char x, unsigned char y )unsigned char address;if (y = 1)
73、160; address = 0x80 + x;else address =0xc0+ x;LCD_write_command(address); /*/*顯示一個(gè)字符*/void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)LCD_set_xy( x, y ); LCD_write_dat(dat);/*/*顯示字符串函數(shù)*/void LCD_dsp_string(unsigned char X,u
74、nsigned char Y,unsigned char *s) LCD_set_xy( X, Y ); while (*s) LCD_write_dat(*s);
75、 s +; /*/* 延時(shí)*/void delay_nms(unsigned int n) unsigned int i=0,j=0; for (i=n;i>0;i-) for (j=0;j<
76、10;j+); /*/*主函數(shù)*/void main(void)unsigned char i,j,k,tmp;LCD_init();delay_nms(100);tmp=0x40;/設(shè)置CGRAM地址的格式字k=0;for(j=0;j<8;j+) for(i=0;i<8;i+)
77、60; LCD_write_command(tmp+i); / 設(shè)置自定義字符的 CGRAM 地址 delay_nms(2); LCD_write_dat(table1k); / 向CGRAM寫入自定義字符表的數(shù)據(jù) &
78、#160; k+; delay_nms(2); tmp=tmp+8; LCD_dsp_string(1,1,"LCD TEST ");/在第一行第一列顯示“LCD TEST” LCD_dsp_string(1,2,"SUCCESSFUL ");/在第二行第一列顯示“SUCCESSFUL” for (i=0;i<4;i+)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 3 Where did you go(說(shuō)課稿)-2023-2024學(xué)年人教PEP版英語(yǔ)六年級(jí)下冊(cè)
- Unit 6 Review Period 4 (說(shuō)課稿)-2024-2025學(xué)年北師大版(三起)英語(yǔ)三年級(jí)上冊(cè)
- 《1、了解學(xué)習(xí)好習(xí)慣》(說(shuō)課稿)-2024-2025學(xué)年二年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)魯科版
- 《10 交通安全小常識(shí)》(說(shuō)課稿)-2023-2024學(xué)年四年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)長(zhǎng)春版
- 23《梅蘭芳蓄須》說(shuō)課稿2024-2025學(xué)年統(tǒng)編版語(yǔ)文四年級(jí)上冊(cè)
- 14《我要的是葫蘆》第一課時(shí) 說(shuō)課稿-2024-2025學(xué)年語(yǔ)文二年級(jí)上冊(cè)統(tǒng)編版
- Unit5 The colourful world第三課時(shí)(說(shuō)課稿)-2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 2024-2025學(xué)年高中歷史 第四單元 工業(yè)文明沖擊下的改革 第12課 俄國(guó)農(nóng)奴制改革(2)教學(xué)說(shuō)課稿 岳麓版選修1
- 2025合同約定的“滯納金”是否可以視為違約金
- 2025建安施工合同文本
- TMS開(kāi)發(fā)業(yè)務(wù)需求文檔
- 關(guān)于公交隊(duì)長(zhǎng)述職的報(bào)告
- 2023年1月浙江高考英語(yǔ)聽(tīng)力試題及答案(含MP3+錄音原文)
- HI-IPDV10芯片產(chǎn)品開(kāi)發(fā)流程V10宣課件
- 房產(chǎn)抵押注銷申請(qǐng)表
- 【課件】第三課 蒙娜麗莎 課件高中美術(shù)湘美版美術(shù)鑒賞
- 堤防工程重點(diǎn)難點(diǎn)
- 象數(shù)療法好療效
- A320系列飛行訓(xùn)練課程:電子飛行儀表系統(tǒng)概況
- 2020新版?zhèn)€人征信報(bào)告模板
- 東芝空調(diào)維修故障代碼匯總
評(píng)論
0/150
提交評(píng)論