單片機C語言程序設(shè)計 教學(xué)課件侯殿有 5.16_第1頁
單片機C語言程序設(shè)計 教學(xué)課件侯殿有 5.16_第2頁
單片機C語言程序設(shè)計 教學(xué)課件侯殿有 5.16_第3頁
單片機C語言程序設(shè)計 教學(xué)課件侯殿有 5.16_第4頁
單片機C語言程序設(shè)計 教學(xué)課件侯殿有 5.16_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、在線教務(wù)輔導(dǎo)網(wǎng): :/教材其余課件及動畫素材請查閱在線教務(wù)輔導(dǎo)網(wǎng)QQ:349134187 或者直接輸入下面地址:第十六章 T6963C的漢字字符顯示上一章介紹了字模提取方法,本章介紹如何在LCD上顯示提取的漢字和圖形。即LCD驅(qū)動問題,LCD驅(qū)動和具體的液晶顯示模塊結(jié)構(gòu)有關(guān)系。液晶顯示器件一般包括控制器、驅(qū)動器和液晶屏;而液晶顯示模塊那么是把液晶顯示屏、連接件、PCB線路板、背光源、結(jié)構(gòu)件裝配到一起的組件,英文名稱“LCD Module,簡稱“LCM,我們一般簡稱為“液晶顯示模塊。具體如圖16.1所示。液晶顯示模塊的型號非常多,但只要是控制器相同,其驅(qū)動程序根本相同??刂破靼垂δ芊挚捎卸N,一

2、是字符型控制器,另一種是點陣圖形型控制器;字符型控制器只能顯示西文字符或字劃簡單的漢字,價格低廉,在低檔嵌入式控制系統(tǒng)中使用較多;點陣型控制器能顯示各種曲線和漢字,在復(fù)雜嵌入式控制系統(tǒng)中使用較多。16.1 T6963C的一般介紹 1T6963C的特點1T6963C是點陣式液晶圖形顯示控制器,它能直接與51系列的8位微處理器接口;在嵌入式控制系統(tǒng)中使用較多,是點陣式液晶圖形顯示控制器典型代表。2T6963C的字符字體由硬件設(shè)置,其字體有4種:58、68、78、88。3T6963C的占空比可從1/16到1/128。4T6963C可以圖形方式、文本方式及圖形+文本方式進行顯示,以及文本方式下的特征顯

3、示,還可以實現(xiàn)圖形拷貝操作等等。5T6963C具有內(nèi)部字符發(fā)生器CGROM,共有128個字符,T6963C可管理64K顯示緩沖區(qū)及字符發(fā)生器CGRAM。并允許MPU隨時訪問顯示緩沖區(qū),甚至可以進行位操作。T6963C的引腳說明及功能T6963C的引腳見圖16.2。T6963C的QFP封裝共有67個引腳,各引腳說明如下:1D0D7:T6963C與CPU接口的數(shù)據(jù)總線,三態(tài)。2,:讀、寫選通信號,低電平有效,輸入信號.3:T6963C的片選信號,低電平有效。4C/D:通道選擇信號,1為指令通道,0為數(shù)據(jù)通道;5,:為低電平有效的復(fù)位信號,它將行、列計數(shù)器和顯示存放器清零,關(guān)顯示;具有的根本功能,還

4、將中止內(nèi)部時鐘振蕩器的工作。6DUAL,SDSEL:DUAL1為單屏結(jié)構(gòu),DUAL0為雙屏結(jié)構(gòu)。本節(jié)只介紹單屏結(jié)構(gòu)。SDSEL0為一位串行數(shù)據(jù)傳輸方式,SDSEL1為8位并行數(shù)據(jù)傳輸方式。我們只使用8位并行數(shù)據(jù)傳輸方式。7MD2,MD3:由軟件設(shè)置顯示窗口長度,從而確定了列數(shù)據(jù)傳輸個數(shù)的最大值,其組合邏輯關(guān)系如表16.1所示:8MDS,MD1,MD0:設(shè)置顯示窗口寬度行,從而確定T6963C的幀掃描信號的時序和顯示驅(qū)動的占空比系數(shù),當(dāng)DUAL1時,其組合功能如表16.2所示:當(dāng)DUAL0時,以上設(shè)置中的字符行和總行數(shù)增至原來的2倍,其它都不變,這種情況下的液晶屏結(jié)構(gòu)為雙屏結(jié)構(gòu);9FS1,F(xiàn)S0

