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

下載本文檔

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

文檔簡(jiǎn)介

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

2、(3)系統(tǒng)調(diào)試與改進(jìn),調(diào)整系統(tǒng)參數(shù),分析系統(tǒng)運(yùn)行結(jié)果;(4)寫出設(shè)計(jì)總結(jié)報(bào)告。 工作計(jì)劃與進(jìn)度安排:20周(上):學(xué)習(xí)ARM7虛擬儀器原理、設(shè)計(jì)方法和實(shí)現(xiàn)技巧,掌握簡(jiǎn)單ARM7程序的編程實(shí)現(xiàn),掌握簡(jiǎn)單通信系統(tǒng)設(shè)計(jì)和分析方法。20周(下):采用ARM7語言,實(shí)現(xiàn)電子萬年歷設(shè)計(jì),并對(duì)萬年歷進(jìn)行評(píng)估。指導(dǎo)教師: 2015 年 7 月13 日專業(yè)負(fù)責(zé)人:2015 年 7 月13 日學(xué)院教學(xué)副院長(zhǎng):2015 年7月 13 日目錄專心-專注-專業(yè)1 系統(tǒng)設(shè)計(jì)1.1電子顯示屏特性1>LED由計(jì)算機(jī)專用設(shè)備、顯示屏幕、視頻輸入端口和系統(tǒng)等組成。2>計(jì)算機(jī)及專用設(shè)備直接決定了系統(tǒng)的功能,可根據(jù)用戶對(duì)

3、系統(tǒng)的不同要求選擇不同的類型3>提供視頻輸入端口。1.2 按鍵控制 1>用于年月日的調(diào)控,復(fù)位。2>用于時(shí)分秒的置換,清屏。1.3LCD顯示端LCD顯示端如圖1所示。圖1 LCD顯示端1.4 萬年歷調(diào)控電路 萬年歷調(diào)控電路如圖2所示。圖2 萬年歷調(diào)控電路1.5 萬年歷的實(shí)現(xiàn) 使用調(diào)試功能,經(jīng)過反復(fù)的調(diào)試終于實(shí)現(xiàn)了計(jì)時(shí)功能,然后通過查詢資料,實(shí)現(xiàn)了計(jì)時(shí)過程中時(shí)鐘實(shí)時(shí)更新功能及實(shí)現(xiàn)LED燈跟節(jié)奏閃爍。再經(jīng)過程序的改進(jìn),實(shí)現(xiàn)了實(shí)時(shí)時(shí)鐘和鬧鐘調(diào)整功能。添加了LED燈指示調(diào)整時(shí)間點(diǎn)(秒、分、時(shí)、星期、日、月、年)功能。1.6 LCD調(diào)試電路圖調(diào)試電路圖如圖3所示。圖3 調(diào)試電路圖2 軟

4、件的具體功能和要求2.1 基本要求本課題所設(shè)計(jì)的系統(tǒng)要求:(1) 在理解基本實(shí)驗(yàn)代碼的基礎(chǔ)上,掌握萬年歷的工作原理,基于程序控制方式的驅(qū)動(dòng)設(shè)計(jì)。(2) 在proteus中使用ARM7的LPC2106芯片并且結(jié)合Keil的源代碼, 實(shí) 現(xiàn)萬年歷功能。(3) 編寫基于萬年歷程序,實(shí)現(xiàn)代碼編譯。2.2軟件設(shè)計(jì)平臺(tái)的介紹及實(shí)現(xiàn)方法本設(shè)計(jì)中采用可編程邏輯設(shè)計(jì)環(huán)境ARM7進(jìn)行設(shè)計(jì),Keil uVsion5采用C語言進(jìn)行編程。2.3 程序設(shè)計(jì)流程圖萬年歷程序流程圖如圖4所示。開始初始化 讀日期、時(shí)間 寫日期、時(shí)間 顯示子程序 時(shí)間修改子程序 日期修改子程序顯示結(jié)果返回 開關(guān)控制子程序圖4 萬年歷程序流程圖3

5、 設(shè)計(jì)總結(jié)3.1 proteus仿真電路圖 仿真結(jié)果如圖5所示。圖5 仿真電路圖3.2 Keil 源代碼 /* * 功能:LCD12864 液晶顯示 驅(qū)動(dòng)程序 */ #include "config.h" #define 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 L

6、CD12864_CTL_NO 11 /控制線起始端口 #define LCD12864_DAT_NO 16 /數(shù)據(jù)線起始端口 #define LCD12864_RS (1<<(LCD12864_CTL_NO+2) /命令/數(shù)據(jù) #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

7、為第0行 #define LCD_PAGE 0xB8 /設(shè)置頁(yè)指令。 #define LCD_COL 0x40 /設(shè)置列指令。 #define LCD_LINE 0x40 /設(shè)置列指令 #define SINGLE_SCREEN_COL 64 /左右屏,每屏64列 #define LCD12864_CSA (1<<(LCD12864_CTL_NO) /控制線端口定義,選中左部屏幕 #define LCD12864_CSB (1<<(LCD12864_CTL_NO+1) /選中右部屏幕 #define LCD12864_WIDTH 128 /寬度 #define LCD1

8、2864_HIGH 64 /高度 #define LCD12864_PAGE 8 /頁(yè)數(shù) /引用外部字模 extern uint8 sytx832; extern uint8 snum16; extern uint8 hytx832; 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 ui

9、nt8 menu4; uint8 tm6; /獲取時(shí)間存在數(shù)組中 uint8 year6; /獲取日期存在數(shù)組中 uint8 day; /獲取星期號(hào) uint8 dis_buf22; /數(shù)據(jù)緩沖區(qū) /uint8 dayoder; /延時(shí)函數(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); /顯

10、示字符函數(shù) void DisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData); /顯示字符 void vDisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData); /反選顯示字符 /顯示數(shù)字函數(shù) void Displaynum (uint8 ucPage,uint8 ucCol, uint8 *pDisTable ); /顯示數(shù)字 /顯示漢字、字符串函數(shù) void DispOneChinese(uint8 ucPage,uint8 ucCol,uint8 *pDisTable,uint8 Col); /一

11、個(gè)漢字 void DispChinese(uint8 ucPage,uint8 ucCol,uint8 pDisTable32,uint8 Num,uint8 Col) ; /多個(gè)漢字 /全屏 顯示圖片 void DisPicture(uint8 *pDisTable); void vDisPicture(uint8 *pDisTable,uint8 sur ); /刷新屏幕函數(shù)-只刷新其中一部分 void Dateupdated(uint8 numcode); void Weekupdated(uint8 oder); void Timeupdated(uint8 numcode); voi

12、d SetTimeRtc (void); /填充時(shí)間變量 /刷新屏幕函數(shù) void fresh(void); /定時(shí)器中斷處理函數(shù) ,其中調(diào)用屏幕刷新函數(shù)fresh void _irq RTC_Int(void); /主函數(shù)入口 int main() LCDInit2(); /初始化后清屏 RTCInit(); /初始化實(shí)時(shí)時(shí)鐘 DispChinese(0,0,hytx,8,16) ; /顯示"歡迎同學(xué)止步的風(fēng)" VICIntSelect = 0x00; / 設(shè)置所有中斷連接IRQ中斷 VICVectCntl0 = 0x20 | 13; / 分配通道0 VICVectAdd

