关于msp430g2553编程问题

litterwatermelon 2014-08-02 05:08:38
是这样的,楼主是小白,需要写一个程序,按一下p1.3为一次中断,p1.0和p1.6为输出,要求按四下输出四种不同的状态,其中要用到状态机,下面是楼主自己写的程序,编译没有问题。但是不能输出结果,望哪位给解答一下该怎么写。。
#include "msp430g2553.h"
#define one 0
#define two 1
#define thr 2
#define fou 3
void GPIO_init();
void Key_SM();
void P13_Ondouble();
void P13_Onred();
void P13_Ongre();
void P13_OnFLASH();

int main(void) {
WDTCTL = WDTPW | WDTHOLD;
GPIO_init();
_enable_interrupts();
_bis_SR_register(LPM3_bits);
return 0;
}

void GPIO_init()
{
P1DIR|=BIT0+BIT6;
P1OUT|=BIT0;
P1OUT|=BIT6;
P1REN|=BIT3;
P1OUT|=BIT3;
P1DIR&=~BIT3;
P1IES|=BIT3;
P1IE|=BIT3;


}

#pragma vector=WDT_VECTOR
interrupt void WDT_ISR(void)
{
Key_SM();
}

void Key_SM()
{
static unsigned char State=0;
static unsigned char key_now=0;
unsigned char key_past=0;
unsigned char key_dect=0;
key_past=key_now;
if(P1IN&BIT3) key_now=1;
else key_now=0;
if((key_now==0)&&(key_past==1)) key_dect=1;
switch(State)
{
case one: if(key_dect==1) {State=two;P13_Ondouble();}break;

case two: if(key_dect==1) {State=thr;P13_Onred();}break;
case thr: if(key_dect==1) {State=fou;P13_Ongre();}break;
case fou: if(key_dect==1) {State=one;P13_OnFLASH();}break;
default:State=one;break;

}

}

void P13_Ondouble()
{
P1OUT^=BIT6;
}
void P13_Onred()
{
P1OUT=BIT0;
}
void P13_Ongre()
{
P1OUT^=BIT0;
P1OUT^=BIT6;
}
void P13_OnFLASH(unsigned int i)
{
while(1)
{
P1OUT^=BIT0;
P1OUT^=BIT6;
i=50000;
while(i--);
}
}



...全文
201 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
litterwatermelon 2014-08-03
  • 打赏
  • 举报
回复
引用 3 楼 wanght99 的回复:
你这个程序是在什么平台运行? 你的程序是只做一个初始化这样可以吗? 之前写过一点跑在单片机上的程序, main里是要有一个处理事件的循环保持执行的, 即使什么也不做, 也需要写一个死循环放在那里.纯外行意见 :) Key_SM逻辑没看出有问题
编译平台是用的TI的code composer stadion 5.3版本 我的这个程序是按照书上的例程编的。。。至于main函数中的那个,刚开接触单片机我也不怎么懂。。我把书上的例程发上 短按p1.3输出取反。长按p1.6输出取反。 #include "msp430g2553.h" #define IDLE 0 #define SHORT 1 #define LONG 2 #define COUNTER_THRESHOLD 50 unsigned char key_dect; unsigned char WDT_Counter=0; void GPIO_init(); void Key_SM(); void WDT_init(); unsigned char LongClick_Dect(); void P13_OnShortRelease(); void P13_OnLongClick(); int main(void) { WDTCTL = WDTPW | WDTHOLD; GPIO_init(); WDT_init(); _enable_interrupts(); _bis_SR_register(LPM3_bits); } void GPIO_init() { P1DIR|=BIT0+BIT6; P1OUT|=BIT0; P1OUT&=~BIT6; P1REN|=BIT3; P1OUT|=BIT3; //P1DIR&=~BIT3; //P1IES|=BIT3; //P1IE|=BIT3; } void WDT_init() { WDTCTL=WDT_ADLY_16; IE1|=WDTIE; } #pragma vector=WDT_VECTOR interrupt void WDT_ISR(void) { Key_SM(); } void Key_SM() { static unsigned char State=0; static unsigned char key_now=0; unsigned char key_past=0; unsigned char key_dect=0; key_past=key_now; if(P1IN&BIT3) key_now=1; else key_now=0; if((key_now==0)&&(key_past==1)) key_dect=1; if((key_now==1)&&(key_past==0)) key_dect=2; switch(State) { case IDLE: if(key_dect==1) {State=SHORT;P13_OnShortRelease();}break; case SHORT: if(key_dect==2) { State=IDLE; P13_OnShortRelease(); } if(LongClick_Dect()) { State=LONG; P13_OnLongClick(); } case LONG: WDT_Counter=0; if(key_dect==2) State=IDLE; default:State=IDLE;break; } } unsigned char LongClick_Dect() { WDT_Counter++; if(WDT_Counter==COUNTER_THRESHOLD) { WDT_Counter=0; return 1; } else return(0); } void P13_OnShortRelease() { P1OUT^=BIT0; } void P13_OnLongClick(unsigned int i) { P1OUT^=BIT6; } 这个程序逻辑应该没有问题,但是烧到单片机上只能检测到短按,不知道为什么?
wanght99 2014-08-02
  • 打赏
  • 举报
回复
你这个程序是在什么平台运行? 你的程序是只做一个初始化这样可以吗? 之前写过一点跑在单片机上的程序, main里是要有一个处理事件的循环保持执行的, 即使什么也不做, 也需要写一个死循环放在那里.纯外行意见 :) Key_SM逻辑没看出有问题
litterwatermelon 2014-08-02
  • 打赏
  • 举报
回复
引用 1 楼 u012061345 的回复:
这个main()函数是不是直接运行完毕就退出了?
不知道你的意思,我觉得应该是状态机Key_SM()的算法有逻辑错误吧,不懂。。。
罗博士 2014-08-02
  • 打赏
  • 举报
回复
这个main()函数是不是直接运行完毕就退出了?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