5、:表16.3顯示字符的字體選擇10XI,XO:振蕩時鐘引腳;11AD0AD15:輸出信號,顯示緩沖區(qū)16位地址總線;12D0D7:三態(tài),顯示緩沖區(qū)8位數(shù)據(jù)總線;13:輸出,顯示緩沖區(qū)讀、寫控制信號;14:輸出,顯示緩沖區(qū)片選信號,低電平有效;15,:輸出,DUAL1時的存儲器片選信號;16T1,T2,CH,CH2:用來檢測T6963C工作使用情況,T1,T2作為測試信號輸入端,CH1,CH2作為輸出端;17HOD,HSCP,LODLSCPCE1,EDLP,CDATA,F(xiàn)R為T6963C驅(qū)動器信號。3T6963C的狀態(tài)字T6963C的初始化設(shè)置一般都由管腳設(shè)置完成,因此其指令系統(tǒng)將集中于顯示功能

6、的設(shè)置上。T6963C的指令可帶一個或兩個參數(shù),或無參數(shù)。每條指令的執(zhí)行都是先送入?yún)?shù)如果有的話,再送入指令代碼。每次操作之前最好先進行狀態(tài)字檢測。T6963C的狀態(tài)字如下所示:STA0:指令讀寫狀態(tài),1:準(zhǔn)備好,0:忙STA1:數(shù)據(jù)讀寫狀態(tài),1:準(zhǔn)備好,0:忙STA2:數(shù)據(jù)自動讀狀態(tài),1:準(zhǔn)備好,0:忙STA3:數(shù)據(jù)自動寫狀態(tài),1:準(zhǔn)備好,0:忙STA4:未用STA5:控制器運行檢測可能性,1:可能,0:不能STA6:屏讀/拷貝出錯狀態(tài),1:出錯,0:正確STA7:閃爍狀態(tài)檢測,1:正常顯示 0:關(guān)顯示由于狀態(tài)位作用不一樣,因此執(zhí)行不同指令必須檢測不同狀態(tài)位。在MPU一次讀、寫指令和數(shù)據(jù)時,

7、STA0和STA1要同時有效即處于“準(zhǔn)備好狀態(tài)。當(dāng)MPU讀、寫數(shù)組時,判斷STA2或STA3狀態(tài)。屏讀、屏拷貝指令使用STA6。STA5和STA7反映T6963C內(nèi)部運行狀態(tài)。16.2 T6963C指令系統(tǒng)1指針設(shè)置指令,是3字節(jié)指令,格式如下:字節(jié)D1、D2為第一和第二個參數(shù),后一個字節(jié)為指令代碼,根據(jù)N0,N1,N2的取值,該指令有三種含義N0,N1,N2不能有兩個同時為1,見表16.4其中:(1)光標(biāo)指針設(shè)置:D1表示光標(biāo)在實際液晶屏上離左上角的橫向距離字符數(shù),D2表示縱向距離字符行,N0=1 即指令代碼為0 x21。 2N1=1 時指令代碼為為0 x22,為CGRAM 偏置地址設(shè)置:設(shè)

8、置了CGRAM在顯示64KRAM內(nèi)的高5位地址,CGRAM的實際地址為:T6963C內(nèi)部存儲器共64K,就要用16位地址線尋址,即邏輯地址為A15A0,同時它還代2K的固定字符,這2K固定字符位置范圍就由偏置地址存放器決定,2K的固定字符的地址用5位地址線尋址,即C4C0,它由N1=1 時指令代碼0 x22設(shè)置見表16.4;如我們設(shè)其初始地址為0,2K固定字符的尋址范圍為0 x000 x7f,系統(tǒng)規(guī)定,把這5位放在16位地址的最高位;隨后放8位字符代碼D7D0;字符代碼是系統(tǒng)在圖形方式下為方便編程設(shè)置的,當(dāng)我們把大量圖形數(shù)據(jù)裝入RAM時,每8個字節(jié)用一個代碼表示,當(dāng)我們顯示時不用一個一個字節(jié)處

9、理,而是直接輸出代碼即可。上面已說了,2K的固定字符占0 x000 x7f地址,字符代碼就從0 x80開始到0 xff,這也意味著RAM可以裝0 xff8字節(jié)的顯示數(shù)據(jù)。隨著8位字符代碼,又留三位R2R0做行地址指針,我們顯示漢字時,是把一個1616點陣漢字分為4塊,用4個代碼表示因一個代碼只能表示8個字節(jié),即分為左上,右上,左下,右下,它們占二行,所以R2R0的范圍只能是01。系統(tǒng)的16位實際物理地址是:C4 C3 C2 C1 C0 D7 D6 D5 D4 D3 D2 D1 D0 R2 R1 R0。3N2=1 時指令代碼為0 x24,為地址指針設(shè)置指令,該指令設(shè)置進行操作的顯示緩沖區(qū)RAM的

