由lcd12864初探嵌入式菜單設(shè)計(jì)完全_第1頁
由lcd12864初探嵌入式菜單設(shè)計(jì)完全_第2頁
由lcd12864初探嵌入式菜單設(shè)計(jì)完全_第3頁
由lcd12864初探嵌入式菜單設(shè)計(jì)完全_第4頁
由lcd12864初探嵌入式菜單設(shè)計(jì)完全_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

LCD12864Armok的利誘影響,但是最近發(fā)生的一些事情卻使我覺得寫這篇文章是非常有Cover到LCD的顯存上,完成一個字或者是的顯示就等著大家喊“?!绷恕F鋵?shí)要走的路還很遠(yuǎn)。對一個工程項(xiàng)目來說,增加n多的成本來提供一個點(diǎn)陣屏作為用戶接口,不是一兩幅歡迎和不過XP和Apple的華麗,但是由各種基本圖形組成的窗口界面還是需要的。動,我們需要的是一個圖形引擎——DirectX的華麗,但是能繪制一個任式工程師和一個業(yè)余電子者之間的門檻??紤]到本人賣瓜的習(xí)慣,所以請大家一定無比在吃飯前看本人寫的技術(shù)文章,同時保持耐心等待續(xù)硬件平臺:AVRMega8級LCD:不帶字庫的12864規(guī)范:符合基本的C1向LCD1286418個點(diǎn),1對應(yīng)對應(yīng)位被點(diǎn)亮,0表示不Dis Dis&=~(1<<n)第nDis|1<<n)第nDis^1<<n)如果nn處是空白的,就被點(diǎn)亮后面會針對LCD12864作詳細(xì)介紹的。AVRNotOnlyFor前面已經(jīng),對于柵格顯示設(shè)備來說,點(diǎn)圖形的基礎(chǔ),說白了,不會在液晶屏幕的任意位置隨LCD12864來說吧,一段時間,筆者總是發(fā)現(xiàn),在片切換的地方有一點(diǎn)點(diǎn)錯誤……事實(shí)上,LCD本身存在一塊顯示器,也可以被認(rèn)為是一個顯示緩存,直接寫在這個器的數(shù)據(jù)并出來的效果,則不在討論之列。問題就在于,LCD是片源,對其器的可以被認(rèn)為是對片外存SRAM內(nèi)或者送給小侄子,那么,M8M48成為首選,問題是,M88*1281K大小的繞了這么多的彎子,究竟如何畫點(diǎn)呢?我還想多補(bǔ)充一個原因,關(guān)于,為什么需要顯示緩沖區(qū),由于點(diǎn)185DD現(xiàn)存數(shù)據(jù),所以開辟一個緩沖區(qū),從中獲得信息加以加工以后再放回去,是這種設(shè)備處理顯示圖形的唯一DLCD12864補(bǔ)充知么回事。后來才發(fā)現(xiàn),只要把屏幕豎著放一切就好懂了。X還是橫軸,Y還是豎軸……但是這顯然不符合X,YDXDY就是LCDcharDXY charBX=Y-(DX<<3); charDY=X;2、12864的數(shù)據(jù)的時候,一定要注意,E信號要在一個下降延之后持續(xù)拉高,然后才能正常獨(dú)處數(shù)據(jù);假設(shè)直接拉高,的確也能讀出數(shù)據(jù),但是,等著抓頭皮,發(fā)帖子“[跪求]大俠幫忙關(guān)于12864——請使用明#define #define #define {charDX=(Y>>3); charBX=Y-(DX<<3); charTempData=0;if(X>{X-=}{}TempData=switch{casecaseTempData^=(1<<TempData|=(1<<}}RTOS(RealTimeOperationSystem實(shí)時操作系統(tǒng))RTS(RealTimeSystem)實(shí)時系[本章導(dǎo)讀ykxb30;垂直直線,斜率為無窮大(或者說k不存在);普通直線。x反算出y的方法的話,這個公式就可以很容易轉(zhuǎn)換為偽代碼。LineMode為直線的類型:水平,垂直,普通ifXbegin==XendthenLineMode=水平elseifYbeginYendthenLineMode=垂直elsek=(Yend-Ybegin)/(Xend-Xbegin)switchLineModecase水平forx=Xbeginto在x,Ybegincasefory=Ybeginto在Ebegin,yforx=Xbeginto{y=kx+在x,y} dx是x到終點(diǎn)橫坐標(biāo)的距離dyy到終點(diǎn)縱坐標(biāo)的距離ix是dx的絕對值iy是dyinc是dx和dyplotx=x1ploty=x=y=fori0toinc增量1x+=ixy+=iyplot=falseifx>incthenplot=truex-=incifdx>0thenplotx++ifdx<0thenplotx--ify>incthenplot=truey-=incifdy>0thenploty++ifdy<0thenploty--這就是計(jì)算機(jī)圖形學(xué)中流行的(Bresenham)算法,他的意圖就是采用離散的整數(shù)增量來代替斜ButStop沒有最好,但求存映射方式,有不同的算法優(yōu)化方法。究竟有哪些優(yōu)化方法暫且不論,其實(shí)他們都是一個原理,先解181個字節(jié)是沿的操作8次之多,這種操作不是簡單的畫線,先再計(jì)算最后再寫這樣的復(fù)合操作,重復(fù)8次只是為了把整個字節(jié)變黑顯然是一種超級不可的冗余——大家都知道,直接把這個字節(jié)一次,計(jì)算這幾個字就會身價百倍——當(dāng)然,也不乏像筆者這樣買回去以后大呼上當(dāng)?shù)摹N覀兘裉觳徽f桌面系(DesktopSystem),筆者只是想戳穿一下GUI的虛偽表面,讓書店生意冷淡下——方解心頭之恨GUI呢?就是圖形界面接口(GraphicUserInterface),說得通俗就是,一個方便人們和電腦打所以GUI對于電腦和人類交往起到一個平臺的作用。說了這么多,說明一個問題,就是什么時候我們需要GUI系統(tǒng)寫詩文尚且追求讓家里的老婆婆能懂得一二,何況我們花費(fèi)大量心血的嵌入式系統(tǒng) 針對LCD12864舉例說明窗體里面的一些實(shí)現(xiàn)的細(xì)節(jié)。 LCD12864這樣的二值屏幕上面實(shí)現(xiàn)這因?yàn)椤猇eryEasy,isn`t voidBOX(charXbegin,charYbegincharXend,charYend,charBoxModel,char #defineBoxModel_Draw 0x01//畫邊框defineBoxModel_NoBox0x03#defineBoxModel_Clear0x00//畫白色邊框#defineBoxModel_Not 0x02//邊框反顯 #defineFillType_Fill0x01//填充黑色defineFillType_Clear0x00//填充白色defineFillType_Not0x02//defineFillType_NoFill0x03可以顯示漢字Print(charx,chary,"String");Box(2,2,100,64,BoxModel_NoBox,FillType_Clear);//清掃出一片空地Box(2,2,100,64,BoxModel_Draw,FillType_NoFill);//窗體輪廓 {Box(X+6,Y+6,X+Width+6,Y+Height+6,BoxModel_NoBox,FillType_Fill);//黑色陰影 }首先,我們來說說畫外框的問題。還記得我們之前的畫線函數(shù)么?很多人應(yīng)該都試驗(yàn)成功了吧。同樣,我們在這就先不給出源代碼了,但是我們需要一個便于交流的函數(shù),在這里我就自作主張的規(guī)定同樣對應(yīng)LineModeldefineLineModel_Draw defineLineModel_Clear //define //很顯然這些參數(shù)對應(yīng)著原先的畫點(diǎn)函數(shù)和優(yōu)化過的畫線函數(shù)。那么,Box函數(shù)的一個片斷就可以寫成下if(BoxModel=={if(FillType=={return;}BoxModel=} for(n=Xbegin;n<=Xend;n++){ }現(xiàn)在大白,也許你突然明白原先幾何書上關(guān)于“點(diǎn)動成線線動成面”的道理了吧。哈……[源代碼]:為了大家不偷懶,我就先不具體給出了大家加油哦從“壁畫”記事到“甲骨文不得不承認(rèn),到目前為止,似乎如果我們要想做一個記事本之類的電子助手已經(jīng)萬事俱備了,但真正開始做的時候才發(fā)現(xiàn),我們還沒有AVRLCD上畫出“壁家約定俗成的固定大小的集或其子集就是一個被尊稱為字庫的神圣典籍。在這個里面記錄的是一關(guān)于這些字模碼是如何排列的,自古以來就有數(shù)不清的模式。終于有一天,一群伴隨著站了起來,制定了一個叫做國標(biāo)的標(biāo)準(zhǔn)(GB),根據(jù)這個標(biāo)準(zhǔn),祖國大地的字模碼才有了統(tǒng)一的,而查詢這個的方法已經(jīng)逐漸們所淡忘,吹落那源自電的書籍紅色封皮上的滄桑,用手輕輕撫摸封皮在西方,埃的故鄉(xiāng),一群依靠技術(shù)世界的瘋子根據(jù)自己半通不同的習(xí)慣制定了一個由128個字符組成的交換標(biāo)準(zhǔn)稱之為ASCII碼,由于技術(shù)大潮的沖擊,世界妥協(xié)了。這一切的一切都無法改變字庫只不過是集和的本質(zhì)。所以,敢于抵抗的人們在自己的上堅(jiān)持著自己的信念——我們稱之為“小字庫技術(shù)”。甚至有些人堅(jiān)持使用記事,那么自然的被視作是“無字最底層的協(xié)議支持者,就像是烏龜駝著的世界。任何觸動這些底層的行為都會受到世界的背叛,ASCII(AmericanStandardCodeforInformationInterChange)——通用信息交換編碼。他是現(xiàn)在流行的眾多編碼的榜樣,雖然使用僅僅7位二進(jìn)制表示(通常用一個字節(jié)表示),但是卻是眾多編碼系統(tǒng)的基礎(chǔ),比方說16位二進(jìn)制為組成的Unicode編碼,就是,只要在ASCII碼前面加9個零就成完成了轉(zhuǎn)換。當(dāng)然,仍然有不聽話的,比方說IBM的EBCDIC碼(大型計(jì)算機(jī)系統(tǒng)上用的。7128256個字符的PC機(jī)上普遍通用的IBMASCII128~255128個字符——128個字符并不是通用的,即便在我們能接觸的大部分場合他們都有效,但是記住他們的“非常任理事國”的是擁有重大意義的。E文字母和數(shù)字還有一些標(biāo)點(diǎn)符號,那么,干什么要這些無用的字8*7的點(diǎn)陣(7個字節(jié))??!事實(shí)上,由于幾乎所有通用單片機(jī)內(nèi)部都不帶有ASCII字庫(字模碼),所以,須把他們起來,并且還不能打破原有的模式,ASCII碼作為索引我們就找不到他們了。為了完成對字模庫的簡化,我們需要知道他們的構(gòu)成方式,然后再考慮如何去獲取一個已知的標(biāo)準(zhǔn)字模庫,并按照我們設(shè)計(jì)的方法去簡化他……AVR,存ASCIIEmbeddedSystem開發(fā)的(為了顯示大家工作的高深程度,請?jiān)试S我掉書袋所以,這里我的要講述一下ASCII編碼一些不太注意的1)ASCII碼由7位二進(jìn)制組00011011 charfAddressc*8*16;//8*16的ASCII字符fAddressc*8*8;8*8至于你想使用小字符集,那么就看你的了。Howtoget字模的“主義”,小字庫和無字庫技術(shù)在一些不恰當(dāng)?shù)膱龊弦脖淮罅浚瑖?yán)重影響了接著寫你代碼不知道還有多少人記得UCDOS,中國漢字操作系統(tǒng)的“希望”。金山WPS,CCED…… GorgonMeducer來點(diǎn)實(shí)際的void{Uchari,j;{{//ellispeMidpoint(220,120,i,100);}}//參數(shù):中心點(diǎn)xc,yc和長短軸voidellipsePlotPoints(intxc,intyc,intx,inty){}//參數(shù):中心點(diǎn)xc,yc和長短軸voidellispeMidpoint(intxc,intyc,intrx,intry){intrx2=rx*rx;intinttworx2=2*rx2;inttwory2=2*ry2;intp;intx=0;inty=ry;intintvoid//plotthefirstsetofpoints{{}}{{}}}=constcharASC_Lib[][16]=}{if((ASC<32)||(ASC>{}return} 的函數(shù),就可以顯示字符了。例如voidDispBITMap(constchar*String,charStringLength,charXcharY,char 輸出:顯示數(shù) chargetLCD12864Data(void){charTempData=0;chara=0;TempData=return}函數(shù)說明:12864畫點(diǎn)函 輸入:坐標(biāo)(橫向),點(diǎn)類型:畫點(diǎn)/清點(diǎn)/反 voidLCD12864Draw(charX,charY,charType){;;charDX=(Y>>3); ;;charTempData=if(X>{X-=64;}{}switch(Type){caseLCD12864_Graphic_Clear:TempData&=~(1<<BX);caseLCD12864_Graphic_Not:TempData^=(1<<BX);TempData|=(1<<}voidDispBITMap(constchar*String,charStringLength,charX,charY,char在屏幕的任意位置顯示就成了急需解決的問題。一種基本思想就是,我們在系統(tǒng)的某一個地方再開辟一個顯示緩沖區(qū),通過一點(diǎn)點(diǎn)計(jì)算,把影響為倍數(shù)的行開始(單位是像素)8*n的字模,那么只需要簡單得調(diào)用本節(jié)開始時后提到的函數(shù)把字模送過去就可以了;But,如果我們想在別的位置(12864來說,列是很容易設(shè)置 那么每次需要參與處理的字節(jié)最多只有(16/8)+1個。如果需要 字節(jié)只有(Y/8)+1個。那么我很容易把緩沖用的顯示 單元數(shù)量減少到一個可以接受的范圍,比方說12864的8個。defineDISP_Model_Draw define //define //voidshowPicture(constchar*String,charLength,charHeight,charX,char{charTempRAM[2]={0,0}; //一個顯示緩沖,因?yàn)槭且粋€一個的處理,所以最多只需要2個字節(jié),chara=0,b=0,n=0;charTemp=0;if(Y-(Y>>3{returnfor(a={for(b={TempY+a)Y+a)3 TempRAM[0]=getRAM(X,(Y+a)>>3); TempRAM[1]=getRAM(X,((Y+a)>>3)+1);switch{caseDISP_Model_Draw:for(n=0;n<8-{{}{}}for(n={if(String[n]<<(7-n-{}{}}}把TempRAM[0]和TempRAM[1]}}}GUI創(chuàng)立的目的往往是服務(wù)于菜單系統(tǒng),或者是游戲系統(tǒng)。于是接下來的兩張,我就扯一下和本文有千絲萬縷關(guān)系卻是之外的東西:1、菜單的結(jié)構(gòu);2、GUI在游ADDENDUMONE: STRUCTANDIT`S為什么菜單被叫做菜單,起原因已經(jīng)無從查考了,這個問題上我再掉故紙堆,羅列一堆各家之言,要說清楚這個問題,從兩個方面來說:第一,菜單是由許多具有一定功能的單位按照一定分類組織在接又連接到其他網(wǎng)頁,如此往復(fù),他們之間是通過指針,或者說是通過超來溝通的。也就是說,我們已 結(jié)構(gòu)定義 { void(*Subs)(); Item*Children Item*Parent void Item的組成其實(shí)非常簡單:父指針(表明選擇ESC后,跳轉(zhuǎn)到哪個菜單去); ItemMain ItemTime ItemVoice[5];structItemRobot[5];structItemFlash[5]; voidMain void void void void *函數(shù)說明:Flash處 voidFlash { Count= [0].DisplayString="FlashRecord"; [0].Subs=FlashRecord; s=&Null; s=Main Count= [1].DisplayString=" [1].Subs=FlashPlay; s=&Null; s=Main Count= [2].DisplayString=" [2].Subs=FlashPause; s=&Null; s=Main Count= [3].DisplayString="FlashDelete"; [3].Subs=FlashDelete; s=&Null; s=Main Count= [4].DisplayString=" [4].Subs=NullSubs; s=Main s=Main }*函數(shù)說明:機(jī)器人控 voidRobot Count=Count=[0].DisplayString="TurnLeft";[0].Subs=RobotTurnLeft; s=&Null; s= Count=[1].DisplayString="TurnRight";[1].Subs=RobotTurnRight; s=&Null; s= Count=[2].DisplayString="GoAhead";[2].Subs=RobotGoAhead; s=&Null; s= Count= [3].DisplayString=" GoBack"; [3].Subs=RobotGoBack; s=&Null; s=Main Count= [4].DisplayString=" [4].Subs=NullSubs; s=Main s=Main }*函數(shù)說明:聲音處 voidVoice { Count= [0].DisplayString="VoiceRecord"; [0].Subs=VoiceRecord; s=&Null; s=Main [1].DisplayString=" [1].Subs=Play; s= s=[1].DisplayString=" [1].Subs=Play; s= s= Count=[2].DisplayString=" [2].Subs=Pause; s= s= Count=[3].DisplayString="VoiceDelete";[3].Subs=VoiceDelete; s=&Null; s= Count= [4].DisplayString=" [4].Subs=NullSubs; s=Main s=Main }*函數(shù)說明:時間設(shè)定 voidTime { Count= [0].DisplayString="TimeSet [0].Subs= s=&Null; s=Main Count= [1].DisplayString="DateSet"; [1].Subs=DateSet; s=&Null; s=Main Count= [2].DisplayString="AlertSet"; [2].Subs=AlertSet; s=&Null; s=Main Count= [3].DisplayString=" [3].Subs=NullSubs; s=Main s=Main }*函數(shù)說明: voidMain { Count= [0].DisplayString="TimeSet"; [0].Subs=NullSubs; s=Time s=&Null; Count= [1].DisplayString="VoiceCenter"; [1].Subs=NullSubs; s=Voice s=&Null; Count= [2].DisplayString="RobotControl"; [2].Subs=NullSubs; s=Robot s=&Null; Count= [2].DisplayString="FlashOption"; [2].Subs=NullSubs; s=Flash s=&Null;}structItem(*Point)=Main;shortDisplayStart=0;shortUserChoose=0;shortDisplayPoint=0;shortMaxItems; char*DisplayString;void Item Item s;externvoidClearWatchDog(); voidSystemInitialation(void);voidShow short voidSystemInitialation(void){ //初始化字 函數(shù)定義在 } { } voidShow {shortn=MaxItems= DisplayPoint=DisplayStart;if(MaxItems>={for(n={ if((DisplayPoint)=={BOX(1,n*16+1,126,(n+1)*16-}DisplayPointif((DisplayPoint)=={DisplayPoint=}}}{for(n={ if((DisplayPoint)=={BOX(1,n*16+1,126,(n+1)*16-}DisplayPointif((DisplayPoint)=={DisplayPoint=}}}} shortGetKeyNum(void){shortTempKeyNum= *P_IOA_Dir=*P_IOA_Attrib=*P_IOA_Data=return} intmain(){shortKeyNum=0xff; { KeyNum [[按鍵說明 *UP(向上******if(KeyNum!=0xff){ {caseUP:if(UserChoose<UserChoose=MaxItems-}caseif s!={Point= UserChoose=0;DisplayStart=}caseDown:UserChooseif(UserChoose=={UserChoose=}caseEnter:if Point[UserChoose].Subs!={ }elseif s!={Point= UserChoose=0;DisplayStart=}caseReset:Point=Main UserChoose=0;DisplayStart=0;}if((UserChoose<DisplayStart)||(UserChoose>{DisplayStart=} } }}要關(guān)心的只是在隊(duì)尾(蛇頭)指針一個豆子以后,延遲一次隊(duì)頭指針(蛇尾)的清除動作。說得再具(蛇頭)255即豆子,那么就放棄一次隊(duì)頭的清空操作(長了),2550那么顯然撞倒東西了,GAMEOVER而已……沒有什么可以神秘的,有的人可以自己做一個來耍耍。我忙完了的設(shè)計(jì)項(xiàng)目會集中力量附上文曲星上BASIC編寫的貪食蛇,拋磚引玉10GRAPH:CLEAR:CLS25LOCATE4,5:PRINT"For30IFPEEK(199)=0THENGOTO30ELSEPOKE199,0:CLEAR:CLS:HEADX=20:HEADY=10:GOSUB4060DIRECT=1:REM1LEFT2RIGHT3UP480BOX9091BOX95100IFA<>0THENPOKE199,0:GOSUB110IFDIRECT=1THENHEADX=HEADX-1:IFHEADX<0THENGOSUB120IFDIRECT=2THENHEADX=HEADX+1:IFHEADX>39THENGOSUB130140IFDIRECT=3THENHEADY=HEADY-1:IFHEADY<0THENGOSU

溫馨提示

  • 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

提交評論