上打點(diǎn)及造字原理st_第1頁(yè)
上打點(diǎn)及造字原理st_第2頁(yè)
上打點(diǎn)及造字原理st_第3頁(yè)
上打點(diǎn)及造字原理st_第4頁(yè)
上打點(diǎn)及造字原理st_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、轉(zhuǎn)載.教你在12864上打點(diǎn)(基于ST7920控制器) 基于ST7920控制的12864液晶用于字符顯示很方便的,但它繪圖時(shí)先要關(guān)閉顯示,繪完后又要打開(kāi),速度會(huì)較慢,不如不帶字庫(kù)的,但也可用。首先,繪圖的基礎(chǔ)其實(shí)就是畫(huà)點(diǎn)。ST7920提供了用于繪圖的GDRAM(graph display RAM)。共 64×32 個(gè)字節(jié)的空間(由擴(kuò)充指令設(shè)定繪圖 RAM 地址),最多可以控制 256×64點(diǎn)陣的二維繪圖緩沖空間。在它的Datasheet給出了GDRAM的坐標(biāo)地址對(duì)照表:用坐標(biāo)表示,就是這樣:它的橫坐標(biāo)每一個(gè)地址都是16 位的。共16個(gè)地址,256位。 很明顯,它能控制256

2、*64像素的液晶屏,而我們的只是128*64像素液晶屏,顯然只用到它的一部分。 我剛開(kāi)始以為它對(duì)應(yīng)屏幕的繪圖RAM是這樣分布的(如紅色部分):結(jié)果栽了大根頭,后來(lái)終于弄明白,原來(lái)它對(duì)應(yīng)屏幕的GDRAM是這樣分布的:只要我們清楚了它的GDRAM和屏幕上像素點(diǎn)的映射(對(duì)應(yīng))關(guān)系,點(diǎn)亮對(duì)應(yīng)的像素點(diǎn)就容易多了。要點(diǎn)亮某一個(gè)像素點(diǎn),就是將這個(gè)像素點(diǎn)在GDRAM中對(duì)應(yīng)的位置1打點(diǎn)步驟-給你x,y的坐標(biāo),要你點(diǎn)亮一個(gè)點(diǎn),首先,我們要確定這個(gè)點(diǎn)是在上半屏還是下半屏,然后確定它是在那一行(縱坐標(biāo)Y),再確定它是在哪一個(gè)字節(jié)的哪一個(gè)位(也就是確定它在那一列,即橫坐標(biāo)X),最后,將該位置1下面我們邊寫(xiě)代碼邊討論。

3、因?yàn)檫@里僅僅是討論如何在12864上打點(diǎn)的,而不是給12864寫(xiě)一個(gè)驅(qū)動(dòng),所以對(duì)于基本的數(shù)據(jù)讀寫(xiě)函數(shù),我們不做討論,這里假設(shè)已經(jīng)有了如下基本函數(shù):view sourceprint?1void lcd_write_cmd(unsigned char);   /lcd 命令寫(xiě) 2void lcd_write_data(unsigned char);  /lcd 數(shù)據(jù)寫(xiě) 3unsigend char lcd_read_data(void);   /lcd 數(shù)據(jù)讀 為了方便,我們定義如下宏:1#define  BASIC_SET &

4、#160; 0x00          /基本指令集, 2#define  EXTEND_SET  0x00          /擴(kuò)展指令集 3#define  DRAW_ON     0x10         /繪圖顯示開(kāi) 4#define

5、0; DRAW_OFF    0x00          /繪圖顯示關(guān)點(diǎn)亮某一個(gè)點(diǎn)的函數(shù)(不完善):01void lcd_set_dot(unsigned char x, unsigned char y) 02 03  unsigned char x_byet, x_bit;        /在橫坐標(biāo)的哪一個(gè)字節(jié),哪一個(gè)位 04  unsigned char

6、 y_ping, y_bit; /在縱坐標(biāo)的哪一屏,哪一行05  x_byte = x / 16;               /算出它在哪一個(gè)字節(jié)(地址) 06                      &#