10、一個單元地址,D1、D2為該單元地址的低8位和高8位地址。 2. 控制字指令(1) 顯示區(qū)域設(shè)置,是3字節(jié)指令,指令格式為:根據(jù)N1,N0的不同取值,該指令有四種指令功能形式,見表16.5: 文本區(qū)和圖形區(qū)首地址為對應(yīng)顯示屏左上角字符位(文本方式)或字節(jié)位(圖形方式),修改該地址可以產(chǎn)生卷動效果。D1,D2分別為該地址的低8位和高位8字節(jié)。文本區(qū)寬度字符數(shù)/行設(shè)置和圖形區(qū)寬度字節(jié)數(shù)/行設(shè)置用于調(diào)整一行顯示所占顯示RAM的字節(jié)數(shù),從而確定顯示屏與顯示RAM單元的對應(yīng)關(guān)系。T6963C硬件設(shè)置的顯示窗口寬度是指T6963C掃描驅(qū)動的有效列數(shù)。需說明的是當(dāng)硬件設(shè)置68字體時,圖形顯示區(qū)單元的低6位有

11、效,對應(yīng)顯示屏上61顯示位。 (2) 顯示方式設(shè)置,是2字節(jié)指令,指令格式為:N3:字符發(fā)生器選擇位。N3=1為外部字符發(fā)生器有效,此時內(nèi)部字符發(fā)生器被屏蔽,字符代碼全部提供給外部字符發(fā)生器使用,字符代碼為0 x000 xff。N3=0為CGROM 即內(nèi)部字符發(fā)生器有效,屬于CGROM字符代碼為0 x000 x7f。因此選用0 x800 xff字符代碼時,將自動選擇CGRAM。N2N0:合成顯示方式控制位,其組合功能如表16.6:當(dāng)設(shè)置文本方式和圖形方式功能翻開時,上述合成顯示方式設(shè)置有效。其中的文本特征方式是指將圖形區(qū)改為文本特征區(qū)。該區(qū)大小與文本區(qū)相同,每個字節(jié)作為對應(yīng)文本區(qū)的每個字符顯示

12、的特征,包括字符顯示與不顯示、字符閃爍及字符的“負向顯示。通過這種方式,T6963C可以控制每個字符的文本特征。文本特征區(qū)內(nèi),字符的文本特征碼由一個字節(jié)的低四位組成,即如表16.7示:D3:字符閃爍控制位,D3=1為閃爍,D3=0為不閃爍;D2D0:D2D0的組合如表16.8示:啟用文本特征方式時可在原有圖形區(qū)和文本區(qū)外,用圖形區(qū)域設(shè)置指令另開一區(qū)作為文本特征區(qū),以保持原圖形區(qū)的數(shù)據(jù)。顯示緩沖區(qū)可劃分如以下圖16.3示:3顯示開關(guān),指令格式如下:N0:1/0,光標(biāo)閃爍啟用/禁止;N1:1/0,光標(biāo)顯示啟用/禁止;N2:1/0,文本顯示啟用/禁止;N3:1/0,圖形顯示啟用/禁止。4光標(biāo)形狀選擇

13、,是2字節(jié)指令,指令格式如下:數(shù)據(jù)讀寫指令(1) 數(shù)據(jù)自動讀、是2字節(jié)指令,寫方式設(shè)置:該指令執(zhí)行后,MPU可以連續(xù)地讀、寫顯示緩沖區(qū)RAM的數(shù)據(jù),每讀、寫一次,地址指針自動增1。自動讀、寫結(jié)束時,必須寫入自動結(jié)束命令以使T6963C退出自動讀、寫狀態(tài),開始接受其它指令。N1,N0組合功能如表16.9示:(2) 數(shù)據(jù)一次讀、寫方式,是2字節(jié)指令,指令格式如下:D1為需要寫的數(shù)據(jù),讀時無此數(shù)據(jù),N2 N1 N0意義如表16.10示:5. 屏操作指令(1) 讀屏,是1字節(jié)指令,指令格式為:該指令將屏上地址指針處文本與圖形合成后顯示的一字節(jié)內(nèi)容數(shù)據(jù)送到T6963C的數(shù)據(jù)棧內(nèi),等待MPU讀出。地址指針

