基于ARM7的電子萬年歷設(shè)計_第1頁
基于ARM7的電子萬年歷設(shè)計_第2頁
基于ARM7的電子萬年歷設(shè)計_第3頁
基于ARM7的電子萬年歷設(shè)計_第4頁
基于ARM7的電子萬年歷設(shè)計_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 成 績 評 定 表學(xué)生姓名匡克新班級學(xué)號1203060114專 業(yè)通信工程課程設(shè)計題目基于ARM7的電子萬年歷設(shè)計評語組長簽字:成績?nèi)掌?2015 年 7 月19 日課程設(shè)計任務(wù)書學(xué) 院信息科學(xué)與工程學(xué)院專 業(yè)通信工程學(xué)生姓名匡克新班級學(xué)號1203060114課程設(shè)計題目基于ARM7的電子萬年歷設(shè)計實踐教學(xué)要求與任務(wù):1 學(xué)習(xí)ARM7的虛擬儀器原理、設(shè)計方法和實現(xiàn)技巧;2 掌握簡單ARM7程序的編程實現(xiàn);3 學(xué)會使用Proteus和Keil連接電路圖和關(guān)聯(lián)源代碼;4 采用ARM7語言,實現(xiàn)電子萬年歷設(shè)計;(1)通過檢索、查資料、調(diào)查研究、確定方案、畫出組成系統(tǒng)結(jié)構(gòu)方框圖;(2)采用ARM7實

2、現(xiàn)電子萬年歷;(3)系統(tǒng)調(diào)試與改進(jìn),調(diào)整系統(tǒng)參數(shù),分析系統(tǒng)運(yùn)行結(jié)果;(4)寫出設(shè)計總結(jié)報告。 工作計劃與進(jìn)度安排:20周(上):學(xué)習(xí)ARM7虛擬儀器原理、設(shè)計方法和實現(xiàn)技巧,掌握簡單ARM7程序的編程實現(xiàn),掌握簡單通信系統(tǒng)設(shè)計和分析方法。20周(下):采用ARM7語言,實現(xiàn)電子萬年歷設(shè)計,并對萬年歷進(jìn)行評估。指導(dǎo)教師: 2015 年 7 月13 日專業(yè)負(fù)責(zé)人:2015 年 7 月13 日學(xué)院教學(xué)副院長:2015 年7月 13 日目錄1 系統(tǒng)設(shè)計11.1電子顯示屏特性11.2 按鍵控制11.3LCD顯示端11.4 萬年歷調(diào)控電路21.5 萬年歷的實現(xiàn)31.6 LCD調(diào)試電路圖32 軟件的具體功能

3、和要求42.1 基本要求42.2軟件設(shè)計平臺的介紹及實現(xiàn)方法42.3 程序設(shè)計流程圖43 設(shè)計總結(jié)63.1 proteus仿真電路圖63.2 Keil 源代碼73.3 性能分析23參考文獻(xiàn)241 系統(tǒng)設(shè)計1.1電子顯示屏特性1>LED由計算機(jī)專用設(shè)備、顯示屏幕、視頻輸入端口和系統(tǒng)軟件等組成。2>計算機(jī)及專用設(shè)備直接決定了系統(tǒng)的功能,可根據(jù)用戶對系統(tǒng)的不同要求選擇不同的類型3>提供視頻輸入端口。1.2 按鍵控制 1>用于年月日的調(diào)控,復(fù)位。2>用于時分秒的置換,清屏。1.3LCD顯示端LCD顯示端如圖1所示。圖1 LCD顯示端1.4 萬年歷調(diào)控電路 萬年歷調(diào)控電路如

4、圖2所示。圖2 萬年歷調(diào)控電路1.5 萬年歷的實現(xiàn) 使用調(diào)試功能,經(jīng)過反復(fù)的調(diào)試終于實現(xiàn)了計時功能,然后通過查詢資料,實現(xiàn)了計時過程中時鐘實時更新功能及實現(xiàn)LED燈跟節(jié)奏閃爍。再經(jīng)過程序的改進(jìn),實現(xiàn)了實時時鐘和鬧鐘調(diào)整功能。添加了LED燈指示調(diào)整時間點(秒、分、時、星期、日、月、年)功能。1.6 LCD調(diào)試電路圖調(diào)試電路圖如圖3所示。圖3 調(diào)試電路圖2 軟件的具體功能和要求2.1 基本要求本課題所設(shè)計的系統(tǒng)要求:(1) 在理解基本實驗代碼的基礎(chǔ)上,掌握萬年歷的工作原理,基于程序控制方式的驅(qū)動設(shè)計。(2) 在proteus中使用ARM7的LPC2106芯片并且結(jié)合Keil的源代碼, 實 現(xiàn)萬年歷

