教训:
1.程序的模块化设计很重要。每次写程序,最好遵循如下规矩: >>关看门狗;WDTCTL=WDTPW+WDTHOLD;
>>开晶振:都把ACLK= XT1(32k),MCLK=SMCLK=XT2(8M);并且能用8M最好用8M,这样比较准确。
晶振的检测方法:XT2可以通过程序中的扫描标志位实现。或者设置P1.4(SMCLK),P2.0(ACLK),然后用示波器检查 >>主程序:使用自己写的模板。
2.如果在一个问题上卡住了,就不断细化深入下去,直到触到其本质,就看你能把这个问题细化到什么程度!
3.任何数字或信息都有他隐含的本质信息,都能直接或间接反映其本质。就看你能否抓住这个数字,想到他对本质的反映。
/********************************************************************* 程序名:MSP430框架程序
描 述:适用于MSP430F149,其他型号需要适当修改 规 范:变量小写,常量大写,函数名第一个字母大写
*********************************************************************/ //header file
#include int main(void){ WDTCTL = WDTPW +WDTHOLD; //Stop WDT Init_Sys(); //初始化 start: //用户程序 LPMn; //_BIS_SR(LPM3_bits + GIE); //进入低功耗模式n(n:0~4),不需要可以屏蔽 goto start; } /******************************************************************* 程序功能:系统初始化 ********************************************************************/ void Init_Sys(){ //将MCLK时钟从DCO切换到高频晶体振荡器 BCSCTL1 &= ~XT2OFF; //XT2=HF XTAL do{ unsigned char i; IFG1 |= ~OFIFG; //Clear OSCFault flag for(i=0xff;i>0;i--); //Time for flag to set } while((IFG1 & OFIFG)); //OSCFault flag still set? BCSCTL2 |= SELM_2 + SELS; //MCLK=SMCLK=XT2(safe) //一下初始化各种模块、中断、外围设备 __EINT(); //OPEN GIE 不需要可以屏蔽 } /******************************************************************* 函数名称:端口Px(x:1 or 2)中断函数 *******************************************************************/ #pragma vector=PORT2_VECTOR __interrupt void Port2(){ //参考处理程序,不用的端口应当删除其对于中断源的判断 if((PxIFG & BIT0) == BIT0){ //处理Px.0中断 P2IFG &= ~BIT0; //清除中断标志 //User's program } else if((PxIFG & BIT1) == BIT1){ //处理Px.1中断 P2IFG &= ~BIT1; //清除中断标志 //User's program } else if((PxIFG & BIT3) == BIT3){ //处理Px.3中断 P2IFG &= ~BIT3; //清除中断标志 //User's program } else if((PxIFG & BIT4) == BIT4){ //处理Px.4中断 P2IFG &= ~BIT4; //清除中断标志 //User's program } else if((PxIFG & BIT5) == BIT5){ //处理Px.5中断 P2IFG &= ~BIT5; //清除中断标志 //User's program } else if((PxIFG & BIT6) == BIT6){ //处理Px.6中断 P2IFG &= ~BIT6; //清除中断标志 //User's program } else { //处理Px.7中断 P2IFG &= ~BIT7; //清除中断标志 //User's program } LPMn_EXIT; //退出中断后退出低功耗模式,若仍需保留在低功耗模式可屏蔽此句 } /****************************************************************** 函数名称:定时器A中断函数 多源中断:CC1~2 TA ******************************************************************/ #pragma vector=TIMERA1_VECTOR __inerrupt void TimerA1(){ //以下为参考程序,不用的中断源应当屏蔽 switch(_event_in_range(TAIV,10)){ case 2: //捕获比较1中断 //User's progam break; case 4: //捕获比较2中断 //User's progam break; case 10: //TAIFG定时器溢出中断 //User's progam break; } LPMn_EXIT; //退出中断后退出低功耗模式,若有需要可屏蔽 } /****************************************************************** 函数名称:定时器A中断函数 单源中断:CC0 ******************************************************************/ #pragma vector=TIMER0_VECTOR __interrupt void TimerA0(){ //User's progam LPM3_EXIT; //退出中断退出低功耗模式,若有需要可以屏蔽 } /***************************************************************** 函数名称:AD转换中断函数 多源中断:模拟0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2 没有处理ADC12TOV和ADC12OV中断标志 *****************************************************************/ #pragma vector=ADC_VECTOR __interrupt void Adc(){ //以下参考程序,不使用的中断源应当删除 if((ADC12IFG & BIT0) == BIT0){ //通道0 //User's program } else if((ADC12IFG & BIT1) == BIT1){ //通道1 //User's program } else if((ADC12IFG & BIT2) == BIT1){ //通道2 //User's program } else if((ADC12IFG & BIT3) == BIT1){ //通道3 //User's program } else if((ADC12IFG & BIT4) == BIT1){ //通道4 //User's program } else if((ADC12IFG & BIT5) == BIT1){ //通道5 //User's program } else if((ADC12IFG & BIT6) == BIT1){ //通道6 //User's program } else if((ADC12IFG & BIT7) == BIT1){ //通道7 //User's program } else if((ADC12IFG & BIT8) == BIT1){ //VeREF+ //User's program } else if((ADC12IFG & BIT9) == BIT1){ //VREF-/VeREF- //User's program } else if((ADC12IFG & BITA) == BIT1){ //温度 //User's program } else if((ADC12IFG & BITB) == BIT1){ //(AVcc-AVss)/2 //User's program } LPM3_EXIT; //退出中断退出低功耗,若有需要可屏蔽此句 } /*************************************************************** 函数名称:USART0发送中断函数 ***************************************************************/ #pragma vector=USART0TX_VECTOR __interrupt void Usart0Tx(){ //User's progam LPM3_EXIT; //可屏蔽 } /*************************************************************** 函数名称:USART0接收中断函数 ***************************************************************/ #pragma vector=USART0RX_VECTOR __interrupt void Usart0Rx(){ //User's progam LPM3_EXIT; //可屏蔽 } /*************************************************************** 函数名称:WDT定时器中断函数 ***************************************************************/ #pragma vector=WDT_VECTOR __inerrupt void WatchDog(){ //User's progam LPM3_EXIT; //可屏蔽 } /*************************************************************** 函数名称:比较器A中断函数 ***************************************************************/ #pragma vector=COMPARATORA_VECTOR __inerrupt void ComparaterA(){ //User's progam LPM3_EXIT; // 可屏蔽 } /*************************************************************** 函数名称:定时器B中断函数 多源中断:CC1~6 TB ***************************************************************/ #pragma vector=TIMERB1_VECTOR __inerrupt void TimerB1(){ //以下为参考程序,不使用的中断源应当删除 switch(_event_in_range(TBIV,14)){ case 2: //捕获/比较1中断 //User's progam break; case 4: //捕获/比较2中断 //User's progam break; case 6: //捕获/比较3中断 //User's progam break; case 8: //捕获/比较4中断 //User's progam break; case 10: //捕获/比较5中断 //User's progam break; case 12: //捕获/比较6中断 //User's progam break; case 14: //TBIFG定时器溢出中断 //User's progam break; } LPM3_EXIT; //可屏蔽 } /*************************************************************** 函数名称:定时器B中断函数 单源中断:CC0 ***************************************************************/ #pragma vector=TIMERB0_VECTOR __interrupt void TimerB0(){ //User's progam LPM3_EXIT; //可屏蔽 } /*************************************************************** 函数名称:不可屏蔽中断函数 ***************************************************************/ #pragma vector=NMI_VECTOR __inerrupt void Nmi(){ //以下为参考程序,不使用的中断应当删除 if((IFG1 & OFIFG) == OFIFG){ //振荡器失效 IFG1 &= ~OFIFG; //User's progam } else if((IFG1 & NMIIFG) == NMIIFG){ //RST/NMI不可屏蔽中断 IFG1 &= ~NMIIFG; //User's progam } else //if((FCTL3 & ACCVIFG) == ACCVIFG){ //存储器非法访问 FCTL3 &= ~ACCVIFG; //User's progam } LPM3_EXIT; //可屏蔽 } /*************************************************************** 函数名称:基本定时器中断函数 ***************************************************************/ #pragma vector=BASICTIMER_VECTOR __interrupt void BasTimer(){ //User's progam LPM3_EXIT; //可屏蔽 } //将WDT设置在定时器模式 WDTCTL = WDT_ADLY_1_9; //内部看门狗1.9ms中断一次 IE1 |= WDTIE; //使能看门狗中断 //4按键 if(keyin != 0x0f) //如果有键被按下 { delay(); //延时消抖 if(keyin != 0x0f) //再次检测按键状态 { temp=keyin; // while(keyin != 0x0f); //等待按键被放开 switch(temp) //转换键值 { case 0x0e: keyval = 1;break; case 0x0d: keyval = 2;break; case 0x0b: keyval = 3;break; case 0x07: keyval = 4;break; default: keyval = 0;break; } P4OUT = scandata[keyval]; //用一位数码管显示 duan_h; duan_l; P4OUT = 0x11; wei_h; wei_l; P2OUT &= ~BIT4; //P3.4连接的LED闪烁一下 delay();delay(); P2OUT |= BIT4; } } //4*4矩阵键盘 线反转法 void Check_Key(void) { uchar row ,col,tmp1,tmp2; tmp1 = 0x80; for(row = 0;row < 4;row++) //行扫描 { P1OUT = 0xf0; //P1.4~P1.7输出全1 P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0 tmp1 >>=1; if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0,P1.0~3接3.3V { tmp2 = 0x01; // tmp2用于检测出那一位为0 for(col = 0;col < 4;col++) // 列检测 { if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是 { key_val = key_Map[row * 4 + col]; // 获取键值 return; // 退出循环 } tmp2 <<= 1; // tmp2右移1位 } } } } //扫描法 /******************************************************************** * 名称 : Keyscan() * 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。 * 输入 : 无 * 输出 : 按键值 ***********************************************************************/ uchar Keyscan(void){ uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7}; for(j=0; j<4; j++){ P1 = Buffer[j]; temp = 0x10; for(i=0; i<4; i++){ if(!(P1 & temp)) { return (i+j*4); } temp <<= 1; } } } //5ms延时函数 /******************************************* 函数名称:delay5ms 功 能:延时约5ms 参 数:无 返回值 :无 ********************************************/ void delay5ms(void) { uint i=40000; while (i != 0) { i--; } }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务