14、應(yīng)在圖形區(qū)內(nèi)設(shè)置。(2) 屏拷貝,是1字節(jié)指令,指令格式為:該指令將屏上當(dāng)前地址指針圖形區(qū)內(nèi)處開始的一行合成顯示內(nèi)容拷貝到相對應(yīng)的圖形顯示區(qū)的一組單元內(nèi),該指令不能用于文本特征方式下或雙屏結(jié)構(gòu)液晶顯示器的應(yīng)用上。 6. 位操作指令位操作指令是1字節(jié)指令,:該指令可將顯示緩沖區(qū)某單元的某一位清零或置1,該單元地址由當(dāng)前地址指針提供。N3=1 置1;N3=0 清零。N2N0:操作位,對應(yīng)該單元的D0D7位。位操作功能是T6963C顯示器的顯著特點之一,雖然只有一條指令,但給我們編程帶來很大方便,因為通過畫點,就可以畫線和各種圖形,就可以顯示漢字和ASCII字符,相信通過下面各章節(jié)的學(xué)習(xí)對此會有較深

15、體會。16.3 T6963C和單片機的連接1直接連接T6963C和單片機的連接有直接連接和間接連接方式,其直接連接就是MPU可利用數(shù)據(jù)總線與控制信號直接采用I/O設(shè)備訪問形式控制T6963C液晶顯示模塊。接口電路如圖16.4所示:8051數(shù)據(jù)口P0直接與液晶顯示模塊的數(shù)據(jù)口連接,由于T6963C接口適用于8080系列和Z80系列MPU,所以可以直接用8031的、作為液晶顯示模塊的讀、寫控制信號,液晶顯示模塊,掛在+5V上。P2.7接,C/D信號由8031地址線P2.0提供,P2.0=1為指令口地址;P2.0=0為數(shù)據(jù)口地址。2間接連接T6963C和單片機的間接連接如圖16.5示:間接連接方式是

16、MPU通過并行接口間接實現(xiàn)對液晶顯示模塊控制。根據(jù)液晶模塊的需要,并行接口需要一個8位的并行接口和一個3位的并行口,由上圖所示。8031的P1口作為數(shù)據(jù)總線。P3口中3位作為讀、寫及存放器選擇信號。由于并行接口只用于液晶顯示塊,所以信號接地就行了。16.4 T6963C的驅(qū)動程序內(nèi)嵌T6963C的LCD顯示模塊種類很多,如:MGLS12864T等MGLS系列;GTG-12864等GTG系列;它們都可以使用本節(jié)介紹的C51語言驅(qū)動程序來構(gòu)建自己的顯示系統(tǒng)。下面我們給出T6963C的C51語言驅(qū)動程序供讀者參考,并經(jīng)Keil C編譯通過。該程序也可在人民郵電出版社教學(xué)效勞與資源網(wǎng)網(wǎng)站下載。硬件連接

17、采用直接方式,P2.7接LCD的,P2.0接C/D端,數(shù)據(jù)端口地址為0 x7eff,指令端口地址為0 x7fff。在本節(jié)中我們利用位操作指令,即打點程序來處理漢字和各種曲線顯示,請讀者注意該方法的運用。/ T6963C.C/-#include #include #include #include #include /自定義頭文件#include /通用字模提取程序提取的1616點陣漢字庫,存chn16.h頭文件中#include /通用字模提取程序提取的1212點陣漢字庫,存chn12.h頭文件中#include /通用字模提取程序提取的2424點陣漢字庫,存chn24.h頭文件中#inclu

18、de /通用字模提取程序提取的1616點陣圖形庫,存syb 16.h頭文件中#include /隨書提供的816 ASCII字庫#include /隨書提供的88 ASCII字庫#include #include #define Lcd_Cmd XBYTE0 x7fff /命令口Lcd_Cmd=0 x7fff #define Lcd_Dat XBYTE0 x7eff /數(shù)據(jù)口Lcd_Dat=0 x7effU16 Lcd_Adr;/ LCD地址指針U8 Lcd_Adr_H; / LCD地址指針高8位U8 Lcd_Adr_L; / LCD地址指針低8位 /程序聲明:void W_DOT(U8 i,

