MSP430框架程序.docx
- 文档编号:17644861
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:17
- 大小:17.86KB
MSP430框架程序.docx
《MSP430框架程序.docx》由会员分享,可在线阅读,更多相关《MSP430框架程序.docx(17页珍藏版)》请在冰豆网上搜索。
MSP430框架程序
《MSP430框架程序》
2012.7.19XXX整理
教训:
1.程序的模块化设计很重要。
每次写程序,最好遵循如下规矩:
>>关看门狗;WDTCTL=WDTPW+WDTHOLD;
>>开晶振:
都把ACLK=XT1(32k),MCLK=SMCLK=XT2(8M);并且能用8M最好用8M,这样比较准确。
晶振的检测方法:
XT2可以通过程序中的扫描标志位实现。
或者设置P1.4(SMCLK),P2.0(ACLK),然后用示波器检查
>>主程序:
使用自己写的模板。
2.如果在一个问题上卡住了,就不断细化深入下去,直到触到其本质,就看你能把这个问题细化到什么程度!
3.任何数字或信息都有他隐含的本质信息,都能直接或间接反映其本质。
就看你能否抓住这个数字,想到他对本质的反映。
/*********************************************************************
程序名:
MSP430框架程序
描述:
适用于MSP430F149,其他型号需要适当修改
规范:
变量小写,常量大写,函数名第一个字母大写
*********************************************************************/
//headerfile
#include
//函数声明
voidInit_Sys();
intmain(void){
WDTCTL=WDTPW+WDTHOLD;//StopWDT
Init_Sys();//初始化
start:
//用户程序
LPMn;
//_BIS_SR(LPM3_bits+GIE);//进入低功耗模式n(n:
0~4),不需要可以屏蔽
gotostart;
}
/*******************************************************************
程序功能:
系统初始化
********************************************************************/
voidInit_Sys(){
//将MCLK时钟从DCO切换到高频晶体振荡器
BCSCTL1&=~XT2OFF;//XT2=HFXTAL
do{
unsignedchari;
IFG1|=~OFIFG;//ClearOSCFaultflag
for(i=0xff;i>0;i--);//Timeforflagtoset
}
while((IFG1&OFIFG));//OSCFaultflagstillset?
BCSCTL2|=SELM_2+SELS;//MCLK=SMCLK=XT2(safe)
//一下初始化各种模块、中断、外围设备
__EINT();//OPENGIE不需要可以屏蔽
}
/*******************************************************************
函数名称:
端口Px(x:
1or2)中断函数
*******************************************************************/
#pragmavector=PORT2_VECTOR
__interruptvoidPort2(){
//参考处理程序,不用的端口应当删除其对于中断源的判断
if((PxIFG&BIT0)==BIT0){
//处理Px.0中断
P2IFG&=~BIT0;//清除中断标志
//User'sprogram
}
elseif((PxIFG&BIT1)==BIT1){
//处理Px.1中断
P2IFG&=~BIT1;//清除中断标志
//User'sprogram
}
elseif((PxIFG&BIT3)==BIT3){
//处理Px.3中断
P2IFG&=~BIT3;//清除中断标志
//User'sprogram
}
elseif((PxIFG&BIT4)==BIT4){
//处理Px.4中断
P2IFG&=~BIT4;//清除中断标志
//User'sprogram
}
elseif((PxIFG&BIT5)==BIT5){
//处理Px.5中断
P2IFG&=~BIT5;//清除中断标志
//User'sprogram
}
elseif((PxIFG&BIT6)==BIT6){
//处理Px.6中断
P2IFG&=~BIT6;//清除中断标志
//User'sprogram
}
else{
//处理Px.7中断
P2IFG&=~BIT7;//清除中断标志
//User'sprogram
}
LPMn_EXIT;//退出中断后退出低功耗模式,若仍需保留在低功耗模式可屏蔽此句
}
/******************************************************************
函数名称:
定时器A中断函数
多源中断:
CC1~2TA
******************************************************************/
#pragmavector=TIMERA1_VECTOR
__inerruptvoidTimerA1(){
//以下为参考程序,不用的中断源应当屏蔽
switch(_event_in_range(TAIV,10)){
case2:
//捕获比较1中断
//User'sprogam
break;
case4:
//捕获比较2中断
//User'sprogam
break;
case10:
//TAIFG定时器溢出中断
//User'sprogam
break;
}
LPMn_EXIT;//退出中断后退出低功耗模式,若有需要可屏蔽
}
/******************************************************************
函数名称:
定时器A中断函数
单源中断:
CC0
******************************************************************/
#pragmavector=TIMER0_VECTOR
__interruptvoidTimerA0(){
//User'sprogam
LPM3_EXIT;//退出中断退出低功耗模式,若有需要可以屏蔽
}
/*****************************************************************
函数名称:
AD转换中断函数
多源中断:
模拟0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2
没有处理ADC12TOV和ADC12OV中断标志
*****************************************************************/
#pragmavector=ADC_VECTOR
__interruptvoidAdc(){
//以下参考程序,不使用的中断源应当删除
if((ADC12IFG&BIT0)==BIT0){
//通道0
//User'sprogram
}
elseif((ADC12IFG&BIT1)==BIT1){
//通道1
//User'sprogram
}
elseif((ADC12IFG&BIT2)==BIT1){
//通道2
//User'sprogram
}
elseif((ADC12IFG&BIT3)==BIT1){
//通道3
//User'sprogram
}
elseif((ADC12IFG&BIT4)==BIT1){
//通道4
//User'sprogram
}
elseif((ADC12IFG&BIT5)==BIT1){
//通道5
//User'sprogram
}
elseif((ADC12IFG&BIT6)==BIT1){
//通道6
//User'sprogram
}
elseif((ADC12IFG&BIT7)==BIT1){
//通道7
//User'sprogram
}
elseif((ADC12IFG&BIT8)==BIT1){
//VeREF+
//User'sprogram
}
elseif((ADC12IFG&BIT9)==BIT1){
//VREF-/VeREF-
//User'sprogram
}
elseif((ADC12IFG&BITA)==BIT1){
//温度
//User'sprogram
}
elseif((ADC12IFG&BITB)==BIT1){
//(AVcc-AVss)/2
//User'sprogram
}
LPM3_EXIT;//退出中断退出低功耗,若有需要可屏蔽此句
}
/***************************************************************
函数名称:
USART0发送中断函数
***************************************************************/
#pragmavector=USART0TX_VECTOR
__interruptvoidUsart0Tx(){
//User'sprogam
LPM3_EXIT;//可屏蔽
}
/***************************************************************
函数名称:
USART0接收中断函数
***************************************************************/
#pragmavector=USART0RX_VECTOR
__interruptvoidUsart0Rx(){
//User'sprogam
LPM3_EXIT;//可屏蔽
}
/***************************************************************
函数名称:
WDT定时器中断函数
***************************************************************/
#pragmavector=WDT_VECTOR
__inerruptvoidWatchDog(){
//User'sprogam
LPM3_EXIT;//可屏蔽
}
/***************************************************************
函数名称:
比较器A中断函数
***************************************************************/
#pragmavector=COMPARATORA_VECTOR
__inerruptvoidComparaterA(){
//User'sprogam
LPM3_EXIT;//可屏蔽
}
/***************************************************************
函数名称:
定时器B中断函数
多源中断:
CC1~6TB
***************************************************************/
#pragmavector=TIMERB1_VECTOR
__inerruptvoidTimerB1(){
//以下为参考程序,不使用的中断源应当删除
switch(_event_in_range(TBIV,14)){
case2:
//捕获/比较1中断
//User'sprogam
break;
case4:
//捕获/比较2中断
//User'sprogam
break;
case6:
//捕获/比较3中断
//User'sprogam
break;
case8:
//捕获/比较4中断
//User'sprogam
break;
case10:
//捕获/比较5中断
//User'sprogam
break;
case12:
//捕获/比较6中断
//User'sprogam
break;
case14:
//TBIFG定时器溢出中断
//User'sprogam
break;
}
LPM3_EXIT;//可屏蔽
}
/***************************************************************
函数名称:
定时器B中断函数
单源中断:
CC0
***************************************************************/
#pragmavector=TIMERB0_VECTOR
__interruptvoidTimerB0(){
//User'sprogam
LPM3_EXIT;//可屏蔽
}
/***************************************************************
函数名称:
不可屏蔽中断函数
***************************************************************/
#pragmavector=NMI_VECTOR
__inerruptvoidNmi(){
//以下为参考程序,不使用的中断应当删除
if((IFG1&OFIFG)==OFIFG){
//振荡器失效
IFG1&=~OFIFG;
//User'sprogam
}
elseif((IFG1&NMIIFG)==NMIIFG){
//RST/NMI不可屏蔽中断
IFG1&=~NMIIFG;
//User'sprogam
}
else//if((FCTL3&ACCVIFG)==ACCVIFG){
//存储器非法访问
FCTL3&=~ACCVIFG;
//User'sprogam
}
LPM3_EXIT;//可屏蔽
}
/***************************************************************
函数名称:
基本定时器中断函数
***************************************************************/
#pragmavector=BASICTIMER_VECTOR
__interruptvoidBasTimer(){
//User'sprogam
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)//转换键值
{
case0x0e:
keyval=1;break;
case0x0d:
keyval=2;break;
case0x0b:
keyval=3;break;
case0x07:
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矩阵键盘
线反转法
voidCheck_Key(void)
{
ucharrow,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()
*功能:
实现按键的读取。
下面这个子程序是按处理矩阵键盘的基本方法处理的。
*输入:
无
*输出:
按键值
***********************************************************************/
ucharKeyscan(void){
uchari,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
参数:
无
返回值:
无
********************************************/
voiddelay5ms(void)
{
uinti=40000;
while(i!
=0)
{
i--;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSP430 框架 程序