我会时常分享一些51的程序编写方法,有一定基础的可以来看看。如有不当之处,欢迎大家指正,一同进步。
矩阵键盘无非就是两种扫描方式,一为逐行扫描,二为行列一起扫描读取键值。先确定行后确定列的读取方法没有什么可讲的,我针对行列一起扫描来总结一下我常用的一些方法。
学习嵌入式或者说硬件一定是从硬件原理开始,因为矩阵键盘电路原理简单,网上讲解较多,我只附上原理图,重点跟大家交流一下程序部分。
下图就是矩阵键盘 由P1口控制,P10~P13为列 P14~P17为行。
高四位输出低电平,低四位输出高电平,检测低四位不全为高可确定列;反过来高四位输出高电平,低四位输出高电平,高四位不全为高确定行,行列交叉即可获得按键键值。废话不多说,直接上程序,我已经详细注解过了,不懂多看看哈。
/*******************************************************************************
* 函数名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输入 : 无
* 输出 : 无
* 作者 : INK
* 日期地点 : NANKING
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f; // 位定义的引脚
if(GPIO_KEY!=0x0f) //读取按键是否按下
{
Delay10ms(); //延时10ms进行消抖
if(GPIO_KEY!=0x0f) //再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{ //此段程序只是为了确定列的值 方便在后面进行测试行的时候加减运算 获得具体案件的行列值 从而转换为按键值
case(0X07): KeyValue=0;break;//扫描第一列
case(0X0b): KeyValue=1;break;//按键第二列 是keyValue=1
case(0X0d): KeyValue=2;break;//按键第三列
case(0X0e): KeyValue=3;break;//按键第四列
}
//测试行 确定了列以后需要翻转 确定行 交叉确定键值
GPIO_KEY=0XF0; //屏蔽高四位
switch(GPIO_KEY)
{ //已经进行过
case(0X70): KeyValue=KeyValue;break;//自己去看为什么是 0X70 列的时候又为什么是0X07 硬件相结合
case(0Xb0): KeyValue=KeyValue+4;break; //键值是5 扫描第二行
case(0Xd0): KeyValue=KeyValue+8;break; //键值是9 扫描第三行
case(0Xe0): KeyValue=KeyValue+12;break; //键值13 扫描第四行
} //其实最终返回的键值就是进行过加法运算的
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测 松手 按键就是 f0
{
Delay10ms();
a++;//防止程序死在 while循环里 利用a的值跳出循环,比较不错的双重保险办法
}
}
}
}