19、U8 j); / 繪點函數(shù)void Wr_Cmd(U8 Cmd); / 寫命令void Wr_Adat(U8 Dat) ; / 寫數(shù)據(jù)void Wr_Dat(U8 Dat); / 數(shù)據(jù)自動寫U8 Rd_Dat(void); / 數(shù)據(jù)自動讀狀態(tài)void Star_Locat(void); / 移地址指針void Init_Lcd(void); / LCD初始化void Clr_screenScreen(U8 ScreenN0); /清屏 void DrawHorizOntalLine(U8 xstar,U8 xend,U8 ystar); /畫水平線 void DrawVerticalLine(

20、U8 xstar,U8 ystar,U8 yend); /畫垂直線 void Linexy(S16 stax,S16 stay ,S16 endx,S16 endy); /畫斜線 void C_DOT(U8 i,U8 j); /清點函數(shù) void ClearHorizOntalLine(U8 xstar,U8 xend,U8 ystar); /清水平線 void ClearVerticalLine(U8 xstar,U8 ystar,U8 yend); / 清垂直線 void ShowSinWave(void); /顯示正弦曲線 void Showtest (void); /顯示各種曲線 vo

21、id disdelay(void);/延時void DrawOneChn1212( U8 x,U8 y,U16 chnCODE); /顯示1212漢字 void DrawOneChn2424(U8 x, U8 y, U8 chnCODE);/顯示2424漢字 void DrawChnString2424(U8 x, U8 y, U8 *str,U8 s); /顯示2424漢字串,S是串長 void DrawOneSyb1616(U8 x,U8 y,U16 chnCODE); /顯示1616標(biāo)號 void DrawOneChn1616( U8 x,U8 y,U16 chnCODE); /顯示16

22、16漢字 void DrawChnString1616(U8 x,U8 y,U8 *str,U8 s);/顯示1616漢字串 S是串長 void DrawOneAsc816(U8 x,U8 y,U8 charCODE); /顯示816ASCII字符 void DrawAscString816(U8 x,U8 y,U8 *str,U8 s);/顯示816ASCII字符串S是串長 void DrawOneAsc88(U8 x,U8 y,U8 charCODE); /顯示88ASCII字符 void DrawAscString88(U8 x,U8 y,U8 *str,U8 s); /顯示88ASCI

23、I字符串S是串長void DrawOneBoxs(U8 x1,U8 y1,U8 x2,U8 y2); /畫矩形void ReDrawOneChn1616(U8 x,U8 y,U16 chnCODE);/顯示漢字,反白U8 stringp=0,1,2,3,4,5,6,7,8,9,10;/顯示漢字串臨時用的數(shù)組 *注1ascstring816=a,b,c,A,B,C,0,1,2,3;/顯示8(8)16ASCII字符串臨時數(shù)組/ 寫命令/-void Wr_Cmd(U8 Cmd) U8 Lcd_Stat;Lcd_Stat=0 x00;while(Lcd_Stat&0 x03)= =0) /如果STA0

24、=0 & STA1=0 Lcd_Stat=Lcd_Cmd; /那么反復(fù)讀命令口,直到準(zhǔn)備好Lcd_Cmd=Cmd; /命令發(fā)出/ 寫數(shù)據(jù)/-void Wr_Adat(U8 Dat) U8 Lcd_Stat;Lcd_Stat=0 x00;while(Lcd_Stat&0 x03)= =0)Lcd_Stat=Lcd_Cmd;Lcd_Dat=Dat; /如果STA0=1& STA1=1,發(fā)數(shù)據(jù)/ 數(shù)據(jù)自動寫/-void Wr_Dat(U8 Dat) U8 Lcd_Stat;Lcd_Stat=0 x00;while(Lcd_Stat&0 x08)= =0) Lcd_Stat=Lcd_Cmd;Lcd_D

25、at=Dat; /如果STA3=1數(shù)據(jù)自動寫/ 數(shù)據(jù)自動讀狀態(tài)/-U8 Rd_Dat(void) U8 Lcd_Stat;Lcd_Stat=0 x00;while(Lcd_Stat&0 x04)= =0)Lcd_Stat=Lcd_Cmd;return Lcd_Dat; /如果STA3=2數(shù)據(jù)自動讀/ 移地址指針/-void Star_Locat(void) Lcd_Adr_H=Lcd_Adr/256;Lcd_Adr_L=Lcd_Adr-Lcd_Adr_H*256;Wr_Adat(Lcd_Adr_L);Wr_Adat(Lcd_Adr_H);Wr_Cmd(0 x24);/ LCD初始化/-void

