我這是用STC做的,應(yīng)該很容易移植到MPS430上的給你參考一下。 #include #include #define uchar unsigned char #define uint unsigned int sbit scl=P1^3; sbit sda=P1^4; sbit key1=P1^6; sbit key2=P1^7; sbit key3=P2^0; sbit key4=P2^1; sbit lcrs=P3^7;//數(shù)據(jù)/命令 sbit lcwr=P3^5;//讀/寫 sbit lcden=P3^4;//使能 sbit DS=P2^2; /*sbit lcrs=P3^4;//數(shù)據(jù)/命令 sbit lcwr=P3^7;//讀/寫 sbit lcden=P3^5;//使能 */ sbit jrk=P2^2; sbit cyk=P2^3; sbit xhk=P2^4; bit flag=0,rsg=0,not=0,he=0,in=0; int acon=0,bcon=0,dcon=0,econ=0, temp=0,y=0,j=0,l=0,cfj=0,ec=0,dc=0,at; uchar code table[]={48,49,50,51,52,53,54,55,56,57}; uchar code ta1[]={"Temperature UP"}; uchar code ta2[]={"Temperature DN"}; uchar code ta3[]={"Inflator Cycle"}; uchar code ta4[]={"Inflator Time "}; uchar code ta5[]={" Heating UP "}; uchar code ta6[]={" Inflator "}; uchar code table7[]={"Temperature"}; uchar table1[]={0,0,0,'.',0}; uchar table3[]={"AptitudeAquarium"}; uchar table4[]={0,0,0,0,0}; uchar n,c=0; void delay(uchar); void wen_kong(); void xh(); void rso(); void weno(); void Init_Com(void)
微控論壇原創(chuàng)主貼 作者:bobo 微控論壇特約因DC的邀請(qǐng)寫一個(gè)有關(guān)中斷的東東,我也接觸430不久只能以自己的心得體會(huì)更大家分享,若有紕漏懇請(qǐng)見(jiàn)諒。MSP430用戶手冊(cè)上有的中斷介紹我就不贅述了,大家可以看User Guider.我講的主要是書上沒(méi)有的,或者是點(diǎn)的不透的。希望對(duì)大家有用。1.中斷嵌套,優(yōu)先級(jí)430總中斷的控制位是狀態(tài)寄存器內(nèi)的GIE位(該位在SR寄存器內(nèi)),該位在復(fù)位狀態(tài)下,所有的可屏蔽中斷都不會(huì)發(fā)生響應(yīng)??善帘沃袛嘤址譃閱沃袛嘣春投嘀袛嘣吹?。單中斷源的一般響應(yīng)了中斷服務(wù)程序中斷標(biāo)志位就自動(dòng)清零,而多中斷源的則要求查詢某個(gè)寄存器后中斷標(biāo)志位才會(huì)清零。由于大多數(shù)人接觸的第一款單片機(jī)通常是51,51單片機(jī)CPU在響應(yīng)低優(yōu)先級(jí)的中斷程序過(guò)程中若有更高優(yōu)先級(jí)的中斷發(fā)生,單片機(jī)就會(huì)去執(zhí)行高優(yōu)先級(jí),這個(gè)過(guò)程已經(jīng)產(chǎn)生了中斷嵌套。而430單片機(jī)則不同,如果在響應(yīng)低優(yōu)先級(jí)中斷服務(wù)程序的時(shí)候,即使來(lái)了更高優(yōu)先級(jí)的中斷服務(wù)請(qǐng)求,430也會(huì)置之不理,直至低優(yōu)先級(jí)中斷服務(wù)程序執(zhí)行完畢,才會(huì)去響應(yīng)高優(yōu)先級(jí)中斷。這是因?yàn)?30在響應(yīng)中斷程序的時(shí)候,總中斷GIE是復(fù)位狀態(tài)的,如果要產(chǎn)生類似51的中斷嵌套,只能在中斷函數(shù)內(nèi)再次置位GIE位。2.定時(shí)器TATimerA有2個(gè)中斷向量。TIMERA0,TIMERA1TIMERA0只針對(duì)CCR0的計(jì)數(shù)溢出TIMERA1再查詢TAIV后可知道是CCR1,還是CCR2,亦或TAIFG引起的,至于TAIFG是什么情況下置位的,則要看TA工作的模式具體看用戶手冊(cè)。還有一點(diǎn)TA本身有PWM輸出功能,無(wú)須借用中斷功能。在這個(gè)問(wèn)題上經(jīng)常出現(xiàn)應(yīng)用彎路的是如何結(jié)合TA和AD實(shí)行定時(shí)采樣的問(wèn)題,很多人都是在TA中斷里打開AD這樣來(lái)做。這是不適宜的,因?yàn)?30 的ADC10,ADC12(SD16不熟悉,沒(méi)發(fā)言權(quán))模塊均有脈沖采樣模式和擴(kuò)展采樣模式。只要選擇AD是由TA觸發(fā)采樣,然后把TA設(shè)置成PWM輸出模式,當(dāng)然輸出PWM波的都是特殊功能腳,但是在這里它是不需要輸出的,所以引腳設(shè)置不必理會(huì)。值得關(guān)心的就是PWM的頻率,也就是你AD的采樣率。3.看門狗復(fù)位看門狗有2種工作模式:定時(shí)器 ,看門狗定時(shí)器工作模式下WDTIFG在響應(yīng)中斷服務(wù)程序有標(biāo)志位自動(dòng)復(fù)位,而在看門狗模式下,該標(biāo)志位只能軟件清零。但是怎么判斷復(fù)位是由于WDT工作在看門狗模式下的定時(shí)溢出引起的,還是看門狗寫密鑰錯(cuò)誤引起的呢?………………………………答案是沒(méi)有方法,至少我沒(méi)見(jiàn)過(guò)有什么方法,也沒(méi)見(jiàn)過(guò)周邊的人有什么方法。若有人知道方法謝謝分享。4.經(jīng)常有人會(huì)問(wèn)這個(gè)語(yǔ)句的MOV.B #LPM0,0(SP)的作用。假如你在進(jìn)入中斷函數(shù)之前,430是在LPM0下待機(jī),若要求執(zhí)行完中斷函數(shù)之后進(jìn)入LPM3待機(jī),在中斷函數(shù)里寫MOV.B #LPM3,SR是無(wú)效的。因?yàn)樵谶M(jìn)入中斷時(shí)430會(huì)把PC,SR壓棧,( SR內(nèi)保存著低功耗模式的設(shè)置)即使你寫了MOV.B #LPM3,SR,在退出中斷出棧時(shí)SR會(huì)被重新設(shè)置成低功耗0,要達(dá)到這樣的目的,只能更改堆棧內(nèi)SR的設(shè)置:MOV.B #LPM0,0(SP)。5中斷向量:430的中斷向量是FFE0H—FFFFH,一共32個(gè)字節(jié)也就是FLASH的最后一段,430的FLASH有大有小,但是最后地址肯定是FFFFH(大FLASH超過(guò)64K的除外)所以它們的起始地址是不一樣的,而一般IAR默認(rèn)編譯都是把程序放在FLASH開始的位置(不包括信息段)。有個(gè)值得弄清楚的問(wèn)題是:什么是中斷向量?中斷向量實(shí)際就是保存中斷函數(shù)入口地址的存儲(chǔ)單元空間。就像FFFEH+FFFFH這2個(gè)字節(jié)是復(fù)位中斷向量,那么它存儲(chǔ)的就是主函數(shù)在FLASH內(nèi)的起始地址,假如主函數(shù)保存在以0x1100為起始地址的FLASH塊內(nèi),那么你會(huì)發(fā)現(xiàn)FFFFH 內(nèi)保存的是0x11, FFFE內(nèi)保存的是0x00.其他什么TimerA,ADC12,所有的都一樣。只是你每次寫的程序長(zhǎng)短不一,中斷函數(shù)放的位置不一樣。IAR編譯器都會(huì)給你定好,然后在你用JTAG燒寫程序的時(shí)候,把這個(gè)地址,燒寫到相應(yīng)的中斷向量。因?yàn)橹袛嗪瘮?shù)所處地址可以由用戶自定義,也可以讓IAR自動(dòng)編譯,所以這個(gè)地址除了源代碼開發(fā)人員知道,其他人是不知道的,BSL就是應(yīng)用這32個(gè)字節(jié)的中斷向量?jī)?nèi)的內(nèi)容的特殊性設(shè)置的密碼。但是有幾個(gè)東西在430是不變的,就是觸發(fā)中斷的條件滿足后,它到哪個(gè)地方去尋址中斷服務(wù)函數(shù)的入口地址,是TI 在做430時(shí)就固化好,定死的。比方說(shuō)上電復(fù)位的時(shí)候,它知道去FFFE,FFFF單元找地址,而不去FFE0,FFE2找地址,這個(gè)映射關(guān)系是430固化不變的。可有的時(shí)候你就是需要改變“中斷向量”,這怎么辦?430FLASH程序自升級(jí)里有時(shí)就會(huì)碰到這個(gè)問(wèn)題,方法是在430原來(lái)默認(rèn)的中斷向量表內(nèi)做一個(gè)跳轉(zhuǎn)操作,同樣以上電復(fù)位為例:ORG 0x2345PowerReset: mov.w &0xFCFE,PC……………………………………………………ORG 0xFFFEDW PowerReset