13、r0 = (int)RTC_Int; / 設(shè)置中斷服務(wù)程序地址 VICIntEnable = (1 << 13); / 使能RTC中斷 SetTimeRtc(); Timeupdated(tm); Dateupdated(year); Weekupdated(day); while (1) while (0 = (ILR & 0x01); / 等待RTC增量中斷 ILR = 0x01; / 清除中斷標(biāo)志 /WriteData2(0xff); /DispChinese(1,0,Nums,10,8) ; /顯示"" /ClearAll2(); /Displa

14、ynum (6,2+8*2,*(snum+10); /DispChinese(1,0,Nums,10,8) ; /顯示"" /DispOneChinese (6,96,*(week+6),16); /每次循環(huán),顯示一個(gè)漢字 /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

15、() /*功能:延時(shí)函數(shù) /*/ void Delay(uint32 x) unsigned int i1,j1; for(j1=0;j1<100;j1+) for(i1=0;i1<x;i1+); /* /* 名稱:vCheckBusy /* 功能:檢查L(zhǎng)CD是否忙 /* void vCheckBusy(void) LCD12864_DIR &= 0xF9FFFF03; /數(shù)據(jù)線為輸入 while(1) LCD12864_CLR=LCD12864_RS; LCD12864_SET=LCD12864_RW; LCD12864_SET=LCD12864_EN; LCD12864

16、_CLR=LCD12864_EN; if(!(LCD12864_PIN & LCD12864_BUSY) break; LCD12864_DIR |= 0xFC; /數(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ù)

17、端口 LCD12864_SET=ucCMD<<LCD12864_DAT_NO; /傳遞命令 LCD12864_SET=LCD12864_EN; /給EN一個(gè)高脈沖,發(fā)送數(shù)據(jù) LCD12864_CLR=LCD12864_EN; /發(fā)送完成后,使能位置L,供以后繼續(xù)使用 /* /* 名稱:WriteData2 /* 功能:寫數(shù)據(jù) /* void WriteData2(uint8 ucData) vCheckBusy(); LCD12864_SET=LCD12864_RS; /寫數(shù)據(jù)時(shí),RS為H,RW為L(zhǎng) LCD12864_CLR=LCD12864_RW; LCD12864_CLR=0x

18、FF <<LCD12864_DAT_NO; /清零8位數(shù)據(jù)端口 LCD12864_SET=ucData<<LCD12864_DAT_NO; /傳遞命令 LCD12864_SET=LCD12864_EN; /給EN一個(gè)高脈沖,發(fā)送數(shù)據(jù) LCD12864_CLR=LCD12864_EN; /發(fā)送完成后,使能位置L,供以后繼續(xù)使用 /* /* 名稱:CleanAll2 /* 功能:清屏 /* void ClearAll2(void) uint8 ucPage,ucCol; /頁(yè)號(hào),列號(hào) LCD12864_SET=LCD12864_CSA; /左右兩屏都選中 LCD12864_

19、SET=LCD12864_CSB; for(ucPage=0;ucPage<8;ucPage+) vWriteCMD2(LCD_PAGE+ucPage); /設(shè)置頁(yè)號(hào) ,從0行開始 ,光標(biāo)位置 vWriteCMD2(LCD_COL); /設(shè)置列號(hào) ,定位在第0列 for(ucCol=0;ucCol<64;ucCol+) /左右半屏都是64列,所以循環(huán)64次就可以啦,兩邊同時(shí)清屏 vWriteCMD2(LCD_PAGE+ucPage); /設(shè)置頁(yè)號(hào) ,從0行開始 ,光標(biāo)位置 vWriteCMD2(LCD_COL+ucCol); /設(shè)置列號(hào) ,從0列開始,到63列結(jié)束 WriteDat

20、a2(0x00); /寫零,表示清空當(dāng)前列 /* /* 名稱:LCDInit2 /* 功能:初始化 /* void LCDInit2(void) LCD12864_DIR |=0x00FFF800; /11-23為輸出 LCD12864_CLR |=0x00FFF800; /清零11-23 vWriteCMD2(LCD_DispOn); /開顯示 vWriteCMD2(LCD_STARTROW); /設(shè)置起始行地址,列地址和頁(yè)地址是變化的 ClearAll2(); /* * /* Function Name : DisplayByte /Date : * /* Parameter: ucPag

21、e /ucData void DisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData) /先選擇顯示屏幕(左or右) if(ucCol/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=LCD1

22、2864_CSB; /右開 /設(shè)置坐標(biāo) vWriteCMD2(LCD_PAGE+ucPage); /設(shè)置開始的頁(yè)號(hào) vWriteCMD2(LCD_COL+ucCol%SINGLE_SCREEN_COL); /設(shè)置開始的列號(hào) /顯示數(shù)據(jù) WriteData2(ucData); /* /* 名稱 vDisplayByte /* 功能 反顯一個(gè)字符 /* 參數(shù)解釋 ucPage 顯示的起始頁(yè)數(shù) ucCol 顯示的起始列數(shù) ucData 要顯示的數(shù)據(jù) /*/ void vDisplayByte(uint8 ucPage,uint8 ucCol,uint8 ucData) if(ucCol/ LCD12

23、864_HIGH=0) LCD12864_SET=LCD12864_CSA; LCD12864_CLR=LCD12864_CSB; else LCD12864_CLR=LCD12864_CSA; LCD12864_SET=LCD12864_CSB; vWriteCMD2(LCD_PAGE+ucPage); vWriteCMD2(LCD_LINE+ucCol%LCD12864_HIGH); WriteData2(ucData); /* /* 名稱 vDisPicture /* 功能 顯示一個(gè)被選中一部分的界面 /* 參數(shù)解釋 *pDisTable 圖像數(shù)據(jù)的指針 /* sur 值作用 0 1 2

24、 3 4 5 6 7 分別為選中八塊中的一塊 12 24 36 48 分別為選中 0 1 頁(yè) 2 3 頁(yè) 4 5頁(yè) 6 7 頁(yè) /*/ void vDisPicture(uint8 *pDisTable,uint8 sur ) uint8 ucPage=0; /起始頁(yè) uint8 ucCol=0; /起始列 uint8 width=128; /lcd寬度 uint8 hight=64; /lcd高度 uint8 i,j; /臨時(shí)變量 if(sur>=0 & sur<=7 )/輸入數(shù)據(jù)sur在 0-7之間 for(i = ucPage;i<ucPage+hight/8;

25、i+) /頁(yè)數(shù)遞增 for(j = ucCol;j<ucCol+ width;j+) /列數(shù)遞增 if( (i>=(sur/2)*2)&&(i<=(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

26、 24 36 48 其中之一 for(i = ucPage;i<ucPage+hight/8;i+) /頁(yè)遞增 for(j = ucCol;j<ucCol+ width;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ù)功能 :顯示一個(gè)數(shù)字 /* 入口參數(shù) :ucPage 顯示的

27、起始頁(yè)數(shù) ucCol 顯示的起始列數(shù) *pDisTable 要顯示的數(shù)據(jù)的指針 /* 出口參數(shù) :無 /*/ void Displaynum (uint8 ucPage,uint8 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ù)名稱 :Date

28、updated() /* 函數(shù)功能 :在待機(jī)界面刷新日期 /* 入口參數(shù) :numcode 要顯示的數(shù)據(jù)組成的數(shù)組 長(zhǎng)度為六 數(shù)字范圍0-9 pDisTable16 數(shù)字 和溫度標(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

29、(ucPage,ucCol+8*i,*(snum+numcodei); else Displaynum (ucPage,ucCol+8*i,*(snum+numcodei); /* /* 函數(shù)名稱 :SetTimeRtc() /* 函數(shù)功能 :獲取時(shí)間的各種數(shù)據(jù) /* 入口參數(shù) :無 /* 出口參數(shù) :無 /*/ void SetTimeRtc (void) uint32 datas; uint32 times; uint32 bak; / uint8 MESSAGE="-北京時(shí)間:-" times = CTIME0; / 讀取完整的時(shí)鐘寄存器 datas = CTIME1

30、; bak = (datas >> 16) & 0xfff; / 獲取年 dis_buf0=bak/1000+'0' bak = bak % 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 =

31、datas & 0x1f; / 獲取日 dis_buf8=bak/10; dis_buf9=bak%10; dis_buf10=' ' bak = (times >> 24) & 0x07; / 獲取星期 dis_buf11=bak%10; dis_buf12=' ' bak = (times >> 16) & 0x1f;/ 獲取小時(shí) dis_buf13=bak/10; dis_buf14=bak%10; dis_buf15=':' bak = (times >> 8) & 0x

32、3f; / 獲取分鐘 dis_buf16=bak/10; dis_buf17=bak%10; dis_buf18=':' bak = times & 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;

33、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),顯示一個(gè)漢字 /* /* 名稱 : Timeupdated /* 作用 : 在待機(jī)界面刷新時(shí)間 /* 參數(shù)解釋 : numcode 要顯示的數(shù)據(jù)組成數(shù)組 pDisTable16 /*/ void Timeupdated(uint8 numcode) uint8 ucPage=4; uint8 ucCol=32; uint8 count=6; uint8 i=0; for(i= 0;i<count;i+) if( i=2|

溫馨提示

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

評(píng)論

0/150

提交評(píng)論