msp430單片機(jī)課程設(shè)計(jì)-實(shí)時(shí)時(shí)鐘與鍵盤控制_第1頁
msp430單片機(jī)課程設(shè)計(jì)-實(shí)時(shí)時(shí)鐘與鍵盤控制_第2頁
msp430單片機(jī)課程設(shè)計(jì)-實(shí)時(shí)時(shí)鐘與鍵盤控制_第3頁
msp430單片機(jī)課程設(shè)計(jì)-實(shí)時(shí)時(shí)鐘與鍵盤控制_第4頁
msp430單片機(jī)課程設(shè)計(jì)-實(shí)時(shí)時(shí)鐘與鍵盤控制_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、河海大學(xué)計(jì)算機(jī)與信息學(xué)院MSP430單片機(jī)課程設(shè)計(jì)實(shí)踐報(bào)告MSP430單片機(jī)課程設(shè)計(jì)實(shí)時(shí)時(shí)鐘與鍵盤控制 一、 設(shè)計(jì)思路該算法的流程簡圖如下:由于LCD無法完全顯示時(shí)間日期,故采用page翻頁的方式設(shè)計(jì),每頁6位顯示。設(shè)定page為奇數(shù)時(shí)表示當(dāng)前在時(shí)間頁面,page為偶數(shù)時(shí)表示當(dāng)前在日期頁面。在修改時(shí)間時(shí),采用的是輸入字符串進(jìn)行修改的方式。1、 顯示當(dāng)前時(shí)間time=hour*10000+min*100+sec。在page為偶數(shù)時(shí),前兩位顯示小時(shí),中間兩位顯示分鐘,最低兩位顯示秒。2、顯示當(dāng)前日期date=year*10000+mon*100+day,并能與時(shí)間切換。在page為奇數(shù)時(shí),前兩位顯

2、示年份,中間兩位顯示月份,最低兩位顯示天。鍵盤上的up、down修改page的值,實(shí)現(xiàn)兩頁顯示的切換。2、 能夠讀取鍵盤值進(jìn)行修改鍵盤通過中斷的方式讀取鍵值,每個(gè)鍵都有相應(yīng)的操作。具體的方案如下:鍵值在0F之間為對(duì)應(yīng)的十六進(jìn)制數(shù)。按下UP鍵,page加1。按下DOWN鍵,page加1,以上兩鍵能使page奇偶變化。按下L鍵,p加1,用于修改數(shù)據(jù)時(shí)修改位置的更改。按下R鍵,p減1,用于修改數(shù)據(jù)時(shí)修改位置的更改。按下ESC鍵,使set置1,進(jìn)入修改模式,并在首位顯示E。按下START鍵,修改的數(shù)據(jù)生效,set置0。按下STOP鍵,取消修改,set置0,清除首位顯示。按下ENTER鍵,確認(rèn)當(dāng)前位的修

3、改,注意是單個(gè)位的修改。3、 體現(xiàn)430系列單片機(jī)的超低功耗的特性。在中斷處理結(jié)束,以及循環(huán)結(jié)束,或者等待鍵盤按鍵時(shí),會(huì)進(jìn)入低功耗工作模式,同時(shí)編程時(shí)也盡量減少函數(shù)的調(diào)用,并將一些變量定義為寄存器變量,提高運(yùn)行效率。二、參數(shù)計(jì)算設(shè)計(jì)時(shí)鐘時(shí),應(yīng)能做到分秒的60進(jìn)1,時(shí)的24進(jìn)1 ,年以兩位數(shù)表示滿100進(jìn)1 ,月滿12進(jìn)1;關(guān)于天的計(jì)數(shù)較為復(fù)雜:先根據(jù)年月判斷該月的最大天數(shù),實(shí)現(xiàn)進(jìn)位。三、編程步驟1、編寫時(shí)間顯示函數(shù),測(cè)試以確認(rèn)函數(shù)功能正常。2、設(shè)置初始值為04年2月28日。利用定時(shí)器A控制秒信號(hào)的自加,并用LCD顯示判斷算法是否正確。3、已經(jīng)得到正確的秒信號(hào),根據(jù)算法實(shí)現(xiàn)時(shí)間的進(jìn)位。4、設(shè)計(jì)鍵

