Wed Feb 25 2009 阴
牛年单片机学习日记--矩阵键盘
终于把实习答辩搞完了,又可以安心的学习俺的单片机了,呵呵,今天就搞矩阵键盘了。键盘的识别方法有行扫描法和行反转法,今天就学用行反转法写吧。
行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.
判断键盘中有无键按下: 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
判断闭合键所在的位置: 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
反转法:
用反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式。程序使单片机通过输出端口往各行线 上全部送低电平,然后读入列线的值,如此时有某个键按下,则必这定会使某一列线值为0 。这时程序再对两个并行口进行方式设置,使接线的并行端口输出,再读取行线的输入值,那么,在闭合键所在的行线的值必定为0 。这样当一个键按下时,必定可读得一对唯一的行值和列值。
下面是俺 的小程序:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg7code[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //段码
uchar k; //记录key值
void delay10ms(void) //延时程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void Getch ( ) //key scan function
{
unsigned char X,Y,Z;
P2=0xff;
P2=0x0f; //先对 P2置数 行扫描
if(P2!=0x0f) //判断是否有键按下
{
delay10ms(); //延时,软件去干扰
if(P2!=0x0f) //确认按键按下;
{
X="P2"; //保存行扫描时有键按下时状态
P2=0xf0; //列扫描
Y="P2"; //保存列扫描时有键按下时状态
Z="X|Y"; //取出键值
switch ( Z ) //判断键值(那一个键按下)
{
case 0x77: k="0"; break; //对键值赋值
case 0x7b: k="1"; break;
case 0x7d: k="2"; break;
case 0x7e: k="3"; break;
case 0xb7: k="4"; break;
case 0xbb: k="5"; break;
case 0xbd: k="6"; break;
case 0xbe: k="7"; break;
case 0xd7: k="8"; break;
case 0xdb: k="9"; break;
case 0xdd: k="10";break;
case 0xde: k="11";break;
case 0xe7: k="12";break;
case 0xeb: k="13";break;
case 0xed: k="14";break;
case 0xee: k="15";break;
default:break;
}
}
}
}
void main(void)
{
while(1)
{
P2=0xff;
Getch();
P0=seg7code[k]; //查表 LED 输出
P1=0xf0; //输出相同的四位数据。
}
}
下面是俺的电路图;点击下图可放大看
呵呵,这个也参考别人的了,我想把它改进一下,让它显示四位不同的四位数,不过还没想好,怎么设置绶冲数组,好了,先去把肚子填一填,再回来搞!
用户1485605 2009-3-3 23:16
xucun915_925777961 2009-2-27 13:19
xucun915_925777961 2009-2-27 13:18
用户124414 2009-2-27 09:37
用户182343 2009-2-26 13:49