终于把实习答辩搞完了,又可以安心的学习俺的单片机了,呵呵,今天就搞矩阵键盘了。键盘的识别方法有行扫描法和行反转法,今天就学用行反转法写吧。行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。判断键盘中有无键按下: 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置: 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。反转法:用反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式。程序使单片机通过输出端口往各行线 上全部送低电平,然后读入列线的值,如此时有某个键按下,则必这定会使某一列线值为0 。这时程序再对两个并行口进行方式设置,使接线的并行端口输出,再读取行线的输入值,那么,在闭合键所在的行线的值必定为0 。这样当一个键按下时,必定可读得一对唯一的行值和列值。下面是俺的小程序#include #define uchar unsigned char#define uint unsigned intuchar 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; //输出相同的四位数据。} } 下面是俺的电路图;点击下图可放大看
呵呵,这个也参考别人的了,我想把它改进一下,让它显示四位不同的四位数,不过还没想好,怎么设置绶冲数组,好了,先去把肚子填一填,再回来搞!
发布
中国人跨越数字鸿沟,靠ARM来完成了,X86只能退居二线。QQ 406886133
用户1588142 2011-9-25 12:50
用户1181185 2011-9-23 11:58
用户1010725 2011-5-27 13:39
用户1557273 2011-1-14 20:08
用户1071866 2011-1-11 16:16
用户1048913 2011-1-11 15:01
用户1587941 2011-1-10 09:36
用户1378393 2011-1-10 09:18
用户1010725 2011-1-10 08:51
中国人跨越数字鸿沟,靠ARM来完成了,X86只能退居二线。QQ 406886133
用户1277994 2011-1-6 17:01