最近做个8X11行列键盘,我测试都很好,但是客户说有漏按键的。各位有什么经验介绍一下?
比如扫描时间,列切换前后时间,去抖动时间等怎么分配才算最合理 ?
离线
漏也可能是硬件问题。
扫描转换成一个阵列码 然后接一个按键检测函数
void Key_scan(unsigned key_lab,unsigned char *key)
{
#define KEY_DWON 20 //
#define KEY_FREE 20 //Êͷżì²â´ÎÊý
static unsigned char key_same_times=0;
static unsigned char last_key=0;
static bit if_free=0;
if(if_free) //ÊÍ·ÅÖмì²â°´¼ü
{
if((last_key==key_lab)&&(key_lab!=0))
{
if(key_same_times<255)
{
key_same_times++;
}
else;
}
else key_same_times=0;
if(key_same_times>=KEY_DWON)
{
*key=key_lab;
key_same_times=0;
if_free=0;
}
}
else //¼ì²â°´¼üÊÍ·Å
{
if(key_lab==0)key_same_times++;
else key_same_times=0;
if(key_same_times>=KEY_FREE)
{
if_free=1;
key_same_times=0;
}
else ;
}
last_key=key_lab;
}
离线
我准备 用中断搞 了。行驱动用4MS的中断去轮流拉低IO。然后 列做成2MS去抖的IO中断。用中断采集。
离线
实时扫描嘛,
离线
矩阵键盘有标准做法的。
列: 固件输出低电平(为了拉下行)
行 :硬件上拉 固件做下降沿中断 中断程序中做20MS延时去抖,确定是有按键按下后(依次把列变成输入看看哪一个列跟随变1 这样就开确定列了)
可能说的有点乱,大概就是这么一个流程。
欢迎大家探讨。
离线
估计是行列扫描逻辑没控制好吧,用定时扫描的方法
离线
用个2ms的定时器中断,在中断中记录按键状态并和前次采集对比滤波比较稳妥
离线
我想用lcd的io口做4*4矩阵键盘,要怎么实现,改下设备树就行吗?要怎么个思路
离线
我觉得 linux 里面的 matrix_keypad 驱动可以做到, 你试一试:
https://github.com/torvalds/linux/blob/master/drivers/input/keyboard/matrix_keypad.c
https://www.kernel.org/doc/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt
离线
好的,谢谢
离线
matrix_keypad需要IO支持中断才行吧,如果用LCD的IO口,好像没有中断功能,会报错
离线
晕哥 说:matrix_keypad需要IO支持中断才行吧,如果用LCD的IO口,好像没有中断功能,会报错
看了一下代码,应该是会出错, PB,PG有中断,这组应该可以用。
离线
学习楼上朋友的经验
离线
在定时器中断内执行一个状态机可以:初始拉低几个管脚 -> 读IO,拉低下一组 -> 读IO,拉低下一组 -> ……
如此重复下去即可。
离线