您的位置:首页单片机51单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

单片机控制的矩阵键盘扫描程序集

[日期:2008-08-21 ] [来源:net 作者:佚名] [字体: (投递新闻)
各种各样的矩阵键盘扫描程序集


矩阵键盘的扫描对初学者来说是不可避免的,然而也相对来说有点难度.

鉴于此,我整理了一下,我所遇到的矩阵键盘扫描程序集,将相继贴上来,供大家参考!

说明:这些大多都是网上转贴来的,其所有权归原作者!

谢谢合作.

最简单矩阵键盘扫描程序
key:MOV p0,#00001111b;上四位和下四位分别为行和列,所以送出高

低电压检查有没有按键按下
jmp k10;跳到K10处开始扫描,这里可以改成其它条件转移指令来决

定本次扫描是否要继续,例如减1为0转移或者位为1或0才转移,这主

要用来增加功能,确认上一按键功能是否完成?是否相当于经过了延

时?是否要封锁键盘?
goend:jmp kend;如果上面判断本次不执行键盘扫描程序,则立即转

到程序尾部,不要浪费CPU的时间
k10:jb p0.0,k20;扫描正式开始,先检查列1四个键是否有键按下,

如果没有,则跳到K20检查列2
k11:MOV p0,#11101111b;列1有键按下时,P0.0变低,到底是那一个键

按下?现在分别输出各行低电平
jb p0.0,k12;该行的键不按下时,p0.0为高电平,跳到到K12,检查其

它的行
MOV r1,#1;如果正好是这行的键按下,将寄存器R0写下1,表示1号键

按下了
k12:MOV p0,#11011111b
jb p0.0,k13
MOV r1,#2;如果正好是这行的键按下,将寄存器R0写下2,表示2号键

按下了
k13:MOV p0,#10111111b
jb p0.0,k14
MOV r1,#3;如果正好是这行的键按下,将寄存器R0写下3,表示3号键

按下了
k14:MOV p0,#01111111b
jb p0.0,kend;如果现在四个键都没有按下,可能按键松开或干扰,

退出扫描(以后相同)
MOV r1,#4如果正好是这行的键按下,将寄存器R0写下4,表示4号键

按下了
jmp kend;已经找到按下的键,跳到结尾吧

k20:jb p0.1,k30;列2检查为高电平再检查列3、4 
k21:MOV p0,#11101111b;列2有健按下时,P0.0会变低,到底是那一

行的键按下呢?分别输出行的低电平
jb p0.1,k22;该行的键不按下时p0.0为高电平,跳到到K22,检查另

外三行
MOV r1,#5;如果正好是这行的键按下,将寄存器R0写下5,表示5号键

按下了(以后相同,不再重复了)
k22:MOV p0,#11011111b
jb p0.1,k23
MOV r1,#6
k23:MOV p0,#10111111b
jb p0.1,k24
MOV r1,#7
k24:MOV p0,#01111111b
jb p0.1,kend
MOV r1,#8
jmp kend;已经找到按下的键,跳到结尾吧(以后相同,不要重复了



k30:jb p0.2,k40
k31:MOV p0,#11101111b
jb p0.2,k32
MOV r1,#9
k32:MOV p0,#11011111b
jb p0.2,k33
MOV r1,#10
k33:MOV p0,#10111111b
jb p0.2,k34
MOV r1,#11
k34:MOV p0,#01111111b
jb p0.2,kend
MOV r1,#12
jmp kend

k40:jb p0.3,kend
k41:MOV p0,#11101111b
jb p0.3,k42
MOV r1,#13
k42:MOV p0,#11011111b
jb p0.3,k43
MOV r1,#14
k43:MOV p0,#10111111b
jb p0.3,k44
MOV r1,#15
k44:MOV p0,#01111111b
jb p0.3,kend
MOV r1,#16
kend: ret

 

行列扫描键盘可检测出双键按下
#include <reg52.h>

#define ulong         unsigned long
#define uint        unsigned int
#define uchar         unsigned char

extern void delay(unsigned int x);

unsigned char Tab_key[]=        //行列式键盘映射
    {0x00,                        //无键按下
    ’’7’’,’’8’’,’’9’’,’’/’’,
    ’’4’’,’’5’’,’’6’’,’’*’’,
    ’’1’’,’’2’’,’’3’’,’’-’’,
    ’’C’’,’’0’’,’’=’’,’’+’’,
    //下面为按’’C’’同时再按的键:
    ’’7’’,’’8’’,’’9’’,’’/’’,
    ’’4’’,’’5’’,’’6’’,’’*’’,
    ’’1’’,’’2’’,’’3’’,’’-’’,
        ’’0’’,’’=’’,’’+’’,};

    //  P1口行列式键盘  //
#define KEYPIN_L  P1               // 定义键扫描列端口为 P1

低四位输入  //
#define KEYPIN_H  P1              // 定义键扫描行端口为 P1高

四位扫描输出  //
    //  P1口行列式键盘  //
    //公用函数
unsigned char KeysCAN(void);    //  键扫描函数            //
    //内部私有函数
unsigned char fnKeycode(unsigned char key);     //  根据键盘

映射表输出顺序键值            //
/*
    //  P1口行列式键盘  //
extern unsigned char KeysCAN(void);    //  键扫描函数        

    //
*/
    //  P1口行列式键盘  //
//---------------------------------------------------------

------------------//
unsigned char KeysCAN(void)                      //  键扫描

函数            //
{
    unsigned char sccode,recode,keytemp = 0;
    KEYPIN_L = KEYPIN_L|0x0f;                    //  P1低四

位为列线输入         //
    KEYPIN_H = KEYPIN_H&0x0f;                    //  P1高四

位为行线发全零扫描码 //
    if ((KEYPIN_L&0x0f) !=  0x0f)
        {
        delay(10);                                //  延时 

10 MS 消抖       //
        if ((KEYPIN_L&0x0f) !=  0x0f)
            {
            sccode = 0xef;                        //  逐行扫

描码初值(1110 1111)  //
            while(sccode !=  0xff)               //将扫描4次

,keytemp为每次键值相 或的值 //
                {
                KEYPIN_H = sccode;                 //  输出

行扫描码          //
                if ((KEYPIN_L&0x0f) !=  0x0f)    //  本行有

键按下          //
                    {
                    recode = (KEYPIN_L&0x0f)|0xf0;    //  只

要低位,高位置1  //
                    keytemp |=  (~sccode)+(~recode);    //特

征码(高位为列P3,低位为行KEYPIN_H)  //
                }
                sccode = (sccode << 1)|0x01;    //  扫描码0

向高位移动 //
            }
        }
    }
    KEYPIN_H = KEYPIN_H|0xf0;
    return(fnKeycode(keytemp));
}

//---------------------------------------------------------

------------------//
unsigned char fnKeycode(unsigned char key)     //  根据键盘

映射表输出顺序键值            //
    {
    switch(key)
        {
        case    0x11:                //   1 键  //
            key = 0x01;
            break;
        case    0x21:                //   2 键  //
            key = 0x02;
            break;
        case    0x41:                //   3 键  //
            key = 0x03;
            break;
        case    0x81:                //   4 键  //
            key = 0x04;
            break;
        case    0x12:                //   5 键  //
            key = 0x05;
            break;
        case    0x22:                //   6 键  //
            key = 0x06;
            break;
        case    0x42:                //   7 键  //
            key = 0x07;
            break;
        case    0x82:                //   8 键  //
            key = 0x08;
            break;
        case    0x14:                //   9 键  //
            key = 0x09;
            break;
        case    0x24:                //   10 键  //
            key = 0x0A;
            break;
        case    0x44:                //   11 键  //
            key = 0x0B;
            break;
        case    0x84:                //   12 键  //
            key = 0x0C;
            break;
        case    0x18:                //   13 键  //
            key = 0x0D;
            break;
        case    0x28:                //   14 键  //
            key = 0x0E;
            break;
        case    0x48:                //   15 键  //
            key = 0x0F;
            break;
        case    0x88:                //   16 键  //
            key = 0x10;
            break;
                    //以下为功能键//
        case    0x19:                //   ’’C’’ +1 键  //
            key = 0x11;
            break;
        case    0x29:                //   ’’C’’ +2 键  //
            key = 0x12;
            break;
        case    0x49:                //   ’’C’’ +3 键  //
            key = 0x13;
            break;
        case    0x89:                //   ’’C’’ +4 键  //
            key = 0x14;
            break;
        case    0x1A:                //   ’’C’’ +5 键  //
            key = 0x15;
            break;
        case    0x2A:                //   ’’C’’ +6 键  //
            key = 0x16;
            break;
        case    0x4A:                //   ’’C’’ +7 键  //
            key = 0x17;
            break;
        case    0x8A:                //   ’’C’’ +8 键  //
            key = 0x18;
            break;
        case    0x1C:                //   ’’C’’ +9 键  //
            key = 0x19;
            break;
        case    0x2C:                //   ’’C’’ +10 键  //
            key = 0x1A;
            break;
        case    0x4C:                //   ’’C’’ +11 键  //
            key = 0x1B;
            break;
        case    0x8C:                //   ’’C’’ +12 键  //
            key = 0x1C;
            break;
//        case    0x18:                //   ’’C’’ +13 键  //
//            key = 0x1D;
//            break;
        case    0x38:                //   ’’C’’ +14 键  //
            key = 0x1D;
            break;
        case    0x58:                //   ’’C’’ +15 键  //
            key = 0x1E;
            break;
        case    0x98:                //   ’’C’’ +16 键  //
            key = 0x1F;
            break;
        default     :                //   无键   //
            key = 0x00;
            break;
    }
    return(Tab_key[key]);
}    

 

矩键查寻键值44程序与显示
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#define uchar unsigned char
#define TURE 1
#define FALSE 0
int key;
int del;
void Tkey(void);
void led(void);


 /************主  程序*************/
void main(void)

  void tkey(void);
  void led(void);
  void delay(int);


  
  SCON=0x00;
  TI=0; 
  while(TURE)
  {
   Tkey();
   led();
   delay(2000);
  }

}




/********矩键查寻键值4*4程序******/按键为P1.0---P1.7
void Tkey(void)
{
  uchar readkey;//rereadkey;
  uchar x_temp,y_temp;
 

  P1=0x0f;
  x_temp=P1&0x0f;
  if(x_temp==0x0f) goto keyout;
  P1=0xf0;
  y_temp=P1&0xf0;
  readkey=x_temp|y_temp;
  readkey=~readkey;


switch(readkey)
    {
     case 0x11:key=0; break;
    case 0x21:key=1; break;
  case 0x41:key=2; break;
  case 0x81:key=3; break;
  case 0x12:key=4; break;
  case 0x22:key=5; break;
  case 0x42:key=6; break;
  case 0x82:key=7; break;
  case 0x14:key=8; break;
  case 0x24:key=9; break;
  case 0x44:key=10;break;
  case 0x84:key=11;break;
  case 0x18:key=12;break;
  case 0x28:key=13;break;
  case 0x48:key=14;break;
  case 0x88:key=15;break;
  default:  key=16;break;
    }

keyout:_nop_();
}



/************显示程序*************/
void led(void)
{uchar code LEDValue[]=

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  //0-9
 uchar data num[6];
 uchar k;
num[0]=0;
num[1]=0;
num[2]=0;
num[3]=0;
num[4]=key/10;
num[5]=key-(key/10)*10;

 for(k=0;k<=5;k++)
 {
   SBUF=LEDValue[num[5-k]];
   while(TI==0);
   TI=0;
 }
}



 
/************延时程序*************/
void delay(del)
{
 for(del;del>0;del--); 
12下一页  GO
阅读:
录入:petta

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