专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
MSP430按键与ADC采集代码整合出现的问题求助
2019-03-24 09:37
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
8134
19
951
这是我参考别人按键程序修改的主程序:
下面的是ADC电压采集程序:
现在出现的问题是:在进行实验仿真时,程序是可以完全地运行,只是在运行过程中,只能使用按键一次,按键按下之后程序就只能输出一个方波,再另外按下另一个按键就没有反应。程序在
时,KEY的值就保持不变了,请问该如何修改程序,使程序能按下一个键就能输出一个方波,使它们自由转换呢?求助!!!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
吕不韦
2019-03-25 14:52
这是主程序:
#include <msp430x14x.h>
#include "Key.h"
#include "Delay.h"
#include "PWM1.h"
#include "PWM2.h"
#include "ADC.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
unsigned char Key;
Key_INIT(); //按键初始化
ADC();
for (;;)
{
ADC12CTL0|=ENC;//转换允许使能
ADC12CTL0|=ADC12SC; //开转换
_BIS_SR(LPM0_bits+GIE);//开中断
Key=Key_Scan();//按键扫描
if(Key!=0) //如果按键不等于0即按有按键按下
{
switch(Key)//转到按键程序
{
case 1:
PWM1();
break;
case 2:
PWM2();
break;
default : break;
}
}
else delay_ms(10);//消除抖动
}
}
这是主程序部分,包括了ADC采集程序,产生两个不同频率的PWM波程序9在430的P1.2端口输出PWM波),还有延时程序
下面是按键初始化及扫描的程序(按键的一端接地,一端接430的P1.0和P1.1端,在端口与按键之间并接430的VCC端,就是说没按键按下的时候P1.0/P1.1端口是高电平,按键按下是低电平:
#include "msp430x14x.h"
#include "Key.h"
#include "Delay.h"
void Key_INIT(void)
{
// DIR=0,输入模式,DIR=1,输出模式
P1DIR &= ~BIT0;//配置P1.0为输入模式
P1DIR &= ~BIT1;//配置P1.1为输入模式
}
unsigned char Key_Scan(void)
{
static unsigned char KEY=0;//定义没有按键按下时,KEY=0
static unsigned char key_up=1; //没有按键按下时,key_up=1
if(key_up&&(KEYin1==0||KEYin2==0))//有一个键按下
{
delay_ms(10); //去抖动
key_up=0;//有按键按下,证明按键为低电平
if(KEYin1==0)//按键1按下,转为低电平
{
KEY=1; //KEY1按下
}
else if(KEYin2==0)//按键2按下,转为低电平
{
KEY=2;//KEY2按下
}
}
else if(KEYin1!=0&&KEYin2!=0)//无按键按下,返回值为0
{
key_up=1;
KEY=0;
}
return KEY;
}
下面是ADC采集程序(从P6.0采集到电压信号,低于1.65V就在P3.4输出低电压到电池管理芯片LN2054的使能控制端,使电池充电):
#include "msp430x14x.h"
#include "ADC.h"
void ADC(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
ADC12CTL0=SHT0_8+ADC12ON+MSC;//打开ADC12,设置采样时间
ADC12CTL1=SHP+CONSEQ_2;//单通道多次转换,采样定时器采样方式
ADC12IE|=BIT0; //只使能ADC12MEM0中断,即转换的数据存入MEM0时中断可处
P6DIR|=0X00;
P6SEL|=BIT0;
P3DIR|=BIT4;
}
#pragma vector=ADC12_VECTOR //进入ADC12中断
__interrupt void ADC12ISR(void)
{
if(ADC12MEM0<0x7ff) //如果P6.0小于1.65V
P3OUT&=~BIT4; //P3.4=0
else
P3OUT|=BIT4; //P3.4=1
_BIC_SR_IRQ(LPM0_bits); //退出中断
ADC12CTL0&=~ENC;//清除中断标志位
}
加载中...
查看其它19个回答
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <msp430x14x.h>
#include "Key.h"
#include "Delay.h"
#include "PWM1.h"
#include "PWM2.h"
#include "ADC.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
unsigned char Key;
Key_INIT(); //按键初始化
ADC();
for (;;)
{
ADC12CTL0|=ENC;//转换允许使能
ADC12CTL0|=ADC12SC; //开转换
_BIS_SR(LPM0_bits+GIE);//开中断
Key=Key_Scan();//按键扫描
if(Key!=0) //如果按键不等于0即按有按键按下
{
switch(Key)//转到按键程序
{
case 1:
PWM1();
break;
case 2:
PWM2();
break;
default : break;
}
}
else delay_ms(10);//消除抖动
}
}
这是主程序部分,包括了ADC采集程序,产生两个不同频率的PWM波程序9在430的P1.2端口输出PWM波),还有延时程序
下面是按键初始化及扫描的程序(按键的一端接地,一端接430的P1.0和P1.1端,在端口与按键之间并接430的VCC端,就是说没按键按下的时候P1.0/P1.1端口是高电平,按键按下是低电平:
#include "msp430x14x.h"
#include "Key.h"
#include "Delay.h"
void Key_INIT(void)
{
// DIR=0,输入模式,DIR=1,输出模式
P1DIR &= ~BIT0;//配置P1.0为输入模式
P1DIR &= ~BIT1;//配置P1.1为输入模式
}
unsigned char Key_Scan(void)
{
static unsigned char KEY=0;//定义没有按键按下时,KEY=0
static unsigned char key_up=1; //没有按键按下时,key_up=1
if(key_up&&(KEYin1==0||KEYin2==0))//有一个键按下
{
delay_ms(10); //去抖动
key_up=0;//有按键按下,证明按键为低电平
if(KEYin1==0)//按键1按下,转为低电平
{
KEY=1; //KEY1按下
}
else if(KEYin2==0)//按键2按下,转为低电平
{
KEY=2;//KEY2按下
}
}
else if(KEYin1!=0&&KEYin2!=0)//无按键按下,返回值为0
{
key_up=1;
KEY=0;
}
return KEY;
}
下面是ADC采集程序(从P6.0采集到电压信号,低于1.65V就在P3.4输出低电压到电池管理芯片LN2054的使能控制端,使电池充电):
#include "msp430x14x.h"
#include "ADC.h"
void ADC(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
ADC12CTL0=SHT0_8+ADC12ON+MSC;//打开ADC12,设置采样时间
ADC12CTL1=SHP+CONSEQ_2;//单通道多次转换,采样定时器采样方式
ADC12IE|=BIT0; //只使能ADC12MEM0中断,即转换的数据存入MEM0时中断可处
P6DIR|=0X00;
P6SEL|=BIT0;
P3DIR|=BIT4;
}
#pragma vector=ADC12_VECTOR //进入ADC12中断
__interrupt void ADC12ISR(void)
{
if(ADC12MEM0<0x7ff) //如果P6.0小于1.65V
P3OUT&=~BIT4; //P3.4=0
else
P3OUT|=BIT4; //P3.4=1
_BIC_SR_IRQ(LPM0_bits); //退出中断
ADC12CTL0&=~ENC;//清除中断标志位
}
一周热门 更多>