基于ARM7的電子萬年歷設計_第1頁
基于ARM7的電子萬年歷設計_第2頁
基于ARM7的電子萬年歷設計_第3頁
基于ARM7的電子萬年歷設計_第4頁
基于ARM7的電子萬年歷設計_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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 /設置起始行指令,0xC0為第0行 #define LCD_PAGE 0xB8 /設置頁指令。10111000 #define LCD_COL 0x40 /設置列指令。 #define LCD_LINE 0x40 /設置列指令 #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 /頁數 /引用外部字模 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; /獲取時間存在數組中 uint8 year6; /獲取日期存在數組中 uint8 day; /獲取星期號 uint8 dis_buf22; /數據緩沖區 /uint8 dayoder

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

11、int8 ucData); /反選顯示字符 /顯示數字函數 void Displaynum (uint8 ucPage,uint8 ucCol, uint8 *pDisTable ); /顯示數字 /顯示漢字、字符串函數 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 ); /刷新屏幕函數-只刷新其中一部分 void Dateupdated(uint8 numcode); void Weekupdated(uint8 oder); void Timeupdated(uint8 numcode); void SetTimeRtc (void); /填充時間變量 /刷新屏幕函數 void fresh(void); /定時器中斷處理函數 ,其中調用屏幕刷新函數fresh void _irq RTC_Int(void); /主函數入

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

14、ted(year); Weekupdated(day); while (1) while (0 = (ILR & 0x01); / 等待RTC增量中斷 ILR = 0x01; / 清除中斷標志 /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); /每次循環,顯示一個漢字 /ClearAll2(); /Displaynum (2,32+8*4,*(snum+year4); /Displaynum (0,0,*(snum+year4); /Displaynum (0,0,*(snum); /vDisPicture(menu4,0); /反選8塊中的一塊區域 /DisPicture(menu4) ; /* /*名稱:Delay() /*功能:延時函數 /*/ 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; /數據線為輸入 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、數據線為輸出*/ /* /* 名稱:vWriteCMD2 /* 功能:寫命令 /* void vWriteCMD2(uint8 ucCMD) vCheckBusy(); LCD12864_CLR=LCD12864_RS; /RS置L ,數據格式為:命令 LCD12864_CLR=LCD12864_RW; /RW置L ,為寫操作 LCD12864_CLR=0xFF <<LCD12864_DAT_NO; /清零數據端口 LCD12864_SET=ucCMD<<LCD12864_DAT_NO; /傳遞命令 LCD12864_SET=LCD12864_EN; /給EN一個高脈沖

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

19、 LCD12864_SET=LCD12864_EN; /給EN一個高脈沖,發送數據 LCD12864_CLR=LCD12864_EN; /發送完成后,使能位置L,供以后繼續使用 /* /* 名稱: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); /設置頁號

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

21、=0x00FFF800; /11-23為輸出 LCD12864_CLR |=0x00FFF800; /清零11-23 vWriteCMD2(LCD_DispOn); /開顯示 vWriteCMD2(LCD_STARTROW); /設置起始行地址,列地址和頁地址是變化的 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; /右關 else if(ucCol/SINGLE_SCREEN_COL=1) /為1說明ucCol大于64。,在右半屏幕 LCD12864_CLR=LCD12864_CSA; /左關 LCD12864_SET=LCD12864_CSB; /右開 /設置坐標 vWriteCMD2(LCD_PAGE+ucPage); /設置開始的頁號 vWriteCMD2(LCD_COL+ucCol%SING

23、LE_SCREEN_COL); /設置開始的列號 /顯示數據 WriteData2(ucData); /* /* 名稱 vDisplayByte /* 功能 反顯一個字符 /* 參數解釋 ucPage 顯示的起始頁數 ucCol 顯示的起始列數 ucData 要顯示的數據 /*/ 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 /* 功能 顯示一個被選中一部分的界面 /* 參數解釋 *pDisTable 圖像數據的指針 /* 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 )/輸入數據sur在 0-7之間 for(i = ucPage;i<ucPage+hight/8;i+) /頁數遞增 for(j = ucCol;j<ucCol+ width;j+) /列數遞增 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 /如果參數不為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); /* /* 函數名稱 :Displaynum() /* 函數功能 :顯示一個數字 /* 入口參數 :ucPage 顯示的起始頁數 ucCol 顯示的起始列數 *pDisTable 要顯示的數據的指針 /* 出口參數 :無 /*/ void Displaynum (uint8 ucPage,ui

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

29、溫度標示橫線字符 /* 出口參數 :無 /*/ 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、 /* /* 函數名稱 :SetTimeRtc() /* 函數功能 :獲取時間的各種數據 /* 入口參數 :無 /* 出口參數 :無 /*/ 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); /每次循環,顯示一個漢字 /* /* 名稱 : Timeupdated /*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論