共2条
1/1 1 跳转至页
我的键盘程序,大侠指点指点!!!!

问
以下是我的键盘中断和响应程序,请大家指导,并希望那位大侠有键盘软开关机的思路或例子也请告诉我。谢谢!!!!sir5163.com
/* ********************独立式键盘判断子程序***************** */
// 四键采用中断方式响应
// 下降沿触发P1端口中断
// P4口的低四位用发光二极管输出显示键盘响应情况
// sir5 调试通过
/* ******************************************************** */
#include <MSP430x14x.h>
unsigned char keyb;
unsigned long w;
void delay(int v)
{
while(v!=0)v--;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P4DIR=0XFF;
P4OUT=0X0F;
for (w=0;w<5000;w++);
P4OUT=0X00;
keyb =0x00;
P1DIR=0XF0; // 低四位输入
// P1OUT=0X0F;
P1IES=0XFF; // 下降沿触发
P1IE=0X0F; //低四位允许P1中断
_EINT(); // Enable interrupts
while(1)
{
switch (keyb)
{
case 1: // 仪器开关按键
{keyb =0x00;
P4OUT |=0X01;
// for (w=0;w<5000;w++);
delay(50000);
}
break;
case 2:
{
P4OUT |=0X02;
keyb =0x00;
for (w=0;w<5000;w++);
}
break;
case 4:
{
P4OUT |=0X04;
keyb =0x00;
for (w=0;w<5000;w++);
}
break;
case 8:
P4OUT |=0X08;
keyb =0x00;
for (w=0;w<5000;w++);
break;
default:
break;
}// end switch
/* 填程序位置 */
P4OUT = 0X00;
_NOP();
_NOP();
}
}
#pragma vector=PORT1_VECTOR // 端口1的中断处理程序
__interrupt void PORT1ISR (void)
{
unsigned long i; // 换成整形,减小响应时间
if ((~P1IN & 0X0F) !=0)
for (i=0;i<10000;i++);
if ((~P1IN & 0X0F) !=0)
keyb = ~P1IN & 0X0F;
else
keyb = 0;
P1IFG=0X00;
} 答 1: 行就顶一下!!! 答 2: 各位看看 答 3: 没必要这么繁琐 答 4: 他只是一个例子,将来的程序还是你自己做。 答 5: 我没有做过,感觉还不错 答 6: 感觉的不错的就顶 答 7: 不用中断也可以做的很好的!
你的键好象没有弹起的判断,这样就容易造成一键多次识别的的问题!
另外你的消抖处理的也不是很好的,好象不太容易过EMC 答 8: 中断中有延时程序不好 答 9: 键盘下降沿触发,按下后不松开,则没有下一次的下降沿,可以连续识别吗?我在做板子时按键出加了0.1uF的电容应该可以了。我的项目中是这样处理的,到现在还是很稳定的。中断中也可以不要延时程序,但是电容须加大。用电容消抖动也是一种方法。我这里要做软件开关机,所以选择中断的方法。
不错,用扫描法也可以做到。程序的功能实现由很多中方法,看你方便用那种,喜欢用那种。实际的应用中又需要怎么处理。扫描的我也做了。程序也有,但我觉得没有必要贴了,那个太简单。 答 10: 如果有定时器的话可以在中断后开定时器,在定时器中判断按键值,我觉的这种方法比较好
/* ********************独立式键盘判断子程序***************** */
// 四键采用中断方式响应
// 下降沿触发P1端口中断
// P4口的低四位用发光二极管输出显示键盘响应情况
// sir5 调试通过
/* ******************************************************** */
#include <MSP430x14x.h>
unsigned char keyb;
unsigned long w;
void delay(int v)
{
while(v!=0)v--;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P4DIR=0XFF;
P4OUT=0X0F;
for (w=0;w<5000;w++);
P4OUT=0X00;
keyb =0x00;
P1DIR=0XF0; // 低四位输入
// P1OUT=0X0F;
P1IES=0XFF; // 下降沿触发
P1IE=0X0F; //低四位允许P1中断
_EINT(); // Enable interrupts
while(1)
{
switch (keyb)
{
case 1: // 仪器开关按键
{keyb =0x00;
P4OUT |=0X01;
// for (w=0;w<5000;w++);
delay(50000);
}
break;
case 2:
{
P4OUT |=0X02;
keyb =0x00;
for (w=0;w<5000;w++);
}
break;
case 4:
{
P4OUT |=0X04;
keyb =0x00;
for (w=0;w<5000;w++);
}
break;
case 8:
P4OUT |=0X08;
keyb =0x00;
for (w=0;w<5000;w++);
break;
default:
break;
}// end switch
/* 填程序位置 */
P4OUT = 0X00;
_NOP();
_NOP();
}
}
#pragma vector=PORT1_VECTOR // 端口1的中断处理程序
__interrupt void PORT1ISR (void)
{
unsigned long i; // 换成整形,减小响应时间
if ((~P1IN & 0X0F) !=0)
for (i=0;i<10000;i++);
if ((~P1IN & 0X0F) !=0)
keyb = ~P1IN & 0X0F;
else
keyb = 0;
P1IFG=0X00;
} 答 1: 行就顶一下!!! 答 2: 各位看看 答 3: 没必要这么繁琐 答 4: 他只是一个例子,将来的程序还是你自己做。 答 5: 我没有做过,感觉还不错 答 6: 感觉的不错的就顶 答 7: 不用中断也可以做的很好的!
你的键好象没有弹起的判断,这样就容易造成一键多次识别的的问题!
另外你的消抖处理的也不是很好的,好象不太容易过EMC 答 8: 中断中有延时程序不好 答 9: 键盘下降沿触发,按下后不松开,则没有下一次的下降沿,可以连续识别吗?我在做板子时按键出加了0.1uF的电容应该可以了。我的项目中是这样处理的,到现在还是很稳定的。中断中也可以不要延时程序,但是电容须加大。用电容消抖动也是一种方法。我这里要做软件开关机,所以选择中断的方法。
不错,用扫描法也可以做到。程序的功能实现由很多中方法,看你方便用那种,喜欢用那种。实际的应用中又需要怎么处理。扫描的我也做了。程序也有,但我觉得没有必要贴了,那个太简单。 答 10: 如果有定时器的话可以在中断后开定时器,在定时器中判断按键值,我觉的这种方法比较好
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |