共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 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| OK1126B-S开发板下以导航按键控制云台/机械臂姿态调整被打赏¥29元 | |
| 【树莓派5】便携热成像仪被打赏¥36元 | |
| 【树莓派5】环境监测仪被打赏¥35元 | |
| OK1126B-S开发板下多时段语音提示型电子时钟被打赏¥27元 | |
| OK1126B-S开发板下函数构建及步进电机驱动控制被打赏¥25元 | |
| 【S32K3XX】LPI2C 参数配置说明被打赏¥20元 | |
| OK1126B-S开发板的脚本编程及应用设计被打赏¥27元 | |
| 5v升压8.4v两节锂电池充电芯片,针对同步和异步的IC测试被打赏¥35元 | |
| 【S32K3XX】S32DS LPI2C 配置失败问题解决被打赏¥22元 | |
| 【S32K3XX】FLASH 的 DID 保护机制被打赏¥19元 | |
我要赚赏金
