2025年4月18日  星期五
教学科研

教学科研

当前位置: 学院首页 >> 教学科研 >> 正文

单片机实验指导——阵列式键盘实验..

发布日期:2012-09-05    作者:     来源:     点击:

阵列式键盘实验

一、实验目的

1、掌握键盘和显示器的接口方法和编程方法

2、掌握阵列式键盘的硬件组成和软件编程方法

二、实验说明

本实验提供了一个4X4小建盘,向P0口的低四位逐个输出低电平,如果有键盘按下,则相应输出为低,如果没有键按下,则输出为高。通过输出的列码和读取的行码来判断按下什么键。有键按下后,要有一定的延时,防止由于键盘抖动而引起误操作。

三、实验步骤及内容

1、用一根8位数据线连接阵列式键盘实验模块与LED与单片机接口模块。无键按下或有键按下,发光二极管全亮。若将A1-A4接地,则发光二极管显示0000XXXX;B1线上有键按下,则发光二极管显示0000XXX,B2线上有键按下,则发光二极管现世0000X0XX,B1和B2均有键按下,则发光二极管显示000000XX……同样可将B1与B4接地,按键与发光二极管显示情况,用户可以自行判断,自由操作。

2、用一根8位数据线连接阵列式键盘实验模块与扫描显示实验模块。无键按下或有键按下,八段LED全亮。用户参照1,观察键盘与八段LED亮熄的关系。

3、使用静态串行显示模块显示键值。单片机最小应用系统1的 P1口接阵列式键盘的A1~B4口, P3.6接静态数码显示DIN,P3.7接CLK。

4、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。

5、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加 阵列KEY.ASM源程序,进行编译,直到编译无误。

6、进行软件设置,选择硬件仿真,选择串行口,设置波特率为38400。在键盘上按下某个键,观察数显是否与按键值一致。16位建盘的键值从左至右、从上至下依次为0~F(16进制数)。

四、流程图及源程序

2、源程序

        DBUF   EQU   30H

TEMP   EQU   40H

DIN    BIT   P3.6

CLK    BIT   P3.7

ORG    0000H

LJMP   START

ORG    0030H

START:MOV    A,#16

MAIN:   ACALL  DISP

  MOV    30H, A

 ACALL  KEY1

        AJMP   MAIN

KEY1:   MOV    P1, #0FH             ;A1-A4输出,B1-B4输入,输

                                    ;入者对应锁存先写  “1”

        MOV    A, P1                ;读取键盘状况

        CJNE   A,#0FH, K11          ;有键按下

K10:    AJMP   KEY1                 ;无键按下

K11:    ACALL  DELAY                ;去抖动

        MOV    P1, #0FH   

        MOV    A, P1                ;再读键盘状况

        CJNE   A, #0FH, K12         ;确有键盘按下

        SJMP   K10                  ;误动作

K12:    MOV    B,A                  ;存列值

        MOV    P1, #0EFH            ;按键在Ai行

        MOV    A, P1

        CJNE   A, #0EFH,K13         ;键在A4

        MOV    P1, #0DFH

        MOV    A, P1

        CJNE   A, #0DFH,K13         ;键在A3行

        MOV    P1, #0BFH

        MOV    A,P1

        CJNE   A, #0BFH,K13         ;键在A2行

        MOV    P1, #7FH

        MOV    A, P1

        CJNE   A,#7FH, K13             ;键在A1行

        AJMP   K10                     ;多键同时按下

K13:    ANL    A, #0F0H                ;的行值

        ORL    A, B                    ;的按下键的行列值

        MOV    B, A                    ;暂存键值

        MOV    R1, #16                 ;16个键

        MOV    R2, #0                  ;键码初值

        MOV    DPTR,#K1TAB             ;键码表首址

K14:    MOV    A,R2

        MOVC   A, @A+DPTR              ;从键值表中取键值

        CJNE   A, B, K16               ;与按下键,键值比较

        MOV    P1,#0FH                 ;相等,则完成以下步骤

K15:    MOV    A, P1

        CJNE   A, #0FH, K15            ;等释放

        ACALL  DELAY                   ;去抖动

        MOV    A, R2                   ;得键码

        RET

K16:    INC    R2                      ;不相等,则继续访问键值表

        DJNZ   R1,K14

        AJMP   K10                     ;多键同时按下处理

K1TAB:  DB     0EEH, 0DEH, 0BEH, 07EH  ;键值表

        DB     0EDH, 0DDH, 0BDH, 07DH

        DB     0EBH, 0DBH, 0BBH, 07BH

        DB     0E7H, 0D7H, 0B7H, 077H

DISP:   MOV    DBUF,A

        MOV    DBUF+1,#16

        MOV    DBUF+2,#16

        MOV   DBUF+3,#16

        MOV   DBUF+4,#16

        MOV   R0,  #DBUF

        MOV   R1,  #TEMP

        MOV   R2,  #5

 DP10:  MOV   DPTR,#SEGTAB

        MOV   A,   @R0

        MOVC  A,   @A+DPTR

        MOV   @R1, A

        INC   R0

        INC   R1

        DJNZ  R2,  DP10

        MOV   R0,  #TEMP

        MOV   R1,  #5

 DP12:  MOV   R2,  #8

        MOV   A,   @R0

 DP13:  RLC   A

        MOV   0B0H,C

        CLR   0B1H 

        SETB  0B1H 

        DJNZ  R2,  DP13

        INC   R0

        DJNZ  R1,  DP12

        RET

SEGTAB:                                  ;段码表

DB     3FH,06H,5BH,4FH,66H,6DH   ;“0,1,2,3,4,5”

        DB     7DH,07H,7FH,6FH,77H,7CH   ;“6,7,8,9,A,b”

        DB     58H,5EH,79H,71H,00H,40H   ;“C,d,E,F, ,-”

DELAY:  MOV    R4, #02H

AA1:    MOV    R5,#0F8H

AA:     NOP

        DJNZ    R5,AA

        DJNZ    R4,AA1

        RET

END

五、思考题

1、 字符与段码的软件实验程序已很清楚,问LED数码显示器是共阴极还是共阳极,对SEGTAB的影响如何?

2、 程序如何确保每按一次键,只处理一次。