26、 Init_Lcd(void) U16 i;Wr_Adat(0 x00); / 文本區(qū)首址低8位Wr_Adat(0 x00); / 文本區(qū)首址高8位Wr_Cmd(0 x40); /發(fā)置文本區(qū)首址命令 首址=0 x0000Wr_Adat(0 x10); /文本區(qū)寬度低8位 Wr_Adat(0 x00); / 文本區(qū)寬度高8位Wr_Cmd(0 x41); /發(fā)置文本區(qū)寬度命令 (16字節(jié)/行 )Wr_Adat(0 x00);/ 圖形區(qū)首址低8位Wr_Adat(0 x08); / 圖形區(qū)首址高8位Wr_Cmd(0 x42); /發(fā)置圖形區(qū)首址命令,首址=0 x0800Wr_Adat(0 x14);

27、/圖形區(qū)寬度低8位 Wr_Adat(0 x00);/圖形區(qū)寬度高8位Wr_Cmd(0 x43); /發(fā)置圖形區(qū)寬度命令, 圖形區(qū)寬度=0 x14(20字節(jié))Wr_Cmd(0 x80); /方式設(shè)置,CGR0M或合成Wr_Cmd(0 x9c); /文本方式和圖形方式,光標(biāo)禁用Wr_Cmd(0 xa1); /光標(biāo)大小選擇Wr_Adat(0 x00);/ 地址指針低8位Wr_Adat(0 x00); 地址指針高8位Wr_Cmd(0 x24); /移地址指針命令,移地址到0 x0000Wr_Cmd(0 xb0); /自動寫設(shè)置for(i=0;i2560;i+) /清零 Wr_Dat(0 x00);Wr

