12864液晶顯示圖片,畫點(diǎn),畫任意直線_第1頁(yè)
12864液晶顯示圖片,畫點(diǎn),畫任意直線_第2頁(yè)
12864液晶顯示圖片,畫點(diǎn),畫任意直線_第3頁(yè)
12864液晶顯示圖片,畫點(diǎn),畫任意直線_第4頁(yè)
12864液晶顯示圖片,畫點(diǎn),畫任意直線_第5頁(yè)
已閱讀5頁(yè),還剩2頁(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)介

#word格式支持編輯,如有幫助歡迎下載支持。玩轉(zhuǎn)12864液晶(2)--顯示圖片,畫點(diǎn),畫任意直線本帖被紅金龍吸味執(zhí)行加亮操作(2009-07-04)通過(guò)上一篇的實(shí)驗(yàn),相信大家都掌握了顯示字符的基本用法。下面我們來(lái)看一下12864液晶更高級(jí)的用法。首先是它的繪圖功能。讓我們先來(lái)顯示一整副的圖片吧,也就是128x64大小。在使用繪圖功能時(shí),先要打開擴(kuò)充指令集,然后再打開繪圖功能。接著就是送數(shù)據(jù)顯示了這里我們首先要弄明白ST7920的顯示坐標(biāo)關(guān)系。其顯示坐標(biāo)如下。X.顯示坐標(biāo)關(guān)系R聞程顯示坐標(biāo)fOCMJ4X8C,aCMJ4X3G_3.OCMJ4X8C_61GDRAM水平位址(對(duì)01i■■??q■7.1:1d')1011t12113111iL1GIT」-18■1920L1)1j2■t??■■藥26:?」-29泗+1■01J6I9IEQ——...■■■■IfJi11J11141Alin¥1?laif1..jTl■:o■■從圖中可以看出,X方向共有8個(gè)字(16個(gè)字節(jié))Y方向共有0?31行分為上下兩個(gè)屏弄懂了之后我們就可以依照此坐標(biāo)來(lái)顯示一整屏的圖片了。隨便用一個(gè)圖片的提取轉(zhuǎn)換軟件,講一副126X64大小的圖片轉(zhuǎn)換成字節(jié)數(shù)據(jù),總共字節(jié)大小為128*64/8=1024個(gè)字節(jié)。下面我們來(lái)看看這個(gè)顯示整屏圖像的函數(shù)voidv_Lcd12864DrawPicture_f(unsignedcharcode*pPicture){unsignedchari,j,k;for(i=0;i<2;i++)//分上下兩屏寫{for(j=0;j<32;j++){v_Lcd12864SendCmd_f(0x80+j);〃寫Y坐標(biāo)if(i==0)//寫X坐標(biāo){v_Lcd12864SendCmd_f(0x80);}else{v_Lcd12864SendCmd_f(0x88);}for(k=0;k<16;k++)//寫一整行數(shù)據(jù){v_Lcd12864SendData_f(*pPicture++);}}}v_Lcd12864SendCmd_f(0x30);}看看效果圖片如下:顯示一個(gè)人的圖像下面來(lái)看看如何在任意一個(gè)位置顯示或者是擦除一個(gè)點(diǎn)對(duì)于12864這種二值顯示屏來(lái)說(shuō),其顯示狀態(tài)無(wú)外乎顯示和不顯示一個(gè)點(diǎn)這兩種狀態(tài)。而在任意位置畫點(diǎn),是我們隨心所欲的畫線,畫圓,畫矩形的等GUI函數(shù)的基礎(chǔ)。為了讓這個(gè)位置有一個(gè)參考點(diǎn),我們有必要定義一個(gè)坐標(biāo)系在這里,我定義的坐標(biāo)系如下0,0127,0||||||||0,63127,630,0代表屏幕的左上角,127,63代表屏幕的右下角。對(duì)于屏幕上面任意一個(gè)點(diǎn),如果我們想要點(diǎn)亮它,必須先讀出此點(diǎn)的狀態(tài),然后再修改該點(diǎn),最后送出去,即讀修改寫。按照這個(gè)步驟,然后再運(yùn)用C語(yǔ)言中的位操作運(yùn)算符可以很方便的完成畫點(diǎn)的函數(shù)。由于畫點(diǎn)函數(shù)涉及到讀ST7920內(nèi)部RAM的操作,因此,我們必須先要完成這個(gè)讀數(shù)據(jù)的函數(shù)具體實(shí)現(xiàn)過(guò)程如下:unsignedcharu8_Lcd12864ReadByte_f(void){unsignedcharbyReturnValue;v_Lcd12864CheckBusy_f();io_LCD12864_DATAPORT=0xff;SET_DATASET_READCLR_ENSET_ENbyReturnValue=io_LCD12864_DATAPORT;CLR_ENreturnbyReturnValue;}然后是畫點(diǎn)的函數(shù),其實(shí)現(xiàn)過(guò)程如下:voidv_Lcd12864DrawPoint_f(unsignedcharX,unsignedcharY,unsignedcharColor){unsignedcharRow,Tier,Tier_bit;unsignedcharReadOldH,ReadOldL;v_Lcd12864SendCmd_f(0x34);設(shè)置擴(kuò)充指令集,關(guān)閉繪圖v_Lcd12864SendCmd_f(0x36);擴(kuò)充指令集,打開繪圖Tier=X>>4;列左移四位Tier_bit=X&0x0f;if(Y<32){Row=Y;}else{Row=Y-32;Tier+=8;}v_Lcd12864SendCmd_f(Row+0x80);v_Lcd12864SendCmd_f(Tier+0x80);u8_Lcd12864ReadByte_f();ReadOldH=u8_Lcd12864ReadByte_f();ReadOldL=u8_Lcd12864ReadByte_f();v_Lcd12864SendCmd_f(Row+0x80);v_Lcd12864SendCmd_f(Tier+0x80);if(Tier_bit<8){switch(Color){case0:ReadOldH&=(~(0x01<<(7-Tier_bit)));break;case1:ReadOldH|=(0x01<<(7-Tier_bit));break;case2:ReadOldHA=(0x01<<(7-Tier_bit));break;default:break;}v_Lcd12864SendData_f(ReadOldH);v_Lcd12864SendData_f(ReadOldL);}else{switch(Color){case0:ReadOldL&=(~(0x01<<(15-Tier_bit)));break;case1:ReadOldL|=(0x01<<(15-Tier_bit));break;case2:ReadOldLA=(0x01<<(15-Tier_bit));break;default:break;}v_Lcd12864SendData_f(ReadOldH);v_Lcd12864SendData_f(ReadOldL);}v_Lcd12864SendCmd_f(0x30);有了畫點(diǎn)的函數(shù)之后,一切似乎都變得簡(jiǎn)單了,因?yàn)辄c(diǎn)是一切復(fù)雜圖形的最基本的組成單位。下面我們就在這個(gè)畫點(diǎn)函數(shù)的基礎(chǔ)上,實(shí)現(xiàn)畫水平線和垂直線的兩個(gè)函數(shù)。畫水平線:voidv_Lcd12864DrawLineX_f(unsignedcharX0,unsignedcharX1,unsignedcharY,unsignedcharColor){unsignedcharTemp;if(X0>X1){Temp=X1;X1=X0;X0=Temp;}for(;X0<=X1;X0++)v_Lcd12864DrawPoint_f(X0,Y,Color);}畫垂直線:voidv_Lcd12864DrawLineY_f(unsignedcharX,unsignedcharY0,unsignedcharY1,unsignedcharColor){unsignedcharTemp;if(Y0>Y1){Temp=Y1;Y1=Y0;Y0=Temp;}for(;Y0<=Y1;Y0++)v_Lcd12864DrawPoint_f(X,Y0,Color);}下面我們就用以上兩個(gè)畫線函數(shù),在液晶屏上面畫一個(gè)表格出來(lái)v_Lcd12864DrawLineX_f(0,127,0,1);v_Lcd12864DrawLineX_f(0,127,7,1);v_Lcd12864DrawLineX_f(0,127,15,1);v_Lcd12864DrawLineX_f(0,127,23,1);v_Lcd12864DrawLineX_f(0,127,31,1);v_Lcd12864DrawLineX_f(0,127,39,1);v_Lcd12864DrawLineX_f(0,127,47,1);v_Lcd12864DrawLineX_f(0,127,55,1);v_Lcd12864DrawLineX_f(0,127,63,1);v_Lcd12864DrawLineY_f(0,0,63,1);v_Lcd12864DrawLineY_f(15,0,63,1);v_Lcd12864DrawLineY_f(31,0,63,1);v_Lcd12864DrawLineY_f(47,0,63,1);v_Lcd12864DrawLineY_f(63,0,63,1);v_Lcd12864DrawLineY_f(79,0,63,1);v_Lcd12864DrawLineY_f(95,0,63,1);v_Lcd12864DrawLineY_f(111,0,63,1);v_Lcd12864DrawLineY_f(127,0,63,1);會(huì)O倉(cāng)師◎軌礙朋會(huì)O倉(cāng)師◎軌礙朋看看顯示效果怎么樣,你的實(shí)現(xiàn)了嗎?只能畫水平線和垂直線似乎太簡(jiǎn)單和單調(diào)點(diǎn)了。要是能在任意兩點(diǎn)間畫一條直線就好了,那樣我們就可以做很多事情了。下面就讓我們?nèi)?shí)現(xiàn)它!在這里我們采用Bresenham畫線算法,關(guān)于這個(gè)算法,網(wǎng)上有很多資料,請(qǐng)大家以它為關(guān)鍵字到網(wǎng)上去搜索,在這里就不啰嗦了。下面是算法的具體實(shí)現(xiàn)過(guò)程:voidv_Lcd12864DrawLine_f(unsignedcharStartX,unsignedcharStartY,unsignedcharEndX,unsignedcharEndY,unsignedcharColor){intt,distance;/*根據(jù)屏幕大小改變變量類型(如改為int型)*/intx=0,y=0,delta_x,delta_y;charincx,incy;delta_x=EndX-StartX;delta_y=EndY-StartY;if(delta_x>0){incx=1;}elseif(delta_x==0){v_Lcd12864DrawLineY_f(StartX,StartY,EndY,Color);return;}else{incx=-1;}if(delta_y>0){incy=1;}elseif(delta_y==0){v_Lcd12864DrawLineX_f(StartX,EndX,StartY,Color);return;}else{incy=-1;}delta_x=ABS(delta_x);delta_y=ABS(delta_y);if(delta_x>delta_y){distance=delta_x;}else{distance=delta_y;}v_Lcd12864DrawPoint_f(StartX,StartY,Color);/*DrawLine*/for(t=0;t<=distance+1;t++){v_Lcd12864DrawPoint_f(StartX,StartY,Color);x+=delta_x;y+=delta_y;if(x>distance){x-=distance;StartX+=incx;}if(y>distance){y-=distance;StartY+=incy;}}}老規(guī)矩,我們用這個(gè)函數(shù)隨便畫任意斜率的幾條直線看看v_Lcd12864DrawLine_f(0,0,127,63,1);v_Lcd12864DrawLine_f(0,63,127,0,1);v_Lcd

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論