单片机实验:矩阵式键盘输入检测程序设计与实现
单片机实验:矩阵式键盘输入检测程序设计与实现
本实验将设计一个矩阵式键盘输入检测程序,使用单片机实现对 4x4 矩阵式键盘的输入识别,并通过 LED 指示灯或数码管显示按键值。
一、实验目的
- 掌握矩阵式键盘的工作原理。
- 学习使用单片机控制 LED 指示灯和数码管显示。
- 练习汇编语言程序设计。
二、实验原理
矩阵式键盘由行线和列线构成,每个按键对应一个行线和一个列线。通过控制行线和列线的高低电平,可以识别按键是否被按下。
三、实验步骤
- 将矩阵式键盘连接到单片机上。
- 初始化端口,设置输入和输出方向。
- 循环检测键盘是否有按键按下。
- 如果有按键按下,则根据按键的值点亮相应的 LED 指示灯或者在数码管上显示按键的值。
- 等待一段时间后,清除 LED 指示灯或者数码管上的显示。
四、程序设计方法
- 设置端口方向和初始状态。
- 设计一个扫描函数,用来检测键盘是否有按键按下。
- 通过扫描函数检测到按键按下后,根据按键的值点亮 LED 指示灯或者在数码管上显示按键的值。
- 等待一段时间后,清除 LED 指示灯或者数码管上的显示。
- 循环执行扫描函数。
五、硬件原理图
见下图
六、流程图
见下图
七、汇编代码
; 矩阵式键盘输入检测程序
; 定义端口
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 著作权归作者所有。请勿转载和采集!