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

下載本文檔

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

文檔簡介

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

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

3、因?yàn)檫@里僅僅是討論如何在12864上打點(diǎn)的,而不是給12864寫一個驅(qū)動,所以對于基本的數(shù)據(jù)讀寫函數(shù),我們不做討論,這里假設(shè)已經(jīng)有了如下基本函數(shù):view sourceprint?1void lcd_write_cmd(unsigned char);   /lcd 命令寫 2void lcd_write_data(unsigned char);  /lcd 數(shù)據(jù)寫 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         /繪圖顯示開 4#define

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

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

7、160;               /注意一個地址是16位的 07  x_bit = x % 16;                     /算出它在哪一個位 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);        /先寫垂直地址(第幾

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

11、160;        /如果x_bit位數(shù)小于8 20   21      lcd_write_data(0x01 << (7 - x_bit);     /寫高字節(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);                     /打開繪圖顯示 31  

15、;lcd_write_cmd(BASIC_SET);                   /回到基本指令集,畢竟ST7920是以字符為主的(不回也行) 32  return ; 33 上面的程序會出現(xiàn)問題,原因是因?yàn)槲覀儺孅c(diǎn)時對其余的位全部填0處理了,造成對原來的信息的破壞。所以我們要讀出要寫的那個地址原來的數(shù)據(jù),再進(jì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)的哪一個字節(jié),哪一個位 04  unsigned char y_ping, y_bit; /在縱坐標(biāo)的哪一屏,哪一行05  unsigned char tmph, tmpl;           /

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

18、60;             /算出它在哪一個位 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);        /先寫垂直地址(最高位必須為1) 19  lcd_write_cmd(0x80 + x_byte + 8 * y_ping);   /水平坐標(biāo), 下半屏的水平坐標(biāo)起始地址為0x88 , (+8*y_byte)就是用來確定在上半屏還是下半屏23  lcd_read_data()

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

22、#160;    /讀操作會改變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);  /寫高字節(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);       /打開繪圖顯示 40  lcd_write_cmd(BASIC_SET);     /回到基本指令集,畢竟ST7920是以字符

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論