版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
.教育資料基于ATmega128的LCD12864畫圖(畫點,畫線,畫矩形等)先上圖:程序:文件結(jié)構(gòu):----------------_main.c---------------/** 基于ATmega128的LCD12864畫圖顯示實驗* 16MHz*編譯器:ICCAVR* 已測試通過*byQinZhengye*2011-08-07*//** 硬件接口: LCD_DATA->PE* RS->PB0* RW->PB1* EN->PB2*/#include"my_include.h"#include"LCD12864_graphics.h"voidmain(){ Port_init(); //端口初始化 LCD12864_init(); _delay_ms(5); //要等待液晶初始化完畢 LCD12864_string(0,0,"液晶"); //寫入內(nèi)容 LCD12864_string(1,0,"被屏蔽的號碼"); // LCD12864_string(0,6,"畫點"); LCD12864_clear(); //圖形模式的清屏 LCD12864_dot(36,0,8,1); //在(36,8)處畫點(0無用,看定義函數(shù)前的說明) LCD12864_line(90,8,39,8,1); //箭頭的形狀 LCD12864_dot(40,0,7,1); LCD12864_dot(40,0,9,1); LCD12864_dot(41,0,6,1); LCD12864_dot(41,0,10,1); LCD12864_line(30,60,116,20,1); LCD12864_bar(90,45,110,60,1); LCD12864_rectangle(9,34,40,62,1);}------------LCD12864_basic.h-------------/**LCD12864驅(qū)動程序----basic*此頭文件有LCD12864的基本的寫指令數(shù)據(jù)*forATmega128*16MHz*編譯器:ICCAVR*已測試通過*byQinZhengye*//*宏定義要用到的函數(shù)(沒用到可以注釋掉,以減小目標(biāo)程序的大小)*///#define__KEY_scanf#define__LCD12864_string/**definefunctions*/voidLCD12864_init(void);voidLCD12864_cmd(unsignedcharcmd);voidLCD12864_dat(unsignedchardat);voidLCD12864_string(unsignedcharY,unsignedcharX,unsignedchar*table);voidcheck_busy(void);unsignedcharKEY_scanf(void);/**定義硬件接口(只接8數(shù)據(jù)+3控制+2電源根線)*RS0-command;1-data*RW0-write;1-read*EN1-input;1->0action*/#defineLCD_IN PINE#defineLCD_DDR DDRE#defineLCD_OUT PORTE#defineKEY_IN PIND#defineKEY_OUT PORTD#defineKEY_DDR DDRD#defineBUSY ((LCD_IN&0x80)!=0)#defineRS_COMD (PORTB&=~(0x01<<0))#defineRS_DATA (PORTB|=(0x01<<0))#defineRW_WRITE (PORTB&=~(0x01<<1))#defineRW_READ (PORTB|=(0x01<<1))#defineEN_SET (PORTB|=(0x01<<2))#defineEN_CLR (PORTB&=~(0x01<<2))/* 鍵盤掃描* 電路無需電阻,高效行列版** 鍵盤布局:**D3D2D1D0*||||*D4--0123*D5--4567*D6--89AB*D7--CDEF** 說明:鍵盤沒有按下則返回0,按下返回對應(yīng)鍵值*/#ifdef __KEY_scanfunsignedcharKEY_scanf(void){ uchartemp; KEY_DDR=0x0F; KEY_OUT=0xF0; _delay_ms(4); if((temp=KEY_IN)!=0xF0) { KEY_DDR=0xF0; KEY_OUT=0x0F; _delay_ms(1); temp=temp|KEY_IN; switch(temp) { case0xE7:return'0'; case0xEB:return'1'; case0xED:return'2'; case0xEE:return'3'; //第一行 case0xD7:return'4'; case0xDB:return'5'; case0xDD:return'6'; case0xDE:return'7'; //第二行 case0xB7:return'8'; case0xBB:return'9'; case0xBD:return'A'; case0xBE:return'B'; //第三行 case0x77:return'C'; case0x7B:return'D'; case0x7D:return'E'; case0x7E:return'F'; //第四行 } } return0;}#endif/* LCD12864初始化 */voidLCD12864_init(void){ LCD12864_cmd(0x30); //基本指令,字符模式 LCD12864_cmd(0x06); LCD12864_cmd(0x0C); // LCD12864_cmd(0x01); //清屏 LCD12864_cmd(0x80);}/* 寫8位的命令 */voidLCD12864_cmd(unsignedcharcmd){ check_busy(); RW_WRITE; LCD_OUT=cmd; _delay_us(1); //出現(xiàn)亂碼請加長延時時間 EN_CLR;}/* 寫8位的數(shù)據(jù) */voidLCD12864_dat(unsignedchardat){ check_busy(); RS_DATA; RW_WRITE; LCD_OUT=dat; _delay_us(1); //出現(xiàn)亂碼請加長延時時間 EN_CLR;}/** 寫字符串* Y取值(0~3)* X取值(0~7)*table:要顯示的字符串的指針*/#ifdef __LCD12864_stringvoidLCD12864_string(unsignedcharY,unsignedcharX,unsignedchar*table){ unsignedchari; switch(Y) { case0:LCD12864_cmd(0x80+X); break; case1:LCD12864_cmd(0x90+X); break; case2:LCD12864_cmd(0x88+X); break; case3:LCD12864_cmd(0x98+X); break; default:return; } for(i=0;table[i]!='\0';i++) LCD12864_dat(table[i]);}#endif/* 檢查忙 */voidcheck_busy(void){ ucharn=200; //控制時間,時間過長強制退出 LCD_OUT=0xFF; RS_COMD; RW_READ; EN_SET; //_delay_us(10); while(BUSY==1&&--n>0);}-----------LCD12864_graphics.h-------------/**LCD12864驅(qū)動程序----graphics*此頭文件有LCD12864的圖形模式下的*清屏,畫320*240的圖畫,*讀指定位置的內(nèi)容,畫點,畫線,畫矩形框,*填充矩形*forATmega128*16MHz*編譯器:ICCAVR*已測試通過*byQinZhengye*//* 注意: 本人用ICCAVR作編譯器,發(fā)現(xiàn)下面的"LCD12864_dot"函數(shù)的參數(shù)有問題* 定義成"LCD12864_dot(unsignedcharX,unsignedcharY,unsignedcharcolor)"* 當(dāng)?shù)谝粋€實參"X"是浮點數(shù)時,發(fā)現(xiàn)傳給第二個參數(shù)"Y"的值會跟傳給"X"的數(shù)值一樣* 所以下面在兩者之間插入一個參數(shù),調(diào)用時多寫一個數(shù)就沒事了.如果你知道解決辦法麻煩QQ通知一聲:)*//**宏定義要用到的函數(shù)(沒用到可以注釋掉,以減小目標(biāo)程序的大小)*函數(shù)具體內(nèi)容看下面*/#define __LCD12864_clear#define __LCD12864_next#define __LCD12864_read_8#define __LCD12864_read_16#define __LCD12864_dot#define __LCD12864_line#define __LCD12864_bar#define __LCD12864_rectangle#define __LCD12864_whole_line//#define __LCD12864_BMP/** 聲明函數(shù)*/voidLCD12864_clear(void);voidLCD12864_next(void);voidLCD12864_dot(unsignedcharX,unsignedcharDB_X,unsignedcharY,unsignedcharcolor);voidLCD12864_line(unsignedcharX0,unsignedcharY0,unsignedcharX1,unsignedcharY1,unsignedcharcolor);voidLCD12864_bar(unsignedcharleft,unsignedcharup,unsignedcharright,unsignedchardown,unsignedcharcolor);voidLCD12864_rectangle(unsignedcharleft,unsignedcharup,unsignedcharright,unsignedchardown,unsignedcharcolor);voidLCD12864_whole_line(unsignedcharY,unsignedcharcolor);voidLCD12864_BMP(unsignedchar*table);unsignedcharLCD12864_read_8(void);unsignedintLCD12864_read_16(void);/* 包含基本的函數(shù) */#include"LCD12864_basic.h"/* 圖形模式的清屏 */#ifdef __LCD12864_clearvoidLCD12864_clear(void){ unsignedchari,j; LCD12864_cmd(0x34); //關(guān)圖形模式的顯示 for(i=0;i<32;i++) { LCD12864_cmd(0x80+i); LCD12864_cmd(0x80); for(j=0;j<32;j++) LCD12864_dat(0x00); } LCD12864_cmd(0x36); //開圖形模式的顯示}#endif/* 編輯位置移到下一個8位* 可以移到低8位單獨編輯內(nèi)容*/#ifdef __LCD12864_nextvoidLCD12864_next(void){ ucharn=100; RS_COMD; RW_READ; EN_SET; while(BUSY==1&&--n>0); RS_DATA; EN_CLR;}#endif/* 從LCD12864讀數(shù)據(jù)* 注意:LCD12864的讀操作,第一次讀到的是地址*第二次讀到的才是該地址對應(yīng)的數(shù)據(jù)*/#ifdef__LCD12864_read_8unsignedcharLCD12864_read(void){ unsignedchartemp; check_busy(); LCD_OUT=0xFF; RS_DATA; RW_READ; EN_SET; LCD_DDR=0x00; _delay_us(1); temp=LCD_IN; EN_CLR; LCD_DDR=0xFF; return(temp); }/* 讀LCD12864的一個字節(jié) */unsignedcharLCD12864_read_8(void){ LCD12864_read(); //注意:讀兩次才讀到數(shù)據(jù) returnLCD12864_read();}#endif/* 讀LCD12864的16位數(shù)據(jù) */#ifdef __LCD12864_read_16unsignedintLCD12864_read_16(void){ unsignedint_16_data; unsignedcharL_dat; _16_data=LCD12864_read_8(); L_dat=LCD12864_read(); return(_16_data<<8)|L_dat;}#endif/** 向LCD12864在(X,Y)出寫一個點** 0<=X<=127* 0<=Y<=63* color:0->擦點,非0->畫點* (傳來的DB_X沒用看文件前面的注意)*/#ifdef __LCD12864_dotvoidLCD12864_dot(unsignedcharX,unsignedcharDB_X,unsignedcharY,unsignedcharcolor){ unsignedchartemp,temp2=0; if((0x01&(X>>3))!=0) temp2=1; DB_X=X>>4; X=X&0x07; //X=X%8; if(Y>=32) { DB_X+=8; Y-=32; } LCD12864_cmd(0x80+Y); LCD12864_cmd(0x80+DB_X); if(temp2) LCD12864_next(); temp=LCD12864_read_8(); if(color!=0) temp|=(0x80>>X); else temp&=~(0x80>>X); LCD12864_cmd(0x80+Y); LCD12864_cmd(0x80+DB_X); if(temp2) LCD12864_next(); LCD12864_dat(temp);}#endif/** 向LCD12864畫一條線* 起點(X0,Y0),終點(X1,Y1)* 0<=X<=127* 0<=Y<=63*/#ifdef __LCD12864_linevoidLCD12864_line( unsignedcharX0,unsignedcharY0, unsignedcharX1,unsignedcharY1,ucharcolor){ LCD12864_cmd(0x34); //關(guān)閉顯示 if(X0==X1) //K=1 { if(Y0>Y1) { X1=Y0; Y0=Y1; Y1=X1; } while(Y0<=Y1) LCD12864_dot(X0,0,Y0++,color); LCD12864_cmd(0x36); //打開顯示 return; } if(Y0==Y1) //K=0 { if(X0>X1) { Y1=X0; X0=X1; X1=Y1; } while(X0<=X1) LCD12864_dot(X0++,0,Y0,color); LCD12864_cmd(0x36); //打開顯示 return; } else //K!=0&&K!=1 { float_K; chartemp1=(X1<X0)?(X0-X1):(X1-X0); chartemp2=(Y1<Y0)?(Y0-Y1):(Y1-Y0); if(temp1<temp2) //Y { _K=(float)temp1/temp2; temp2=(Y0>Y1)?(-1):(1); if(X0>X1) _K=-_K; temp1=1; LCD12864_dot(X0,0,Y0,color); do { Y0+=temp2; LCD12864_dot(X0+_K*temp1,0,Y0,color); temp1++; }while(Y0!=Y1); } else //X { _K=(float)temp2/temp1; temp2=(X0>X1)?(-1):(1); if(Y0>Y1) _K=-_K; temp1=1; LCD12864_dot(X0,0,Y0,color); do { X0+=temp2; LCD12864_dot(X0,0,Y0+_K*temp1,color); temp1++; }while(X0!=X1); } } LCD12864_cmd(0x36); //打開顯示}#endif/** 向LCD12864畫一個填充矩形** left:左,X坐標(biāo)* up:上,Y坐標(biāo)*right:右,X坐標(biāo)*down:下,Y坐標(biāo)** 0<=(left&right)<=127* 0<=(up&down)<=63*/#ifdef __LCD12864_barvoidLCD12864_bar( unsignedcharleft,unsignedcharup, unsignedcharright,unsignedchardown,ucharcolor){ unsignedchartemp; LCD12864_cmd(0x34); if(left>right) { temp=left; left=right; right=temp; } if(up>down) { temp=up; up=down; down=temp; } for(;up<=down;up++) for(temp=left;temp<=right;temp++) LCD12864_dot(temp,0,up,color); LCD12864_cmd(0x36);}#endif/** 向LCD12864畫一個矩形框** left:左,X坐標(biāo)* up:上,Y坐標(biāo)*right:右,X坐標(biāo)*down:下,Y坐標(biāo)** 0<=(left&right)<=127* 0<=(up&down)<=63*/#ifdef __LCD12864_rectanglevoidLCD12864_rectangle( unsignedcharleft,unsignedcharup, unsignedcharright,unsignedchardown,ucharcolor){ LCD12864_line(left,up,right,up,color); LCD12864_line(right,up,right,down,color); LCD12864_line(right,down,left,down,color); LCD12864_line(left,down,left,up,color);}#endif/* 畫一整行* Y:行數(shù)(0~63)*/#ifdef __LCD12864_whole_linevoidLCD12864_whole_line(unsignedcharY,unsignedcharcolor){ unsignedchartemp=0x80; if(Y>=32) { temp+=8; Y-=32; } LCD12864_cmd(Y+0x80); LCD12864_cmd(temp); for(temp=0;temp<16;temp++) LCD12864_dat(color);}#endif/* 畫一幅128*64的圖畫 */#ifdef __LCD12864_BMPvoidLCD12864_BMP(unsignedchar*table){ uchari,j; uintn=0; LCD12864_cmd(0x34); for(i=0;i<64;i++) { if(i>=32) { LCD12864_cmd(0x80+i-32); LCD12864_cmd(0x88); } else { LCD12864_cmd(0x80+i); LCD12864_cmd(0x80); } for(j=0;j<16;j++) LCD12864_dat(table[n++]); } LCD12864_cmd(0x36);}#endif------
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度民政廳離婚協(xié)議書模板定制及法律援助合同4篇
- 二零二五年度美術(shù)教育機構(gòu)美術(shù)教師實習(xí)指導(dǎo)合同4篇
- 2025年SET電子支付流程升級與加密技術(shù)集成服務(wù)合同3篇
- 2025年度綜合交通樞紐車位出售及配套設(shè)施租賃及管理合同4篇
- 音樂劇排練課程設(shè)計
- 2025年度寵物醫(yī)院寵物醫(yī)院連鎖經(jīng)營合作協(xié)議3篇
- 2025年度智慧農(nóng)業(yè)科技承包荔枝果樹合同范本4篇
- 2025年度垃圾處理PPP項目特許經(jīng)營合作協(xié)議3篇
- 二零二五年度租賃房屋租賃終止合同2篇
- 管道閥門安裝施工方案
- 云南省農(nóng)村信用社招聘筆試真題2023
- 安全生產(chǎn)盡職免責(zé)
- IT項目外包服務(wù)商管理應(yīng)急預(yù)案
- 工程物資供應(yīng)、運輸、售后服務(wù)方案
- 新生兒低血糖課件
- 自動上下料機械手的設(shè)計研究
- 電化學(xué)儲能電站安全規(guī)程
- 幼兒園學(xué)習(xí)使用人民幣教案教案
- 2023年浙江省紹興市中考科學(xué)真題(解析版)
- 語言學(xué)概論全套教學(xué)課件
- 大數(shù)據(jù)與人工智能概論
評論
0/150
提交評論