懒猫爱飞

牛年单片机学习日记--矩阵键盘

0
阅读(2234)

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;                  //输出相同的四位数据。
    }
}
 
 
                        下面是俺的电路图;点击下图可放大看
 
 
 

        呵呵,这个也参考别人的了,我想把它改进一下,让它显示四位不同的四位数,不过还没想好,怎么设置绶冲数组,好了,先去把肚子填一填,再回来搞!