![上打點(diǎn)及造字原理st_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/14ad1719-5f2c-48ed-9f53-f4d02526ada2/14ad1719-5f2c-48ed-9f53-f4d02526ada21.gif)
![上打點(diǎn)及造字原理st_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/14ad1719-5f2c-48ed-9f53-f4d02526ada2/14ad1719-5f2c-48ed-9f53-f4d02526ada22.gif)
![上打點(diǎn)及造字原理st_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/14ad1719-5f2c-48ed-9f53-f4d02526ada2/14ad1719-5f2c-48ed-9f53-f4d02526ada23.gif)
![上打點(diǎn)及造字原理st_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/14ad1719-5f2c-48ed-9f53-f4d02526ada2/14ad1719-5f2c-48ed-9f53-f4d02526ada24.gif)
![上打點(diǎn)及造字原理st_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/19/14ad1719-5f2c-48ed-9f53-f4d02526ada2/14ad1719-5f2c-48ed-9f53-f4d02526ada25.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 27533-2024犬細(xì)小病毒病診斷技術(shù)
- TTK-PLK1-IN-1-生命科學(xué)試劑-MCE-9304
- Paroxetine-d4-BRL29060-d-sub-4-sub-生命科學(xué)試劑-MCE-2193
- KIF18A-IN-16-生命科學(xué)試劑-MCE-8155
- 4-5-MDAI-hydrochloride-生命科學(xué)試劑-MCE-4662
- 1-3-Dioctanoyl-glycerol-生命科學(xué)試劑-MCE-8665
- 二零二五年度獨(dú)占許可協(xié)議名詞詳釋與合同糾紛處理
- 二零二五年度企業(yè)注冊(cè)及市場(chǎng)營(yíng)銷(xiāo)策劃合作協(xié)議
- 2025年度足浴店門(mén)面租賃合同模板(含供應(yīng)鏈管理)
- 二零二五年度股權(quán)分配與養(yǎng)老產(chǎn)業(yè)合作框架協(xié)議
- JTG 3362-2018公路鋼筋混凝土及預(yù)應(yīng)力混凝土橋涵設(shè)計(jì)規(guī)范
- 八年級(jí)下冊(cè)歷史思維導(dǎo)圖
- 電動(dòng)汽車(chē)用驅(qū)動(dòng)電機(jī)系統(tǒng)-編制說(shuō)明
- 江蘇卷2024年高三3月份模擬考試化學(xué)試題含解析
- (正式版)JTT 1497-2024 公路橋梁塔柱施工平臺(tái)及通道安全技術(shù)要求
- 醫(yī)療器械物價(jià)收費(fèi)申請(qǐng)流程
- 招聘專(zhuān)員轉(zhuǎn)正述職報(bào)告
- “一帶一路”背景下的西安市文化旅游外宣翻譯研究-基于生態(tài)翻譯學(xué)理論
- 2024年江蘇省昆山市六校中考聯(lián)考(一模)化學(xué)試題
- 大學(xué)生文學(xué)常識(shí)知識(shí)競(jìng)賽考試題庫(kù)500題(含答案)
- 國(guó)家電網(wǎng)智能化規(guī)劃總報(bào)告
評(píng)論
0/150
提交評(píng)論