3916|4

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】求助,程序上的问题 [复制链接]

/*目的是按下按键则蜂鸣器就发出声音,电路板是msp430F169的学习板*/
#include <msp430x16x.h>
#define NO_KEY 0 //没有案按键
#define KEY_K1 1 //按键1
#define KEY_K2 2 //按键2
#define KEY_K3 3 //按键3
#define STEP_IDEL 0 //按键延时
#define STEP_DELAY 1 //等待按键
#define STEP_FINISH 2 //按键过程结束
#define TRUE 1
unsigned int wDelay = 0;
unsigned char nKey = NO_KEY;
/*void init_BT(void)
{
BTCTL = 0x06;
IE2 |= 0x80;
}*/
unsigned char GetKey(void)
{
static unsigned char nStep = STEP_IDEL;
static unsigned char nBufferedKey;
switch(nStep)
{
case STEP_DELAY: //按键消抖
if(wDelay > 4)
{ wDelay = 0;
nStep = STEP_FINISH;
}
else
nBufferedKey = NO_KEY;
break;
case STEP_FINISH: //按键完成
if(((P1IN & 0x04) == 0 )&& (nBufferedKey == KEY_K1))
nKey = KEY_K1;
else if(((P1IN & 0x08) == 0)&& (nBufferedKey == KEY_K2))
nKey = KEY_K2;
else if(((P1IN &0x10) == 0) &&(nBufferedKey ==KEY_K3))
{ nKey = KEY_K3;
nStep = STEP_IDEL;
}
break;
case STEP_IDEL: //按键检测
if ((P1IN & 0x04) == 0)
{
nBufferedKey = KEY_K1;//当按P1.2时为低电平
wDelay = 0;
nStep = STEP_DELAY;
}
else if((P1IN &0x08) == 0)//当按P1.3时为低电平
{
nBufferedKey = KEY_K2;
wDelay = 0;
nStep = STEP_DELAY;
}
else if((P1IN & 0x10) == 0)//当按P1.4时为低电平
{
nBufferedKey = KEY_K3;
wDelay = 0;
nStep = STEP_DELAY;
}
break;
default:
break;
}
return nBufferedKey;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
TACTL = TASSEL1 + TACLR ;//时钟源SMCLK,清除TAR
// init_BT();
CCTL0 = CCIE;//CCR0中断使能
CCR0 = 50000;//产生3.2ms的定时
TACTL |= MC1;//Timer_a增计数模式
wDelay = 0;
_EINT();//使能系统中断
while (TRUE)
{
nKey = GetKey();
switch (nKey)
{
case NO_KEY:
break;
case KEY_K1://按P1.2时
P4DIR |= 0x0c;
P4OUT |= 0x04;
nKey= NO_KEY;
break;
case KEY_K2://按P1.3时
P4DIR |= 0x0c;
P4OUT |= 0x08;
nKey= NO_KEY;
break;
case KEY_K3://按P1.4时
nKey = NO_KEY;
break;
}
}
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A( void)
{
wDelay++;
CCR0 += 50000;
}
/*#pragma vector = BASICTIMER_VECTOR
__interrupt void BT_Interrrupt(void)
{
wDelay++;
CCR0 += 50000;
}*/
/*interrupt [TIMERA0_VECTOR]void Timer_a_interrupt(void)//Timer_a_0中断
{
wDelay++;
CCR0 += 50000;
}*/
这是自己弄一个小程序,怎么好像进不了中断啊,按键也没有什么响应,劳烦大虾们给看看啊~~~~

最新回复

引用: 本人愚见:因为nKey为全局变量,只要有不等于 NO_KEY,就会发音,而不再于是否是按下还是弹起,如果要实现你的想法,我认为要用到 捕捉功能,捕捉到下降沿时,输出交流电压,当捕捉到上升沿时,停止输出。 确实是nKey这有问题了,谢谢楼上的。 /*目的是按下按键则蜂鸣器就发出声音,电路板是msp430F169的学习板*/ #include <msp430x44x.h> #define NO_KEY 0 //没有按键 #define KEY_K1 1 //按键1 #define KEY_K2 2 //按键2 #define KEY_K3 3 //按键3 #define STEP_IDEL 0 //按键延时 #define STEP_DELAY 1 //等待按键 #define STEP_FINISH 2 //按键过程结束 #define TRUE 1 unsigned int wDelay = 0; unsigned char nKey = NO_KEY; unsigned char GetKey(void) { static unsigned char nStep = STEP_IDEL; static unsigned char nBufferedKey; static unsigned char nPressKey;/////////////////////////////////这个是后来修改完的 switch(nStep) { case STEP_IDEL: //按键检测 if ((P1IN & 0x04) == 0)//K3 { nBufferedKey = KEY_K1; // nKey = NO_KEY; //wDelay = 0; nStep = STEP_DELAY; } else if((P1IN & 0x08) == 0)//K2 { nBufferedKey = KEY_K2; // nKey = NO_KEY; //wDelay = 0; nStep = STEP_DELAY; } else if((P1IN & 0x10) == 0)//K1 { nBufferedKey = KEY_K3; //nKey = NO_KEY; //wDelay = 0; nStep = STEP_DELAY; } else { nBufferedKey = NO_KEY; } nPressKey = NO_KEY;///////////////////////// break; case STEP_DELAY: //按键消抖 if(wDelay > 4) { wDelay = 0; nStep = STEP_FINISH; } nPressKey = NO_KEY;////////////////////////////// break; case STEP_FINISH: //按键完成 if(((P1IN & 0x04) == 0 )&& (nBufferedKey == KEY_K1)) nBufferedKey = KEY_K1; else if(((P1IN & 0x08) == 0)&& (nBufferedKey == KEY_K2)) nBufferedKey = KEY_K2; else if(((P1IN &0x10) == 0) &&(nBufferedKey ==KEY_K3)) nBufferedKey = KEY_K3; else { nBufferedKey = NO_KEY; } nStep = STEP_IDEL; nPressKey = nBufferedKey;///////////////////////////// break; } return nPressKey;///////////////////////////////////////////////////////////////// } void main(void) { WDTCTL = WDTPW + WDTHOLD;//关闭看门狗 TACTL = TASSEL1 + TACLR ;//时钟源SMCLK,清除TAR CCTL0 = CCIE;//CCR0中断使能 CCR0 = 50;//产生3.2ms的定时 TACTL |= MC1;//Timer_a增计数模式 _EINT();//使能系统中断 while (TRUE) { nKey = GetKey(); switch (nKey) { case KEY_K1://S3 nKey= NO_KEY; P4DIR |= 0xff;//P4.2,P4.3输出 P4OUT ^= 0x08;//输出为p4.2高电平,p4.3低电平 break; case KEY_K2://S2 nKey= NO_KEY; P3DIR |= 0xff; P3OUT ^= 0x04; P4DIR |= 0xff;//P4.2,P4.3输出 P4OUT ^= 0x04;//输出为p4.3高电平,p4.2低电平 break; case KEY_K3://S1 nKey = NO_KEY; P4DIR |= 0xff; P4OUT |= 0x00; break; case NO_KEY: P4DIR |= 0xff; P4OUT |= 0x00; break; } } } /*#pragma vector = TIMERA0_VECTOR __interrupt void Timer_A( void) { wDelay++; CCR0 += 50000; }*/ interrupt [TIMERA0_VECTOR]void Timer_a_interrupt(void)//Timer_a_0中断 { wDelay++; CCR0 += 50; }  详情 回复 发表于 2006-4-4 09:44
 
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
由于硬件原因,如果想发出声音,中断程序如下写
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A( void)
{
wDelay++;
nKey = GetKey();
switch (nKey)
{
case NO_KEY:
break;
case KEY_K1:
P4DIR |= 0x0c;
P4OUT ^= 0x04;
nKey= NO_KEY;
break;
case KEY_K2:
P4DIR |= 0x0c;
P4OUT ^= 0x08;
nKey= NO_KEY;
break;
case KEY_K3:
nKey = NO_KEY;
break;
}
}
同时将主程序中重复的语句去掉。

我也是初学,还请老兄多多指教。
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
/*目的是按下按键则蜂鸣器就发出声音,电路板是msp430F169的学习板*/
#include <msp430x44x.h>
#define NO_KEY 0 //没有按键
#define KEY_K1 1 //按键1
#define KEY_K2 2 //按键2
#define KEY_K3 3 //按键3
#define STEP_IDEL 0 //按键延时
#define STEP_DELAY 1 //等待按键
#define STEP_FINISH 2 //按键过程结束
#define TRUE 1
unsigned int wDelay = 0;
unsigned char nKey = NO_KEY;
unsigned char GetKey(void)
{
static unsigned char nStep = STEP_IDEL;
static unsigned char nBufferedKey;
switch(nStep)
{
case STEP_DELAY: //按键消抖
if(wDelay > 4)
wDelay = 0;
nStep = STEP_FINISH;
break;
case STEP_FINISH: //按键完成
if(((P1IN & 0x04) == 0 )&& (nBufferedKey == KEY_K1))
nKey = KEY_K1;
else if(((P1IN & 0x08) == 0)&& (nBufferedKey == KEY_K2))
nKey = KEY_K2;
else if(((P1IN &0x10) == 0) &&(nBufferedKey ==KEY_K3))
nKey = KEY_K3;
else
nKey = NO_KEY;
nStep = STEP_IDEL;
break;
case STEP_IDEL: //按键检测
if ((P1IN & 0x04) == 0)
{
nBufferedKey = KEY_K1;
nKey = NO_KEY;
//wDelay = 0;
nStep = STEP_DELAY;
}
else if((P1IN & 0x08) == 0)
{
nBufferedKey = KEY_K2;
nKey = NO_KEY;
//wDelay = 0;
nStep = STEP_DELAY;
}
else if((P1IN & 0x10) == 0)
{
nBufferedKey = KEY_K3;
nKey = NO_KEY;
//wDelay = 0;
nStep = STEP_DELAY;
}
else
nKey = NO_KEY;
break;
}
return nBufferedKey;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
TACTL = TASSEL1 + TACLR ;//时钟源SMCLK,清除TAR
CCTL0 = CCIE;//CCR0中断使能
CCR0 = 50000;//产生3.2ms的定时
TACTL |= MC1;//Timer_a增计数模式
_EINT();//使能系统中断
while (TRUE)
{
nKey = GetKey();
switch (nKey)
{
case NO_KEY:
P4DIR |=0xff;
P4OUT |= 0x00;
break;
case KEY_K1://S1
P4DIR |= 0xff;//P4.2,P4.3输出
P4OUT ^= 0x08;//输出为交流
nKey= NO_KEY;
break;
case KEY_K2://S2
P4DIR |= 0xff;//P4.2,P4.3输出
P4OUT ^= 0x04;//输出为交流
nKey= NO_KEY;
break;
case KEY_K3://S3
nKey = NO_KEY;
break;
}
}
}
/*#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A( void)
{
wDelay++;
CCR0 += 50000;
}*/
interrupt [TIMERA0_VECTOR]void Timer_a_interrupt(void)//Timer_a_0中断
{
wDelay++;
CCR0 += 50000;
}
谢谢上面的老兄,把程序该成上面这个是可以了,但是现在出现的现象上:当按键按下后蜂鸣器开始发声,松开后继续发声,知道按其他键后才停止。以我的原来的本意是按下发声,抬起按键就不发声,原因出在哪了啊?
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(初级)

4
 
本人愚见:因为nKey为全局变量,只要有不等于 NO_KEY,就会发音,而不再于是否是按下还是弹起,如果要实现你的想法,我认为要用到 捕捉功能,捕捉到下降沿时,输出交流电压,当捕捉到上升沿时,停止输出。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 

zsb25

引用:

本人愚见:因为nKey为全局变量,只要有不等于 NO_KEY,就会发音,而不再于是否是按下还是弹起,如果要实现你的想法,我认为要用到 捕捉功能,捕捉到下降沿时,输出交流电压,当捕捉到上升沿时,停止输出。
确实是nKey这有问题了,谢谢楼上的。
/*目的是按下按键则蜂鸣器就发出声音,电路板是msp430F169的学习板*/
#include <msp430x44x.h>
#define NO_KEY 0 //没有按键
#define KEY_K1 1 //按键1
#define KEY_K2 2 //按键2
#define KEY_K3 3 //按键3
#define STEP_IDEL 0 //按键延时
#define STEP_DELAY 1 //等待按键
#define STEP_FINISH 2 //按键过程结束
#define TRUE 1
unsigned int wDelay = 0;
unsigned char nKey = NO_KEY;
unsigned char GetKey(void)
{
static unsigned char nStep = STEP_IDEL;
static unsigned char nBufferedKey;
static unsigned char nPressKey;/////////////////////////////////这个是后来修改完的
switch(nStep)
{
case STEP_IDEL: //按键检测
if ((P1IN & 0x04) == 0)//K3
{
nBufferedKey = KEY_K1;
// nKey = NO_KEY;
//wDelay = 0;
nStep = STEP_DELAY;
}
else if((P1IN & 0x08) == 0)//K2
{
nBufferedKey = KEY_K2;
// nKey = NO_KEY;
//wDelay = 0;
nStep = STEP_DELAY;
}
else if((P1IN & 0x10) == 0)//K1
{
nBufferedKey = KEY_K3;
//nKey = NO_KEY;
//wDelay = 0;
nStep = STEP_DELAY;
}
else
{ nBufferedKey = NO_KEY;
}
nPressKey = NO_KEY;/////////////////////////
break;
case STEP_DELAY: //按键消抖
if(wDelay > 4)
{ wDelay = 0;
nStep = STEP_FINISH;
}
nPressKey = NO_KEY;//////////////////////////////
break;
case STEP_FINISH: //按键完成
if(((P1IN & 0x04) == 0 )&& (nBufferedKey == KEY_K1))
nBufferedKey = KEY_K1;
else if(((P1IN & 0x08) == 0)&& (nBufferedKey == KEY_K2))
nBufferedKey = KEY_K2;
else if(((P1IN &0x10) == 0) &&(nBufferedKey ==KEY_K3))
nBufferedKey = KEY_K3;
else
{ nBufferedKey = NO_KEY;
}
nStep = STEP_IDEL;
nPressKey = nBufferedKey;/////////////////////////////
break;
}
return nPressKey;/////////////////////////////////////////////////////////////////
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
TACTL = TASSEL1 + TACLR ;//时钟源SMCLK,清除TAR
CCTL0 = CCIE;//CCR0中断使能
CCR0 = 50;//产生3.2ms的定时
TACTL |= MC1;//Timer_a增计数模式
_EINT();//使能系统中断
while (TRUE)
{
nKey = GetKey();
switch (nKey)
{

case KEY_K1://S3
nKey= NO_KEY;
P4DIR |= 0xff;//P4.2,P4.3输出
P4OUT ^= 0x08;//输出为p4.2高电平,p4.3低电平
break;
case KEY_K2://S2
nKey= NO_KEY;
P3DIR |= 0xff;
P3OUT ^= 0x04;
P4DIR |= 0xff;//P4.2,P4.3输出
P4OUT ^= 0x04;//输出为p4.3高电平,p4.2低电平
break;
case KEY_K3://S1
nKey = NO_KEY;
P4DIR |= 0xff;
P4OUT |= 0x00;
break;
case NO_KEY:
P4DIR |= 0xff;
P4OUT |= 0x00;
break;
}
}
}
/*#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A( void)
{
wDelay++;
CCR0 += 50000;
}*/
interrupt [TIMERA0_VECTOR]void Timer_a_interrupt(void)//Timer_a_0中断
{
wDelay++;
CCR0 += 50;
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表