7、160;               /注意一個(gè)地址是16位的 07  x_bit = x % 16;                     /算出它在哪一個(gè)位 08  y_ping = y /32;

8、0;               / 確定在上半屏還是下半屏,0:上半屏 1:下半屏11  y_bit = y % 32;                     /y_bit確定它是在第幾行 12  lcd_

9、write_cmd(EXTEND_SET);          /擴(kuò)展指令集 13  lcd_write_cmd(DRAW_OFF);            /繪圖顯示關(guān)閉,繪圖前要先關(guān)閉 14  lcd_write_cmd(0x80 + y_bit);        /先寫(xiě)垂直地址(第幾

10、行),繪圖要先寫(xiě)垂直地址 16  lcd_write_cmd(0x80 + x_byte + 8 * y_ping);   /再寫(xiě)水平地址,下半屏的水平坐標(biāo)起始地址為0x88 ,(+8*y_byte)就是用來(lái)確定在上半屏還是下半屏19  if (x_bit < 8)                      &#

11、160;        /如果x_bit位數(shù)小于8 20   21      lcd_write_data(0x01 << (7 - x_bit);     /寫(xiě)高字節(jié)。因?yàn)樽鴺?biāo)是從左向右的 22                 

12、;                              /GDRAM高位在左,底位在右23      lcd_write_data(0x00);       

13、60;            /低字節(jié)全部填0 24   25  else26   27      lcd_write_data(0x00);                   

14、 /高字節(jié)全部填0低字節(jié)打入相應(yīng)的點(diǎn) 28      lcd_write_data(0x01 << (15 - x_bit); 29    30  lcd_write_cmd(DRAW_ON);                     /打開(kāi)繪圖顯示 31  

15、;lcd_write_cmd(BASIC_SET);                   /回到基本指令集,畢竟ST7920是以字符為主的(不回也行) 32  return ; 33 上面的程序會(huì)出現(xiàn)問(wèn)題,原因是因?yàn)槲覀儺?huà)點(diǎn)時(shí)對(duì)其余的位全部填0處理了,造成對(duì)原來(lái)的信息的破壞。所以我們要讀出要寫(xiě)的那個(gè)地址原來(lái)的數(shù)據(jù),再進(jìn)行加工,寫(xiě)回去就可以解決問(wèn)題了。 改進(jìn)后的代碼:01void lcd_set_d

16、ot(unsigned char x, unsigned char y) 02 03  unsigned char x_byet, x_bit;        /在橫坐標(biāo)的哪一個(gè)字節(jié),哪一個(gè)位 04  unsigned char y_ping, y_bit; /在縱坐標(biāo)的哪一屏,哪一行05  unsigned char tmph, tmpl;           /

17、/定義兩個(gè)臨時(shí)變量,用于存放讀出來(lái)的數(shù)據(jù) 06  x &= 0x7F; /不太理解,不要行嗎?、?、?07  y &= 0x3F; 08  x_byte = x / 16;            /算出它在哪一個(gè)字節(jié)(地址),注意一個(gè)地址是16位的10  x_bit = x&0x0F;       

18、60;             /算出它在哪一個(gè)位 11  Y_ping = y /32;                     /確定它在上半屏還是下半屏, 0:上半屏 1:下半屏 14  y_bit = y&0x3F;

19、0;                    /y_bit確定它是在第幾行 15  lcd_write_cmd(EXTEND_SET);          /擴(kuò)展指令集 16  lcd_write_cmd(DRAW_OFF);    

20、0;       /繪圖顯示關(guān)閉 17  lcd_write_cmd(0x80 + y_bit);        /先寫(xiě)垂直地址(最高位必須為1) 19  lcd_write_cmd(0x80 + x_byte + 8 * y_ping);   /水平坐標(biāo), 下半屏的水平坐標(biāo)起始地址為0x88 , (+8*y_byte)就是用來(lái)確定在上半屏還是下半屏23  lcd_read_data()

21、;                  /先空讀一次??這樣做對(duì)嗎? 24  tmph = lcd_read_data();       /讀高位 25  tmpl = lcd_read_data(); /讀低位26  lcd_write_cmd(0x80 + y_bit);  &

