您好,欢迎来到九壹网。
搜索
您的当前位置:首页MSP430框架程序

MSP430框架程序

来源:九壹网
《 MSP430框架程序 》 2012.7.19 XXX 整理

教训:

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 //函数声明 void Init_Sys();

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务