注意:访问本站需要Cookie和JavaScript支持!请设置您的浏览器! 打开购物车 查看留言付款方式联系我们
初中电子 单片机教材一 单片机教材二
搜索上次看见的商品或文章:
商品名、介绍 文章名、内容
首页 电子入门 学单片机 免费资源 下载中心 商品列表 象棋在线 在线绘图 加盟五一 加入收藏 设为首页
本站推荐:
14. 4×4矩阵式键盘识别技术
文章长度[] 加入时间[2008/5/30] 更新时间[2024/12/4 4:11:11] 级别[0] [评论] [收藏]
 
1. 实验任务

如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示
0
4       
8
C
1
5
9
D
2
6
A
E
3
7
B
F
 

 
图4.14.1
2. 硬件电路原理图
 
 
图4.14.2
3. 系统板上硬件连线
(1.       把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
(2.       把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
4.  程序设计内容
(1.       4×4矩阵键盘识别处理
(2.       每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
5. 程序框图

 
P3=FFH,P3.0=0
有键按下吗?
 
延时10ms
真得有键按下吗?
 
根据当前状态识别按键
 
P3=FFH,P3.1=0
有键按下吗?
 
延时10ms
真得有键按下吗?
 
根据当前状态识别按键
 
P3=FFH,P3.2=0
有键按下吗?
 
延时10ms
真得有键按下吗?
 
根据当前状态识别按键
 
P3=FFH,P3.3=0
有键按下吗?
 
延时10ms
真得有键按下吗?
 
根据当前状态识别按键

图4.14.3
6. 汇编源程序
KEYBUF    EQU 30H
            ORG 00H
START:      MOV KEYBUF,#2
WAIT:  
            MOV P3,#0FFH
            CLR P3.4
            MOV A,P3
            ANL A,#0FH 
            XRL A,#0FH
            JZ NOKEY1
            LCALL DELY10MS
            MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JZ NOKEY1
            MOV A,P3
            ANL A,#0FH
            CJNE A,#0EH,NK1
            MOV KEYBUF,#0
            LJMP DK1
NK1:        CJNE A,#0DH,NK2
            MOV KEYBUF,#1
            LJMP DK1
NK2:        CJNE A,#0BH,NK3
            MOV KEYBUF,#2
            LJMP DK1
NK3:        CJNE A,#07H,NK4
            MOV KEYBUF,#3
            LJMP DK1
NK4:        NOP
DK1:   
            MOV A,KEYBUF
            MOV DPTR,#TABLE
            MOVC A,@A+DPTR
            MOV P0,A
DK1A:       MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JNZ DK1A
NOKEY1:
            MOV P3,#0FFH
            CLR P3.5
            MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JZ NOKEY2
            LCALL DELY10MS
            MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JZ NOKEY2
            MOV A,P3
            ANL A,#0FH
            CJNE A,#0EH,NK5
            MOV KEYBUF,#4
            LJMP DK2
NK5:        CJNE A,#0DH,NK6
            MOV KEYBUF,#5
            LJMP DK2
NK6:        CJNE A,#0BH,NK7
            MOV KEYBUF,#6
            LJMP DK2
NK7:        CJNE A,#07H,NK8
            MOV KEYBUF,#7
            LJMP DK2
NK8:        NOP
DK2:   
            MOV A,KEYBUF
            MOV DPTR,#TABLE
            MOVC A,@A+DPTR
            MOV P0,A
DK2A:       MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JNZ DK2A
NOKEY2:
            MOV P3,#0FFH
            CLR P3.6
            MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JZ NOKEY3
            LCALL DELY10MS
            MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JZ NOKEY3
            MOV A,P3
            ANL A,#0FH
            CJNE A,#0EH,NK9
            MOV KEYBUF,#8
            LJMP DK3
NK9:        CJNE A,#0DH,NK10
            MOV KEYBUF,#9
            LJMP DK3
NK10:       CJNE A,#0BH,NK11
            MOV KEYBUF,#10
            LJMP DK3
NK11:       CJNE A,#07H,NK12
            MOV KEYBUF,#11
            LJMP DK3
NK12:       NOP
DK3:
            MOV A,KEYBUF
            MOV DPTR,#TABLE
            MOVC A,@A+DPTR
            MOV P0,A
DK3A:       MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JNZ DK3A
NOKEY3:
            MOV P3,#0FFH
            CLR P3.7
            MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JZ NOKEY4
            LCALL DELY10MS
            MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JZ NOKEY4
            MOV A,P3
            ANL A,#0FH
            CJNE A,#0EH,NK13
            MOV KEYBUF,#12
            LJMP DK4
NK13:       CJNE A,#0DH,NK14
            MOV KEYBUF,#13
            LJMP DK4
NK14:       CJNE A,#0BH,NK15
            MOV KEYBUF,#14
            LJMP DK4
NK15:       CJNE A,#07H,NK16
            MOV KEYBUF,#15
            LJMP DK4
NK16:       NOP
DK4:   
            MOV A,KEYBUF
            MOV DPTR,#TABLE
            MOVC A,@A+DPTR
            MOV P0,A
DK4A:       MOV A,P3
            ANL A,#0FH
            XRL A,#0FH
            JNZ DK4A
NOKEY4:
            LJMP WAIT
DELY10MS:
            MOV R6,#10
D1:         MOV R7,#248
            DJNZ R7,$
            DJNZ R6,D1
            RET
TABLE:      DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
            DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
            END
7. C语言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
                            0x66,0x6d,0x7d,0x07,
                            0x7f,0x6f,0x77,0x7c,
                            0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;
void main(void)
{
  while(1)
    {
      P3=0xff;
      P3_4=0;
      temp=P3;
      temp=temp & 0x0f;
      if (temp!=0x0f)
        {
          for(i=50;i>0;i--)
          for(j=200;j>0;j--);
          temp=P3;
          temp=temp & 0x0f;
          if (temp!=0x0f)
            {
              temp=P3;
              temp=temp & 0x0f;             
              switch(temp)
                {
                  case 0x0e:
                    key=7;
                    break;
                  case 0x0d:
                    key=8;
                    break;
                  case 0x0b:
                    key=9;
                    break;
                  case 0x07:
                    key=10;
                    break;
                }
              temp=P3;
              P1_0=~P1_0;
              P0=table[key];
              temp=temp & 0x0f;             
              while(temp!=0x0f)
                {
                  temp=P3;
                  temp=temp & 0x0f;             
                }
            }
        }
      P3=0xff;
      P3_5=0;
      temp=P3;
      temp=temp & 0x0f;
      if (temp!=0x0f)
        {
          for(i=50;i>0;i--)
          for(j=200;j>0;j--);
          temp=P3;
          temp=temp & 0x0f;
          if (temp!=0x0f)
            {
              temp=P3;
              temp=temp & 0x0f;             
              switch(temp)
                {
                  case 0x0e:
                    key=4;
                    break;
                  case 0x0d:
                    key=5;
                    break;
                  case 0x0b:
                    key=6;
                    break;
                  case 0x07:
                    key=11;
                    break;
                }
              temp=P3;
              P1_0=~P1_0;
              P0=table[key];
              temp=temp & 0x0f;             
              while(temp!=0x0f)
                {
                  temp=P3;
                  temp=temp & 0x0f;             
                }
            }
        }
      P3=0xff;
      P3_6=0;
      temp=P3;
      temp=temp & 0x0f;
      if (temp!=0x0f)
        {
          for(i=50;i>0;i--)
          for(j=200;j>0;j--);
          temp=P3;
          temp=temp & 0x0f;
          if (temp!=0x0f)
            {
              temp=P3;
              temp=temp & 0x0f;             
              switch(temp)
                {
                  case 0x0e:
                    key=1;
                    break;
                  case 0x0d:
                    key=2;
                    break;
                  case 0x0b:
                    key=3;
                    break;
                  case 0x07:
                    key=12;
                    break;
                }
              temp=P3;
              P1_0=~P1_0;
              P0=table[key];
              temp=temp & 0x0f;             
              while(temp!=0x0f)
                {
                  temp=P3;
                  temp=temp & 0x0f;             
                }
            }
        }
      P3=0xff;
      P3_7=0;
      temp=P3;
      temp=temp & 0x0f;
      if (temp!=0x0f)
        {
          for(i=50;i>0;i--)
          for(j=200;j>0;j--);
          temp=P3;
          temp=temp & 0x0f;
          if (temp!=0x0f)
            {
              temp=P3;
              temp=temp & 0x0f;             
              switch(temp)
                {
                  case 0x0e:
                    key=0;
                    break;
                  case 0x0d:
                    key=13;
                    break;
                  case 0x0b:
                    key=14;
                    break;
                  case 0x07:
                    key=15;
                    break;
                }
              temp=P3;
              P1_0=~P1_0;
              P0=table[key];
              temp=temp & 0x0f;             
              while(temp!=0x0f)
                {
                  temp=P3;
                  temp=temp & 0x0f;             
                }
            }
        }
    }
}
1、 本站不保证以上观点正确,就算是本站原创作品,本站也不保证内容正确。
2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉! 以上可能是本站收集或者转载的文章,本站可能没有文章中的元件或产品,如果您需要类似的商品请 点这里查看商品列表!
本站协议 | 版权信息 |  关于我们 |  本站地图 |  营业执照 |  发票说明 |  付款方式 |  联系方式
深圳市宝安区西乡五壹电子商行——粤ICP备16073394号-1;地址:深圳西乡河西四坊183号;邮编:518102
E-mail:51dz$163.com($改为@);Tel:(0755)27947428
工作时间:9:30-12:00和13:30-17:30和18:30-20:30,无人接听时可以再打手机13537585389