专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
按键的下降沿和低电平的问题
2019-03-24 09:40
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
8152
16
1259
请教各位,按键原来是下降沿有效,但我想把按键改为低电平有效,应该怎么改呢,是把原来的下降沿中断去掉吗?
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
qiushenghua
2019-03-26 11:39
本帖最后由 qiushenghua 于 2015-11-19 02:01 编辑
下面这个是刚刚在楼主程序基础上修改后的结果,读懂这段程序,大概就能理解MSP430的低功耗模式是怎么回事了。
#include "MSP430G2553.h"
void WDT_init();
void P1_IODect();
void P13_Short_Click();
void P13_Long_Click();
char count=0; //用来统计按键按下的时间占据了多少个定时中断周期
unsigned char KEY_STATE=0; //定义一个变量储存按键状态
unsigned char KEY_LAST_STATE=0; //再定义一个变量储存上次检测到的按键状态
void main(void)
{
/*下面这几句是配置时钟源的,自己看着改*/
BCSCTL3 |= LFXT1S_2; // 将VLO作为ACLK时钟源
WDTCTL = WDT_ADLY_16; // 使用内部的16ms看门狗中断,不过这个时间是用32768晶振算出来的,实际中断周期为 // 16ms/12k*32k=44ms
IE1 |= WDTIE; // 使能看门狗周期性中断
BCSCTL1 = CALBC1_8MHZ; // 配置CPU工作时钟MCLK=DCO_8MHZ
DCOCTL = CALDCO_8MHZ;
P1DIR |= BIT0+BIT6;
P1OUT |= BIT0;
P1OUT |= BIT6;
P1REN |= BIT3;
P1OUT |= BIT3;
_enable_interrupts(); //使能总中断
while(1) //想想为什么要循环起来,和你之前的程序有什么不同
{
P1_IODect(); //检测按键
LPM3; //进入LPM3模式,相当方便的语句
}
}
#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
LPM3_EXIT; //定时中断到来的时候唤醒CPU,退出LPM3也就是一条语句的事情
}
void P1_IODect()
{
KEY_LAST_STATE=KEY_STATE; //将键值存入上一状态laststate
KEY_STATE=!(P1IN&BIT3); //读取按键键值,高为未按下,低为按下,因此对其取逻辑反,便于理解。
//现在KEY_STATE为true表示按键按下,KEY_STATE为false表示按键未按下
//实际上按键按下的时候KEY_STATE=BIT3,按键未按下为0。
if((!KEY_STATE)&&KEY_LAST_STATE)//如果当前状态为按键未按下,但是上一状态按键是按下的
//说明按键弹起了。
{
if(count<30) //如果按下到弹起小于30个周期也就是44ms*30=1.3s
P13_Short_Click(); //处理短按程序
count=0;
}
if(KEY_STATE) //当前按键如果是按下的
{
count++; //不管那么多计数先加一
if(count>100)
count=100; //避免count溢出,给其设置一个上限100
}
if(count==60) //如果按键按下44ms*60=2.6s
P13_Long_Click(); //处理长按程序
//注意这个长按的时钟是不准确的,具体怎么算长按怎么算短按自己调整
}
void P13_Short_Click()//短按翻转BIT0
{
P1OUT ^= BIT0;
// P1OUT ^= BIT6;
}
void P13_Long_Click()//长按翻转BIT6
{
// P1OUT ^= BIT0;
P1OUT ^= BIT6;
}
复制代码
加载中...
查看其它16个回答
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
下面这个是刚刚在楼主程序基础上修改后的结果,读懂这段程序,大概就能理解MSP430的低功耗模式是怎么回事了。
- #include "MSP430G2553.h"
- void WDT_init();
- void P1_IODect();
- void P13_Short_Click();
- void P13_Long_Click();
- char count=0; //用来统计按键按下的时间占据了多少个定时中断周期
- unsigned char KEY_STATE=0; //定义一个变量储存按键状态
- unsigned char KEY_LAST_STATE=0; //再定义一个变量储存上次检测到的按键状态
- void main(void)
- {
- /*下面这几句是配置时钟源的,自己看着改*/
- BCSCTL3 |= LFXT1S_2; // 将VLO作为ACLK时钟源
- WDTCTL = WDT_ADLY_16; // 使用内部的16ms看门狗中断,不过这个时间是用32768晶振算出来的,实际中断周期为 // 16ms/12k*32k=44ms
- IE1 |= WDTIE; // 使能看门狗周期性中断
- BCSCTL1 = CALBC1_8MHZ; // 配置CPU工作时钟MCLK=DCO_8MHZ
- DCOCTL = CALDCO_8MHZ;
- P1DIR |= BIT0+BIT6;
- P1OUT |= BIT0;
- P1OUT |= BIT6;
- P1REN |= BIT3;
- P1OUT |= BIT3;
-
- _enable_interrupts(); //使能总中断
- while(1) //想想为什么要循环起来,和你之前的程序有什么不同
- {
- P1_IODect(); //检测按键
- LPM3; //进入LPM3模式,相当方便的语句
- }
- }
- #pragma vector=WDT_VECTOR
- __interrupt void WDT_ISR(void)
- {
- LPM3_EXIT; //定时中断到来的时候唤醒CPU,退出LPM3也就是一条语句的事情
- }
- void P1_IODect()
- {
- KEY_LAST_STATE=KEY_STATE; //将键值存入上一状态laststate
- KEY_STATE=!(P1IN&BIT3); //读取按键键值,高为未按下,低为按下,因此对其取逻辑反,便于理解。
- //现在KEY_STATE为true表示按键按下,KEY_STATE为false表示按键未按下
- //实际上按键按下的时候KEY_STATE=BIT3,按键未按下为0。
- if((!KEY_STATE)&&KEY_LAST_STATE)//如果当前状态为按键未按下,但是上一状态按键是按下的
- //说明按键弹起了。
- {
- if(count<30) //如果按下到弹起小于30个周期也就是44ms*30=1.3s
- P13_Short_Click(); //处理短按程序
- count=0;
- }
- if(KEY_STATE) //当前按键如果是按下的
- {
- count++; //不管那么多计数先加一
- if(count>100)
- count=100; //避免count溢出,给其设置一个上限100
- }
- if(count==60) //如果按键按下44ms*60=2.6s
- P13_Long_Click(); //处理长按程序
- //注意这个长按的时钟是不准确的,具体怎么算长按怎么算短按自己调整
- }
- void P13_Short_Click()//短按翻转BIT0
- {
- P1OUT ^= BIT0;
- // P1OUT ^= BIT6;
- }
- void P13_Long_Click()//长按翻转BIT6
- {
- // P1OUT ^= BIT0;
- P1OUT ^= BIT6;
- }
复制代码一周热门 更多>