5、功能。(3) 編寫基于萬年歷程序,實現(xiàn)代碼編譯。2.2軟件設(shè)計平臺的介紹及實現(xiàn)方法本設(shè)計中采用可編程邏輯設(shè)計環(huán)境ARM7進(jìn)行設(shè)計,Keil uVsion5采用C語言進(jìn)行編程。2.3 程序設(shè)計流程圖萬年歷程序流程圖如圖4所示。開始初始化 讀日期、時間 寫日期、時間 顯示子程序 時間修改子程序 日期修改子程序顯示結(jié)果返回 開關(guān)控制子程序圖4 萬年歷程序流程圖3 設(shè)計總結(jié)3.1 proteus仿真電路圖 仿真結(jié)果如圖5所示。圖5 仿真電路圖3.2 Keil 源代碼 /* * 功能:LCD12864 液晶顯示 驅(qū)動程序 */ #include "config.h" #define

6、LCD12864_DIR IO0DIR /端口方向 #define LCD12864_CLR IO0CLR /數(shù)據(jù)清零 #define LCD12864_SET IO0SET /數(shù)據(jù)置一 #define LCD12864_PIN IO0PIN /端口狀態(tài) #define LCD12864_BUSY (1<<26) /BUSY #define LCD12864_CTL_NO 11 /控制線起始端口 #define LCD12864_DAT_NO 16 /數(shù)據(jù)線起始端口 #define LCD12864_RS (1<<(LCD12864_CTL_NO+2) /命令/數(shù)據(jù) #

7、define LCD12864_RW (1<<(LCD12864_CTL_NO+3) /讀/寫 #define LCD12864_EN (1<<(LCD12864_CTL_NO+4) /使能位 #define LCD_DispOn 0x3F /開顯示命令 #define LCD_STARTROW 0xC0 /設(shè)置起始行指令,0xC0為第0行 #define LCD_PAGE 0xB8 /設(shè)置頁指令。10111000 #define LCD_COL 0x40 /設(shè)置列指令。 #define LCD_LINE 0x40 /設(shè)置列指令 #define SINGLE_SCREE

8、N_COL 64 /左右屏,每屏64列 #define LCD12864_CSA (1<<(LCD12864_CTL_NO) /控制線端口定義,選中左部屏幕 #define LCD12864_CSB (1<<(LCD12864_CTL_NO+1) /選中右部屏幕 #define LCD12864_WIDTH 128 /寬度 #define LCD12864_HIGH 64 /高度 #define LCD12864_PAGE 8 /頁數(shù) /引用外部字模 extern uint8 sytx832; extern uint8 snum16; extern uint8 hytx

9、832; extern uint8 Nums1016; extern uint8 week16; extern uint8 menu1; extern uint8 menu0; extern uint8 degree ; /extern uint8 dianqiguan; extern uint8 menu2 ; extern uint8 menu3; extern uint8 menu4; uint8 tm6; /獲取時間存在數(shù)組中 uint8 year6; /獲取日期存在數(shù)組中 uint8 day; /獲取星期號 uint8 dis_buf22; /數(shù)據(jù)緩沖區(qū) /uint8 dayoder

10、; /延時函數(shù) void Delay(uint32 x); /初始化函數(shù) void RTCInit (void); void LCDInit2(void); void vCheckBusy(void); void vWriteCMD2(uint8 ucCMD); void WriteData2(uint8 ucData); void ClearAll2(void); /顯示字符函數(shù) void DisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData); /顯示字符 void vDisplayByte(uint8 ucPage,uint8 ucCol,u

11、int8 ucData); /反選顯示字符 /顯示數(shù)字函數(shù) void Displaynum (uint8 ucPage,uint8 ucCol, uint8 *pDisTable ); /顯示數(shù)字 /顯示漢字、字符串函數(shù) void DispOneChinese(uint8 ucPage,uint8 ucCol,uint8 *pDisTable,uint8 Col); /一個漢字 void DispChinese(uint8 ucPage,uint8 ucCol,uint8 pDisTable32,uint8 Num,uint8 Col) ; /多個漢字 /全屏 顯示圖片 void DisPic