4、盤,使鍵盤能正確輸入,讀取鍵值。5、設(shè)計(jì)翻頁功能,實(shí)現(xiàn)時(shí)間和日期的切換。6、設(shè)計(jì)時(shí)間的修改功能,以串輸入修改數(shù)據(jù)的形式進(jìn)行修改。7、程序存檔,測(cè)試檢驗(yàn)基本功能。8、優(yōu)化程序算法,精簡變量與函數(shù)調(diào)用,實(shí)現(xiàn)超低功耗,測(cè)試檢驗(yàn),提交最后成果。四、實(shí)踐感受五、源程序 /實(shí)時(shí)時(shí)鐘+鍵盤控制(串輸入修改方式)#include <msp430x44x.h>#include <stdio.h>/定義液晶顯示筆畫#define a (0x01)#define b (0x02)#define c (0x10)#define d (0x08)#define e (0x40)#define f

5、 (0x20)#define g (0x04)/#define h (0x80)/顯示字符的指針 const unsigned char LCD_Tab = a+b+c+d+e+f ,/顯示 "0",LCD_Tab00 b+c ,/顯示 "1",LCD_Tab01 a+b+d+e+g ,/顯示 "2",LCD_Tab02 a+b+c+d+g ,/顯示 "3",LCD_Tab03 b+c+f+g ,/顯示 "4",LCD_Tab04 a+c+d+f+g ,/顯示 "5",LCD

6、_Tab05 a+c+d+e+f+g ,/顯示 "6",LCD_Tab06 a+b+c ,/顯示 "7",LCD_Tab07 a+b+c+d+e+f+g ,/顯示 "8",LCD_Tab08 a+b+c+d+f+g ,/顯示 "9",LCD_Tab09 a+b+c+e+f+g ,/顯示 "A",LCD_Tab0A c+d+e+f+g ,/顯示 "b",LCD_Tab0B a+d+e+f ,/顯示 "C",LCD_Tab0C b+c+d+e+g ,/顯示 &

7、quot;d",LCD_Tab0D a+d+e+f+g ,/顯示 "E",LCD_Tab0E a+e+f+g ,/顯示 "F",LCD_Tab0F 0 ,/顯示 " ",LCD_Tab10 ;/定義時(shí)鐘 2021 -02-28 23:59:53 unsigned short int year=04, mon=2,day=28,hour=23,min=59,sec=53; unsigned short int x,num,page=0; unsigned char p3; double dx; unsigned int set

8、=0,p=0; /p表示當(dāng)前修改哪個(gè)位 unsigned int key=0,temp=10; long int div_val=1,div=1,data=0,dat=0; void mInitSTDIO()/ 系統(tǒng)初始化 unsigned char i; / 主時(shí)鐘初始化 WDTCTL = WDTPW + WDTHOLD;/ stop watchdog timer FLL_CTL0 |= XCAP14PF;/ Configure load caps / 定時(shí)器A初始化 TACTL = TASSEL0 + TACLR;/ ACLK, clear TAR TACCTL0 = CCIE;/ CCR

9、0 interrupt enabled TACCR0 = 32768;/ 定時(shí)器常數(shù)(1秒) TACTL |= MC0;/ Start Timer_a in upmode / 定時(shí)器B初始化 TBCTL = TASSEL0 + TACLR;/ ACLK, clear TAR TBCCTL0 = CCIE;/ CCR0 interrupt enabled TBCCR0 = 328;/ 定時(shí)器常數(shù)(1/100秒) TBCTL |= MC0; / P口初始化 P1DIR = 0;/ 設(shè)置P1.0P1.7為輸入方式 P1IFG = 0;/ 清除P1的中斷標(biāo)志 P1IE = 0xFF;/ 設(shè)置 P1.0

