共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |