单片机实验:矩阵式键盘输入检测程序设计与实现

本实验将设计一个矩阵式键盘输入检测程序,使用单片机实现对 4x4 矩阵式键盘的输入识别,并通过 LED 指示灯或数码管显示按键值。

一、实验目的

  • 掌握矩阵式键盘的工作原理。
  • 学习使用单片机控制 LED 指示灯和数码管显示。
  • 练习汇编语言程序设计。

二、实验原理

矩阵式键盘由行线和列线构成,每个按键对应一个行线和一个列线。通过控制行线和列线的高低电平,可以识别按键是否被按下。

三、实验步骤

  1. 将矩阵式键盘连接到单片机上。
  2. 初始化端口,设置输入和输出方向。
  3. 循环检测键盘是否有按键按下。
  4. 如果有按键按下,则根据按键的值点亮相应的 LED 指示灯或者在数码管上显示按键的值。
  5. 等待一段时间后,清除 LED 指示灯或者数码管上的显示。

四、程序设计方法

  1. 设置端口方向和初始状态。
  2. 设计一个扫描函数,用来检测键盘是否有按键按下。
  3. 通过扫描函数检测到按键按下后,根据按键的值点亮 LED 指示灯或者在数码管上显示按键的值。
  4. 等待一段时间后,清除 LED 指示灯或者数码管上的显示。
  5. 循环执行扫描函数。

五、硬件原理图

见下图

六、流程图

见下图

七、汇编代码

; 矩阵式键盘输入检测程序

; 定义端口
KEY_PORT    equ P1      ; 键盘输入端口
LED_PORT    equ P2      ; LED 指示灯输出端口
DIG_PORT    equ P3      ; 数码管输出端口

; 定义常量
DELAY_TIME  equ 1000    ; 延时时间

; 初始化端口
    MOV     KEY_PORT, #0FFH  ; 设置端口为输入
    MOV     LED_PORT, #0     ; 设置 LED 输出端口为低电平
    MOV     DIG_PORT, #0     ; 设置数码管输出端口为低电平

; 扫描函数
SCAN:
    MOV     A, #0FH         ; 设置 A 寄存器为 0FH,用来检测列
    MOV     KEY_PORT, A     ; 将 A 寄存器的值输出到端口
    NOP                     ; 等待一段时间
    MOV     A, KEY_PORT     ; 读取键盘输入端口
    ANL     A, #0FH         ; 与 0FH 进行与运算,得到列的值
    CJNE    A, #0FH, SCAN   ; 如果列的值不等于 0FH,则表示有按键按下,跳转到处理函数

; 处理函数
PROCESS:
    MOV     C, #1           ; 设置进位标志为 1
    MOV     A, KEY_PORT     ; 读取键盘输入端口
    SUBB    A, #0F0H        ; 减去 0F0H,得到行的值
    JC      ROW1            ; 如果行的值小于等于 3,则跳转到 ROW1
    ADD     A, #4           ; 如果行的值大于 3,则加上 4,表示第二行
ROW1:
    MOV     R1, A           ; 将行的值保存到 R1 寄存器中
    MOV     A, #0FH         ; 设置 A 寄存器为 0FH,用来检测列
    MOV     KEY_PORT, A     ; 将 A 寄存器的值输出到端口
    NOP                     ; 等待一段时间
    MOV     A, KEY_PORT     ; 读取键盘输入端口
    SWAP    A               ; 将 A 寄存器的值左右交换
    ANL     A, #0FH         ; 与 0FH 进行与运算,得到列的值
    CJNE    A, #0FH, PROCESS ; 如果列的值不等于 0FH,则表示有按键按下,跳转到处理函数

; 处理按键值
    MOV     C, #1           ; 设置进位标志为 1
    MOV     A, KEY_PORT     ; 读取键盘输入端口
    SUBB    A, #0F0H        ; 减去 0F0H,得到行的值
    JC      ROW2            ; 如果行的值小于等于 3,则跳转到 ROW2
    ADD     A, #4           ; 如果行的值大于 3,则加上 4,表示第二行
ROW2:
    MOV     R0, A           ; 将行的值保存到 R0 寄存器中
    MOV     A, #0FH         ; 设置 A 寄存器为 0FH,用来检测列
    MOV     KEY_PORT, A     ; 将 A 寄存器的值输出到端口
    NOP                     ; 等待一段时间
    MOV     A, KEY_PORT     ; 读取键盘输入端口
    SWAP    A               ; 将 A 寄存器的值左右交换
    ANL     A, #0FH         ; 与 0FH 进行与运算,得到列的值
    MOV     R2, A           ; 将列的值保存到 R2 寄存器中
    MOV     A, R0           ; 将行的值移动到 A 寄存器中
    MOV     R3, #10         ; 将 R3 寄存器设置为 10,用来计算数码管显示值
    MUL     AB              ; 将行的值乘以 10
    ADD     A, R2           ; 加上列的值
    MOV     R2, A           ; 将结果保存到 R2 寄存器中

; 显示按键值
    MOV     A, R2           ; 将按键值移动到 A 寄存器中
    ANL     A, #0FH         ; 与 0FH 进行与运算,得到低四位
    MOV     LED_PORT, A     ; 将低四位输出到 LED 指示灯
    MOV     A, R2           ; 将按键值移动到 A 寄存器中
    DIV     AB              ; 将按键值除以 10,得到高位
    MOV     R1, A           ; 将高位保存到 R1 寄存器中
    MOV     A, R1           ; 将高位移动到 A 寄存器中
    ADD     A, #30H         ; 加上 30H,将其转换为 ASCII 码
    MOV     DIG_PORT, A     ; 将 ASCII 码输出到数码管
    ACALL   DELAY           ; 延时一段时间
    MOV     LED_PORT, #0     ; 清除 LED 指示灯
    MOV     DIG_PORT, #0     ; 清除数码管显示
    ACALL   DELAY           ; 延时一段时间
    SJMP    SCAN            ; 跳转到扫描函数

; 延时函数
DELAY:
    MOV     R4, #DELAY_TIME ; 将延时时间设置到 R4 寄存器中
DELAY_LOOP:
    DJNZ    R4, DELAY_LOOP  ; 延时循环
    RET

八、实验总结

通过本实验,我们学习了矩阵式键盘的工作原理,掌握了使用单片机控制 LED 指示灯和数码管显示的方法,并练习了汇编语言程序设计。

九、注意事项

  • 矩阵式键盘的连接方式要正确。
  • 单片机的端口配置要正确。
  • 汇编代码要严格按照语法规则编写。
  • 实验过程中要注意安全,避免触电或损坏设备。
单片机实验:矩阵式键盘输入检测程序设计与实现

原文地址: https://www.cveoy.top/t/topic/oidh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录