10、P1.7 中斷 P1IES = 0xFF;/ 設(shè)置 P1.0P1.7 下降沿中斷 P2DIR |= 0xCF;/ 設(shè)置P2.0P2.3,P2.6,P2.7為輸出方式 P3DIR = 0xFF;/ 設(shè)置P3.0P3.7為輸出方式 P4DIR |= 0xFC;/ 設(shè)置P4.2P4.7為輸出方式 P5SEL = 0xFF;/ P5用于LCD顯示 P6SEL = 1;/ P6.0用于ADC P3DIR |= 0xFE;/ 設(shè)置P6.1P6.7為輸出方式(臨時(shí)) / 初始化 LCD LCDCTL = LCDON + LCD4MUX + LCDP0;/ 4-Mux LCD, segments S0-S15

11、 BTCTL = BTFRFQ1; for(i = 0; i < 8; i+) LCDMEMi = 0;/ 清除顯示 /=主程序=void main(void) char x=0; mInitSTDIO();/ 系統(tǒng)初始化 _EINT();/ 開啟中斷 for(dx = 0;dx < 1000;dx+); printf("Startn"); while(1) while(page%2=0&&set=0) /判斷條件為偶數(shù)頁,顯示時(shí)分秒 LCDMEM0 = LCD_Tabsec % 10; LCDMEM1 = LCD_Tabsec / 10; LC

12、DMEM2 = LCD_Tabmin % 10; LCDMEM3 = LCD_Tabmin / 10; LCDMEM4 = LCD_Tabhour % 10; LCDMEM5 = LCD_Tabhour / 10; / _BIS_SR(LPM3_bits);/ Enter LPM3 _BIS_SR(LPM0_bits);/ Enter LPM0 while(page%2=1&&set=0) /判斷條件為奇數(shù)頁,顯示年月日 LCDMEM0 = LCD_Tabday % 10; LCDMEM1 = LCD_Tabday / 10; LCDMEM2 = LCD_Tabmon % 10

13、; LCDMEM3 = LCD_Tabmon / 10; LCDMEM4 = LCD_Tabyear % 10; LCDMEM5 = LCD_Tabyear / 10; _BIS_SR(LPM3_bits);/ Enter LPM3 _BIS_SR(LPM0_bits);/ Enter LPM0 while(set=1) /set=1時(shí),設(shè)置模式 LCDMEM0 = LCD_Tabtemp; /最低位閃爍 for(dx = 0;dx < 1000;dx+); LCDMEM0 = LCD_Tab16; /空白,不顯示 for(dx = 0;dx < 2021 ;dx+); /-字符串

14、輸入- while(key<0x0a) /按鍵為09,可進(jìn)行修改 data=data*10+key; dat=data; x=p; do LCDMEMx- = LCD_Tabdat / div; dat %= div; div /= 10; while(div); div_val=div_val*10; div=div_val; p+; p %=6; temp=key; key=0x0a; /data為輸入的6位數(shù), start 鍵確認(rèn)修改 / 設(shè)置模式 end / 修改建議:嘗試按位修改時(shí)間 /while(1) /=main結(jié)束=/ -Timer A0 中斷服務(wù)程序-#pragma v

15、ector=TIMERA0_VECTOR _interrupt void Timer_A0(void) p3 <<= 1; if(p3 = 0) p3 = 1; P3OUT = p3; / LED流水燈 switch(mon) /判斷每個(gè)月的天數(shù),保存為num case 1: num=31;break; case 2: if(year%4=0)num=29; else num=28;break; case 3:num=31;break; case 4:num=30;break; case 5:num=31;break; case 6:num=30;break; case 7:num

16、=31;break; case 8:num=31;break; case 9:num=30;break; case 10:num=31;break; case 11:num=30;break; case 12:num=31;break; if(sec>=59) /實(shí)現(xiàn)時(shí)間的進(jìn)位 sec=0; if(min>=59) min=0; if(hour>=23) hour=0; if(day>=num) day=1; if(mon>=112) mon=1;year+;year%=100; else mon+; else day+; else hour+; else min

17、+; else sec+; / _BIC_SR_IRQ(LPM3_bits);/ Clear LPM3 bits from 0(SR) _BIC_SR_IRQ(LPM0_bits);/ Clear LPM0, SET BREAKPOINT HERE/修改建議:判斷部分移入main函數(shù)/ Timer B0 中斷服務(wù)程序#pragma vector=TIMERB0_VECTOR _interrupt void Timer_B0(void) x <<= 1;/ 鍵盤掃描 if(x & 0x07) = 0) x = 1; P2OUT = (x) & 0x07;/ _BIC_