22、#160;    /讀操作會(huì)改變AC,所以重新設(shè)置一次 27  lcd_write_cmd(0x80 + x_byte + 8 * y_ping); 28  if (x_bit < 8)                            

23、/如果x_bit位數(shù)小于8 29   30     lcd_write_data(tmph | (0x01 << (7 - x_bit);  /寫(xiě)高字節(jié)。因?yàn)樽鴺?biāo)是從左向右的,GDRAM高位在左,底位在右 32      lcd_write_data(tmpl);               &#

24、160;         /原低位數(shù)據(jù)送回 33   34  else35   36      lcd_write_data(tmph);                      

25、;   /原高位數(shù)據(jù)送回 37      lcd_write_data(tmpl | (0x01 << (15 - x_bit); 38    39  lcd_write_cmd(DRAW_ON);       /打開(kāi)繪圖顯示 40  lcd_write_cmd(BASIC_SET);     /回到基本指令集,畢竟ST7920是以字符

26、為主的 41  return ; 42畫(huà)點(diǎn)函數(shù)到此就完成了,剩下的事情就是對(duì)函數(shù)的優(yōu)化了。例如對(duì)入口參數(shù)的檢查,對(duì)乘除法的優(yōu)化等等。12864(繪圖顯示)畫(huà)完一屏重畫(huà)會(huì)出現(xiàn)花屏現(xiàn)象,解決辦法1.花屏原因:帶中文字庫(kù)的LCD,使用圖形模式時(shí),應(yīng)對(duì)所有GDRAM寫(xiě)0x00才算清屏,清屏命令是對(duì)使用自帶字庫(kù)顯示時(shí)用的,對(duì)于畫(huà)圖不適用。2.GDRAM清屏程序:void LCD12864_DisplayCLR() uchar i, j, k ; LCD12864_IfBusy();/忙標(biāo)檢測(cè)LCD12864_WriteRom(0x34);/打開(kāi)擴(kuò)展指令集,8位數(shù)據(jù)傳輸lcd_writ

27、e_cmd(DRAW_OFF);            /繪圖顯示關(guān)閉  for( i = 0 ; i < 2 ; i+ )/分上下兩屏寫(xiě)            for( j = 0 ; j < 32 ; j+ )            LCD12864_IfBusy

28、();            LCD12864_WriteRom( 0x80 + j ) ;/寫(xiě)Y坐標(biāo)     Delay_50us(1);            if( i = 0 )             

29、0;      /寫(xiě)X坐標(biāo)                            LCD12864_WriteRom( 0x80 ) ;     Delay_50us(1);      &#

30、160;                 else /寫(xiě)下半屏                            LCD12864_WriteRom( 0x88 ) ; 

31、60;   Delay_50us(1);                        for( k = 0 ; k < 16 ; k+ )      /寫(xiě)一整行數(shù)據(jù)            &#

32、160;     LCD12864_IfBusy();                LCD12864_WriteData(0x00);/寫(xiě)高字節(jié)                LCD12864_WriteData(0x00);/寫(xiě)低字節(jié)  

33、0;  Delay_50us(1);                        LCD12864_WriteRom(0x36);/打開(kāi)擴(kuò)展指令集,繪圖顯示開(kāi)    LCD12864_WriteRom( 0x30 ) ;/關(guān)閉擴(kuò)展指令集如何在GDRAM寫(xiě)字!-用取模軟件就行了,這里只是簡(jiǎn)單的說(shuō)說(shuō)方法! 從“壁畫(huà)”記事到“甲骨文”- 在GDRAM中寫(xiě)字就可把字當(dāng)作圖形顯示!四、關(guān)于CGRAM的使用:CGRAM為使用者提供圖像定義(造字)功能,可以提供四組16*16點(diǎn)的自定義圖像空間,注意:網(wǎng)上說(shuō)ST7920芯片同屏幕不能顯示4個(gè)以上自定義漢字(用CGRAM)。顯示CGRAM字型:將16位元資料寫(xiě)入DDRAM中,一共有0000H,0002H,0004H,0006H四種編碼下載 (23.54 KB)2010-12-1 12:05下載 (21.55 KB)2010-12

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論