單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第1頁(yè)
單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第2頁(yè)
單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第3頁(yè)
單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第4頁(yè)
單片機(jī)驅(qū)動(dòng)LCD程序設(shè)計(jì)C語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論