18、SR_IRQ(LPM3_bits);/ Clear LPM3 bits from 0(SR) _BIC_SR_IRQ(LPM0_bits);/ Clear LPM0, SET BREAKPOINT HERE/ P1 中斷服務(wù)程序 #pragma vector=PORT1_VECTOR _interrupt void P1INT(void) register int scan=0,pressed;/寄存器變量存儲(chǔ)按鍵中間值 do scan = P2IN; scan &= 0x0007; scan <<= 8; scan |= P1IFG; /掃描得到scan for(dx =

19、 0;dx < 800;dx+); /延時(shí)數(shù)值自己調(diào)整 pressed = P2IN; pressed &= 0x0007; pressed <<= 8; pressed |= P1IFG; /延時(shí)后得到pressed while(scan!=pressed) ; /可以確定鍵值,下一步操作 switch(scan) case 0x0101: key = 0; break;/ "0"鍵鍵值 case 0x0102: key = 1; break;/ "1"鍵鍵值 case 0x0104: key = 2; break;/ &qu

20、ot;2"鍵鍵值 case 0x0108: key = 3; break;/ "3"鍵鍵值 case 0x0110: key = 4; break;/ "4"鍵鍵值 case 0x0120: key = 5; break;/ "5"鍵鍵值 case 0x0140: key = 6; break;/ "6"鍵鍵值 case 0x0180: key = 7; break;/ "7"鍵鍵值 case 0x0201: key = 8; break;/ "8"鍵鍵值 case

21、 0x0202: key = 9; break;/ "9"鍵鍵值 case 0x0204: key = 0x0a; break;/ "A"鍵鍵值 case 0x0208: key = 0x0b; break;/ "B"鍵鍵值 case 0x0210: key = 0x0c; break;/ "C"鍵鍵值 case 0x0220: key = 0x0d; break;/ "D"鍵鍵值 case 0x0240: key = 0x0e; break;/ "E"鍵鍵值 case 0x

22、0280: key = 0x0f; break;/ "F"鍵鍵值 case 0x0401: key = 0x10; page+; break;/ "UP"鍵鍵值 case 0x0402: key = 0x11; page+; break;/ "DN"鍵鍵值 case 0x0404: key = 0x12; p+;break; / "L"鍵鍵值 case 0x0408: key = 0x13; p-;break; / "R"鍵鍵值 case 0x0410: key = 0x14; / "

23、STRAT"鍵鍵值 if(page%2=0) hour=data/10000; min=(data%10000)/100; sec=data%100; if(page%2=1) year=data/10000; mon=(data%10000)/100; day=data%100; set=0; /start確認(rèn)修改 LCDMEM6 = LCD_Tab16; break; case 0x0420: key = 0x15; / "STOP"鍵鍵值 set=0; / 按stop取消修改 LCDMEM6 = LCD_Tab16; break; case 0x0440:

24、key = 0x16; / "ESC"鍵鍵值 set=1;p=0;data=0;dat=0;div=0;div_val=0; /記得初始化 LCDMEM6 = LCD_Tab14; /首位顯示E表示進(jìn)入手動(dòng)設(shè)置 LCDMEMp = LCD_Tab10; /修改處顯示A break; case 0x0480: key = 0x17; break; / "ENTER"鍵鍵值 default: LCDMEM6 = 0; break; / 其它情況 P1IFG = 0; _BIC_SR_IRQ(LPM0_bits); / Clear LPM3 bits from 0(SR) 公司印章管理制度一、目的 公司印章是公司對(duì)內(nèi)對(duì)外行使權(quán)力的標(biāo)志,也是公司名稱的法律體現(xiàn), 因此,必須對(duì)印章進(jìn)行規(guī)范化、合理化的嚴(yán)格管理,以保證公司各項(xiàng)業(yè)務(wù)的正常運(yùn)作,由公司指定專人負(fù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論