28、_Cmd(0 xb2); /自動寫結(jié)束,禁止自動寫/ 清屏,單屏?xí)rScreenN0=0/-void Clr_screenScreen(U8 ScreenN0)U16 i,val;val=ScreenN0*1024+0 x800; /清圖形區(qū)Lcd_Adr_H=val/256;Lcd_Adr_L=val-Lcd_Adr_H*256;Wr_Adat(Lcd_Adr_L);Wr_Adat(Lcd_Adr_H);Wr_Cmd(0 x24);Wr_Cmd(0 xb0);for(i=0;i2560;i+) Wr_Dat(0 x00);Wr_Cmd(0 xb2);/ 繪點函數(shù)/-void W_DOT(U8

29、i,U8 j) / *注2 U8 n,m;n=i/8; m=i%8; Lcd_Adr=20*j+n+0 x0800; Star_Locat(); /移地址指針 m=0 x08-m; m=m|0 xf8; Wr_Cmd(m); / 清點函數(shù)/-void C_DOT(U8 i,U8 j) /*注3 U8 n,m; n=i/8; m=i%8; Lcd_Adr=20*j+n+0 x0800; Star_Locat(); /移地址指針 m=0 x08-m; m=(m|0 xf0)&0 xf7; Wr_Cmd(m); / 畫水平線/-void DrawHorizOntalLine(U8 xstar,U8

30、xend,U8 ystar) U8 i; for(i=xstar;i=xend;i+) W_DOT(i,ystar); / 畫垂直線/-void DrawVerticalLine(U8 xstar,U8 ystar,U8 yend) U8 i; for(i=ystar;i=yend;i+) W_DOT(xstar,i); / 清水平線/-void ClearHorizOntalLine(U8 xstar,U8 xend,U8 ystar) U8 i; for(i=xstar;i=xend;i+) C_DOT(i,ystar); / 清水平線/-void ClearHorizOntalLine(

31、U8 xstar,U8 xend,U8 ystar) U8 i; for(i=xstar;i0) incx=1;else if( deltax=0 ) incx=0; else incx=-1; if(deltay0) incy=1; else if( deltay=0 ) incy=0; else incy=-1; deltax = abs( deltax ); deltay = abs( deltay ); if( deltax deltay ) distance=deltax; else distance=deltay; for( t=0;t distance ) xerr-=dista

32、nce; col+=incx; if( yerr distance ) yerr-=distance; row+=incy; / 顯示一條正弦曲線/- void ShowSinWave(void) /*注5 U8 x,j0,k0; double y,a,b; j0=0; k0=0;DrawHorizOntalLine(1,159,63);/ 畫坐標(biāo) x范圍(0-159)DrawVerticalLine(0,0,125); / y范圍(0-127) for (x=0;x160;x+) a=(float)x/159)*2*3.14; y=sin(a); b=(1-y)*63; W_DOT(U8)x

33、,(U8)b); disdelay(); / 顯示一個2424漢字/-void DrawOneChn2424(U8 x, U8 y, U8 chnCODE) /*注6 U16 i,j,k,tstch; U8 *p; p=chn2424+72*(chnCODE); for (i=0;i24;i+) for(j=0;j=2;j+) tstch=0 x80;for (k=0;k1; / 顯示2424 漢字串/-void DrawChnString2424(U8 x, U8 y, U8 *str,U8 s) U8 i; static U8 x0,y0; x0=x; y0=y; for (i=0;is;

34、i+) DrawOneChn2424(x0,y0,(U8)*(str+i);x0 += 24;/水平串 ,如垂直串Y0+24 / 顯示1616標(biāo)號(報警和音響)/-void DrawOneSyb1616(U8 x,U8 y,U16 chnCODE) /注7 int i,k,tstch; unsigned int *p; p=Syb1616+16*chnCODE; for (i=0;i16;i+) tstch=0 x80; for(k=0;k8&tstch) W_DOT(x+k,y+i); if(*p&0 x00ff)&tstch) W_DOT(x+k+8,y+i); tstch=tstch 1

35、; p+=1;/ 延時/-void disdelay(void) unsigned long i,j; i=0 x01; while(i!=0) j=0 xffff; while(j!=0) j-=1; i-=1; / 顯示1212漢字一個/-void DrawOneChn1212(U8 x,U8 y,U16 chnCODE) /*注8 U16 i,j,k,tstch; U8 *p; p=chn1212+24*(chnCODE); for (i=0;i12;i+) for(j=0;j2;j+) tstch=0 x80;for (k=0;k1; x+=12;/ 顯示1616漢字一個,/-void

36、 DrawOneChn1616(U8 x,U8 y,U16 chnCODE) /*注9 U16 i,k,tstch; U16 *p; p=chn1616+16*chnCODE; for (i=0;i16;i+) tstch=0 x80; for(k=0;k8&tstch) W_DOT(x+k,y+i); if(*p&0 x00ff)&tstch) W_DOT(x+k+8,y+i); tstch=tstch1; p+=1; / 反白顯示1616漢字一個/-void ReDrawOneChn1616(U8 x,U8 y,U16 chnCODE) / *注10 U16 i,k,tstch; U16

37、*p; p=chn1616+16*chnCODE; for (i=0;i16;i+) tstch=0 x80; for(k=0;k8)0 x0ff) &tstch) W_DOT(x+k,y+i); if( (*p&0 x00ff)0 x00ff) &tstch) W_DOT(x+k+8,y+i); tstch=tstch1; p+=1; / 顯示1616漢字串/-void DrawChnString1616(U8 x,U8 y,U8 *str,U8 s) U8 i; static U8 x0,y0; x0=x; y0=y; for (i=0;is;i+) DrawOneChn1616(x0,y

38、0,(U8)*(str+i); x0 += 16;/水平串 ,如垂直串Y0+16 / 顯示816字母一個(ASCIIZ字符)/-void DrawOneAsc816(U8 x,U8 y,U8 charCODE) U8 *p; U8 i,k; int mask=0 x80,0 x40,0 x20,0 x10,0 x08,0 x04,0 x02,0 x01 ; p=asc816+charCODE*16; for (i=0;i16;i+) for(k=0;k8;k+) if (maskk%8&*p)W_DOT(x+k,y+i); p+; / 顯示816 ASCII字符串/-void DrawAscS

39、tring816(U8 x,U8 y,U8 *str,U8 s) /*注11 U8 i; static U8 x0,y0; x0=x; y0=y; for (i=0;is;i+) DrawOneAsc816(x0,y0,(U8)*(str+i); x0 += 8;/水平串,如垂直串Y0+16 / 顯示88字母一個(ASCIIZ字符)/-void DrawOneAsc88(U8 x,U8 y,U8 charCODE) U8 *p; U8 i,k; int mask=0 x80,0 x40,0 x20,0 x10,0 x08,0 x04,0 x02,0 x01 ; p=asc88+charCODE

40、*8; for (i=0;i8;i+) for(k=0;k8;k+) if (maskk%8&*p) W_DOT(x+k,y+i); p+; / 顯示88字 符串/-void DrawAscString88(U8 x,U8 y,U8 *str,U8 s) /*注12 U8 i;static U8 x0,y0; x0=x; y0=y;for (i=0;is;i+) DrawOneAsc88(x0,y0,(U8)*(str+i); x0 += 10;/水平串,如垂直串Y 0+8 / 顯示試驗/-void Showtest(void) /*注13DrawAscString816(80,10,ascs

41、tring816,13); /顯示816字串,顯示內(nèi)容放數(shù)組ascstring816中Linexy(60,80,80,85); /顯示曲線Linexy(120,95,100,65); Linexy(130,55,150,35); Linexy(120,55,110,35); DrawAscString88(80,30,ascstring816,11); /顯示88字串,顯示內(nèi)容放數(shù)組ascstring816中DrawChnString1616(130,140,stringp,4);/ 顯示1616漢字串,偏移量放數(shù)組stringp中DrawChnString2424(5,100,stringp

42、,12);/ 顯示2424漢字串,偏移量放數(shù)組stringp中DrawChnString4848(250,80,stringp,1);/ 顯示4848漢字串,偏移量放數(shù)組stringp中DrawChnString1212(5,10,stringp,5); /顯示1212漢字串,偏移量放數(shù)組stringp中ShowSinWave(); /顯示正弦曲線 / 畫填充矩形/-void FillColorScnArea(U8 x1,U8 y1,U8 x2,U8 y2) U8 i; for(i=y1;i=y2;i+) DrawHorizOntalLine(x1,x2,i); / 畫矩形框/-void Dr

43、awOneBoxs(U8 x1,U8 y1,U8 x2,U8 y2) DrawHorizOntalLine(x1,x2,y1); DrawHorizOntalLine(x1,x2,y2); DrawVerticalLine(x1,y1,y2); DrawVerticalLine(x2,y1,y2);/主程序/-void main() Init_Lcd(); Clr_screenScreen(0); Showtest (); 下面我們對注釋詳細解釋:注1:2個變量數(shù)組介紹: 把要顯示的1616或2424或1212漢字距小字庫首地址的偏移量放入數(shù)組stringp中,數(shù)組stringp中每一個數(shù)字代

44、表一個漢字距小字庫首地址的偏移量。然后調(diào)DrawChnString1616、DrawChnString2424、DrawChnString1212顯示即可?,F(xiàn)在數(shù)組中數(shù)字是要顯示從小字庫首地址開始的10個漢字的例子: U8 stringp=0,1,2,3,4,5,6,7,8,9,10; 把要顯示的816或88字串以ASCII碼形式直接放入數(shù)組ascstring816中,然后調(diào)DrawAscString816()或DrawAscString88()顯示即可,如:U8 ascstring816=a,b,c,A,B,C,0,1,2,3。注2:打點函數(shù)W_DOT(U8 i,U8 j)是基于第指令系統(tǒng)的

45、 “位操作 指令編寫的, 1 1 1 1 N3 N2 N1 N0,前4個“1是位操作命令標(biāo)志,N3是操作類型標(biāo)志,N31 “位 置1,N30 “位清零。N2N0對應(yīng)要操作字節(jié)的D0D7 位。位操作指令非常重要,我們根據(jù)這條指令編寫打點程序和去除點程序。由打點和清點程序我們又可以編出下面的許多程序。其中參數(shù)i,j是屏幕上的點的坐標(biāo),i的范圍0159,j的范圍0127(與具體屏尺寸有關(guān));n=i/8是計算i所在位置的字節(jié)數(shù),m=i%8計算余數(shù),也就是i在該字節(jié)的“位數(shù)。Lcd_Adr=20*j+n+0 x0800,Star_Locat():移地址指針, 其中0 x0800是圖形區(qū)起點,20是圖形區(qū)寬度,20*j(點位置所在行數(shù))+n(i所在位置的字節(jié)數(shù))+ 0 x0800圖形區(qū)起點,正好是該點的物理地址。m=0 x07-m計算N2 N1 N0值,m=m|0 xf8是N3置1,Wr_Cmd(m)發(fā)命令。注3:清點函數(shù)C_DOT(U8 i,U8 j)原理同上面打點函數(shù),只是最后N3置0,即 m=(m|0 xf0)&0 xf7,然后發(fā)命令。清點函數(shù)同打點函數(shù)同樣重要,我們在很多情況下,例如畫圖就要把屏上畫圖區(qū)原有的東西擦掉,這就要用到清點函數(shù)。用清點函數(shù)也可以編寫清屏程序。注4:畫斜線方法較多,如數(shù)控技術(shù)中的逐點比

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論