12、ture(uint8 *pDisTable); void vDisPicture(uint8 *pDisTable,uint8 sur ); /刷新屏幕函數(shù)-只刷新其中一部分 void Dateupdated(uint8 numcode); void Weekupdated(uint8 oder); void Timeupdated(uint8 numcode); void SetTimeRtc (void); /填充時間變量 /刷新屏幕函數(shù) void fresh(void); /定時器中斷處理函數(shù) ,其中調(diào)用屏幕刷新函數(shù)fresh void _irq RTC_Int(void); /主函數(shù)入

13、口 int main() LCDInit2(); /初始化后清屏 RTCInit(); /初始化實時時鐘 DispChinese(0,0,hytx,8,16) ; /顯示"歡迎同學(xué)止步的風(fēng)" VICIntSelect = 0x00; / 設(shè)置所有中斷連接IRQ中斷 VICVectCntl0 = 0x20 | 13; / 分配通道0 VICVectAddr0 = (int)RTC_Int; / 設(shè)置中斷服務(wù)程序地址 VICIntEnable = (1 << 13); / 使能RTC中斷 SetTimeRtc(); Timeupdated(tm); Dateupda

14、ted(year); Weekupdated(day); while (1) while (0 = (ILR & 0x01); / 等待RTC增量中斷 ILR = 0x01; / 清除中斷標(biāo)志 /WriteData2(0xff); /DispChinese(1,0,Nums,10,8) ; /顯示"0123456789" /ClearAll2(); /Displaynum (6,2+8*2,*(snum+10); /DispChinese(1,0,Nums,10,8) ; /顯示"0123456789" /DispOneChinese (6,96

15、,*(week+6),16); /每次循環(huán),顯示一個漢字 /ClearAll2(); /Displaynum (2,32+8*4,*(snum+year4); /Displaynum (0,0,*(snum+year4); /Displaynum (0,0,*(snum); /vDisPicture(menu4,0); /反選8塊中的一塊區(qū)域 /DisPicture(menu4) ; /* /*名稱:Delay() /*功能:延時函數(shù) /*/ void Delay(uint32 x) unsigned int i1,j1; for(j1=0;j1<100;j1+) for(i1=0;i1

16、<x;i1+); /* /* 名稱:vCheckBusy /* 功能:檢查LCD是否忙 /* void vCheckBusy(void) LCD12864_DIR &= 0xF9FFFF03; /數(shù)據(jù)線為輸入 while(1) LCD12864_CLR=LCD12864_RS; LCD12864_SET=LCD12864_RW; LCD12864_SET=LCD12864_EN; LCD12864_CLR=LCD12864_EN; if(!(LCD12864_PIN & LCD12864_BUSY) break; LCD12864_DIR |= 0x060000FC; /

17、數(shù)據(jù)線為輸出*/ /* /* 名稱:vWriteCMD2 /* 功能:寫命令 /* void vWriteCMD2(uint8 ucCMD) vCheckBusy(); LCD12864_CLR=LCD12864_RS; /RS置L ,數(shù)據(jù)格式為:命令 LCD12864_CLR=LCD12864_RW; /RW置L ,為寫操作 LCD12864_CLR=0xFF <<LCD12864_DAT_NO; /清零數(shù)據(jù)端口 LCD12864_SET=ucCMD<<LCD12864_DAT_NO; /傳遞命令 LCD12864_SET=LCD12864_EN; /給EN一個高脈沖

18、,發(fā)送數(shù)據(jù) LCD12864_CLR=LCD12864_EN; /發(fā)送完成后,使能位置L,供以后繼續(xù)使用 /* /* 名稱:WriteData2 /* 功能:寫數(shù)據(jù) /* void WriteData2(uint8 ucData) vCheckBusy(); LCD12864_SET=LCD12864_RS; /寫數(shù)據(jù)時,RS為H,RW為L LCD12864_CLR=LCD12864_RW; LCD12864_CLR=0xFF <<LCD12864_DAT_NO; /清零8位數(shù)據(jù)端口 LCD12864_SET=ucData<<LCD12864_DAT_NO; /傳遞命令

19、 LCD12864_SET=LCD12864_EN; /給EN一個高脈沖,發(fā)送數(shù)據(jù) LCD12864_CLR=LCD12864_EN; /發(fā)送完成后,使能位置L,供以后繼續(xù)使用 /* /* 名稱:CleanAll2 /* 功能:清屏 /* void ClearAll2(void) uint8 ucPage,ucCol; /頁號,列號 LCD12864_SET=LCD12864_CSA; /左右兩屏都選中 LCD12864_SET=LCD12864_CSB; for(ucPage=0;ucPage<8;ucPage+) vWriteCMD2(LCD_PAGE+ucPage); /設(shè)置頁號

20、,從0行開始 ,光標(biāo)位置 vWriteCMD2(LCD_COL); /設(shè)置列號 ,定位在第0列 for(ucCol=0;ucCol<64;ucCol+) /左右半屏都是64列,所以循環(huán)64次就可以啦,兩邊同時清屏 vWriteCMD2(LCD_PAGE+ucPage); /設(shè)置頁號 ,從0行開始 ,光標(biāo)位置 vWriteCMD2(LCD_COL+ucCol); /設(shè)置列號 ,從0列開始,到63列結(jié)束 WriteData2(0x00); /寫零,表示清空當(dāng)前列 /* /* 名稱:LCDInit2 /* 功能:初始化 /* void LCDInit2(void) LCD12864_DIR |

21、=0x00FFF800; /11-23為輸出 LCD12864_CLR |=0x00FFF800; /清零11-23 vWriteCMD2(LCD_DispOn); /開顯示 vWriteCMD2(LCD_STARTROW); /設(shè)置起始行地址,列地址和頁地址是變化的 ClearAll2(); /* * /* Function Name : DisplayByte /Date : * /* Parameter: ucPage /ucData void DisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData) /先選擇顯示屏幕(左or右) if(ucC

22、ol/SINGLE_SCREEN_COL=0) /為0說明ucCol小于64。,在左半屏幕 LCD12864_SET=LCD12864_CSA; /左開 LCD12864_CLR=LCD12864_CSB; /右關(guān) else if(ucCol/SINGLE_SCREEN_COL=1) /為1說明ucCol大于64。,在右半屏幕 LCD12864_CLR=LCD12864_CSA; /左關(guān) LCD12864_SET=LCD12864_CSB; /右開 /設(shè)置坐標(biāo) vWriteCMD2(LCD_PAGE+ucPage); /設(shè)置開始的頁號 vWriteCMD2(LCD_COL+ucCol%SING

23、LE_SCREEN_COL); /設(shè)置開始的列號 /顯示數(shù)據(jù) WriteData2(ucData); /* /* 名稱 vDisplayByte /* 功能 反顯一個字符 /* 參數(shù)解釋 ucPage 顯示的起始頁數(shù) ucCol 顯示的起始列數(shù) ucData 要顯示的數(shù)據(jù) /*/ void vDisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData) if(ucCol/ LCD12864_HIGH=0) LCD12864_SET=LCD12864_CSA; LCD12864_CLR=LCD12864_CSB; else LCD12864_CLR=LCD

24、12864_CSA; LCD12864_SET=LCD12864_CSB; vWriteCMD2(LCD_PAGE+ucPage); vWriteCMD2(LCD_LINE+ucCol%LCD12864_HIGH); WriteData2(ucData); /* /* 名稱 vDisPicture /* 功能 顯示一個被選中一部分的界面 /* 參數(shù)解釋 *pDisTable 圖像數(shù)據(jù)的指針 /* sur 值作用 0 1 2 3 4 5 6 7 分別為選中八塊中的一塊 12 24 36 48 分別為選中 0 1 頁 2 3 頁 4 5頁 6 7 頁 /*/ void vDisPicture(ui

25、nt8 *pDisTable,uint8 sur ) uint8 ucPage=0; /起始頁 uint8 ucCol=0; /起始列 uint8 width=128; /lcd寬度 uint8 hight=64; /lcd高度 uint8 i,j; /臨時變量 if(sur>=0 & sur<=7 )/輸入數(shù)據(jù)sur在 0-7之間 for(i = ucPage;i<ucPage+hight/8;i+) /頁數(shù)遞增 for(j = ucCol;j<ucCol+ width;j+) /列數(shù)遞增 if( (i>=(sur/2)*2)&&(i&l

26、t;=(sur/2)*2+1) if(j>=64*(sur%2)&&j<=64*(sur%2)+63) vDisplayByte(i,j,*(pDisTable+i*128+j); else DisplayByte(i,j,*(pDisTable+i*128+j); else DisplayByte(i,j,*(pDisTable+i*128+j); else /如果參數(shù)不為0-7之間即為 12 24 36 48 其中之一 for(i = ucPage;i<ucPage+hight/8;i+) /頁遞增 for(j = ucCol;j<ucCol+ wi

27、dth;j+) /列遞增 if( i>=(sur-12)/12)*2&&i<=(sur-12)/12)*2+1) vDisplayByte(i,j,*(pDisTable+i*128+j); else DisplayByte(i,j,*(pDisTable+i*128+j); /* /* 函數(shù)名稱 :Displaynum() /* 函數(shù)功能 :顯示一個數(shù)字 /* 入口參數(shù) :ucPage 顯示的起始頁數(shù) ucCol 顯示的起始列數(shù) *pDisTable 要顯示的數(shù)據(jù)的指針 /* 出口參數(shù) :無 /*/ void Displaynum (uint8 ucPage,ui

28、nt8 ucCol, uint8 *pDisTable ) uint8 i; for(i= 0;i<8;i+) /數(shù)字上半部分 DisplayByte(ucPage,ucCol+i,*(pDisTable+i); for(i= 0;i<8;i+) /數(shù)字下半部分 DisplayByte(ucPage+1,ucCol+i,*(pDisTable+8+i); pDisTable+; /* /* 函數(shù)名稱 :Dateupdated() /* 函數(shù)功能 :在待機(jī)界面刷新日期 /* 入口參數(shù) :numcode 要顯示的數(shù)據(jù)組成的數(shù)組 長度為六 數(shù)字范圍0-9 pDisTable16 數(shù)字 和

29、溫度標(biāo)示橫線字符 /* 出口參數(shù) :無 /*/ void Dateupdated(uint8 numcode) uint8 count=6; uint8 ucPage=2; uint8 ucCol=32; uint8 i=0; for(i= 0;i<count;i+) if( i=2|i=4) Displaynum (ucPage,ucCol+8*i,*(snum+10); ucCol+=8; Displaynum (ucPage,ucCol+8*i,*(snum+numcodei); else Displaynum (ucPage,ucCol+8*i,*(snum+numcodei);

30、 /* /* 函數(shù)名稱 :SetTimeRtc() /* 函數(shù)功能 :獲取時間的各種數(shù)據(jù) /* 入口參數(shù) :無 /* 出口參數(shù) :無 /*/ void SetTimeRtc (void) uint32 datas; uint32 times; uint32 bak; / uint8 MESSAGE="-北京時間:-" times = CTIME0; / 讀取完整的時鐘寄存器 datas = CTIME1; bak = (datas >> 16) & 0xfff; / 獲取年 dis_buf0=bak/1000+'0' bak = bak

31、% 1000; dis_buf1=bak/100+'0' bak = bak % 100; dis_buf2=bak/10; dis_buf3=bak%10; dis_buf4='-' bak = (datas >> 8) & 0x0f; / 獲取月 dis_buf5=bak/10; dis_buf6=bak%10; dis_buf7='-' bak = datas & 0x1f; / 獲取日 dis_buf8=bak/10; dis_buf9=bak%10; dis_buf10=' ' bak = (

32、times >> 24) & 0x07; / 獲取星期 dis_buf11=bak%10; dis_buf12=' ' bak = (times >> 16) & 0x1f;/ 獲取小時 dis_buf13=bak/10; dis_buf14=bak%10; dis_buf15=':' bak = (times >> 8) & 0x3f; / 獲取分鐘 dis_buf16=bak/10; dis_buf17=bak%10; dis_buf18=':' bak = times &

33、0x3f; / 獲取秒鐘 dis_buf19=bak/10; dis_buf20=bak%10; tm0= dis_buf13; tm1= dis_buf14; tm2= dis_buf16; tm3= dis_buf17; tm4= dis_buf19; tm5= dis_buf20; year0= dis_buf2; year1= dis_buf3; year2= dis_buf5; year3= dis_buf6; year4= dis_buf8; year5= dis_buf9; day = dis_buf11; /dayoder = dis_buf9; /* /* 名稱:Weekupdated() /* 功能:更新星期 /* void Weekupdated(uint8 oder) /DispOneChinese(6,96,*(week+oder),16); DispOneChinese (6,96,*(week+oder),16); /每次循環(huán),顯示一個漢字 /* /* 名稱 : Timeupdated /*

溫馨提示

  • 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

提交評論