专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

感觉比较好的矩阵键盘扫描程序

作者:佚名   来源:本站原创   点击数:  更新时间:2011年11月11日   【字体:

   这个程序是我在写一个计算器的程序的时候想出来的,总感觉常用的键盘扫描程序用起来很麻烦,总是要一行一行的进行扫描,看起来也很繁琐,于是自己想了一个矩阵键盘的扫描程序,原理很简单的!

    这个程序的基本思路是两条相交直线只有一个交点的原理,说白了就是先检测行,再检测列,或者倒过来也可以。
 
    这个键盘扫描子程序是一个有返回值的无参函数,需要之前计算好一个数组就OK了!
 

 
    下面是子函数的实现,我在这里只用一个3*4的矩阵键盘为例,原理都是一样的!
=================================================================
uchar code key_table[]=
{
0x77,
0x7b,
0x7d,
0xb7,
0xbb,
0xbd,
0xd7,
0xdb,
0xdd,
0xe7,
0xeb,
0xed
};
/*上面的数组要自己事先计算好,只要把行和列的值连接在一起就可以得到相应按键对应的值了*/

unsigned char key_scan(void )
{
unsigned char i, key_code;                     /*变量的声明*/
key_port = 0x0f;                                      /*这里的key_port是在前面宏定义的一个GPIO口,先将行(或者列)置位*/                 
if(key_port != 0x0f)                                 /*如果有按键按下则GPIO的初值就会变化,就会执行下面的语句*/
{
delay(5);                                                 /*这里是的延时实现的是消抖,这里就不作介绍了*/
if(key_port != 0x0f)                                 /*确定真的有按键按下*/
{
key_code = key_port;                             /*把行(或者列)的值赋给key_code*/
key_port = 0xf0;                                      /*再把列(或者行置位)*/
key_code |= key_port;                             /*把行和列的值组合起来并赋值给key_code*/
for(i = 0; i < 12; i++)                                /*因为每一个按键按下对应的key_code只有一个,所以根据矩阵键盘的按键个数用相应的FOR循环就可以确定到底是哪一个按键被按下*/
{
if(key_table[i] == key_code) 
{
key = i+1; 
break;
}
}
}
}
else key = 0;
return key;                                                 /*返回的KEY值就是,相应位置的按键了*/
}

=========================================================
程序到这里结束了,如果有什么建议或者不明白的地方可以给我留言^_^!
关闭窗口

相关文章