矩阵键盘编程消除抖动用汇编语言
时间: 2023-07-11 11:47:20 浏览: 112
矩阵键盘编程中消除抖动的方法可以使用汇编语言实现。下面是一个简单的示例:
```
ORG 100H ;将程序起始地址设置为0x100
MOV P1,#0FFH ;将P1口设为输入
AGAIN: MOV A,P1 ;读取P1口状态
ANL A,#0F0H ;仅保留高四位
JZ AGAIN ;如果高四位为0,则继续循环
;这里是抖动消除的代码
;...
SJMP AGAIN ;跳回到循环开始处
```
以上代码中,首先将P1口设为输入,然后循环读取P1口状态,仅保留高四位并判断是否为0,如果高四位为0则继续循环。如果高四位不为0,则执行抖动消除的代码。最后跳回到循环开始处继续读取P1口状态。
抖动消除的代码可以使用延时等方法,例如连续读取多次P1口状态并进行比较,如果多次读取结果相同则认为是一个有效的按键事件。具体的实现方法可以根据实际情况进行调整。
相关问题
汇编语言实现在数码管上显示键值 0~F,矩阵键盘编程,消抖动,数码管段码显示编程。数码管显示和消抖动部分采用子程序调用实现。
好的,以下是使用汇编语言实现在数码管上显示键值 0~F,矩阵键盘编程,消抖动,数码管段码显示编程的代码示例。这里假设使用的是4行4列的矩阵键盘和4位共阳数码管。
```
ORG 0x0000 ; 程序入口地址
ROW_NUM EQU 4 ; 矩阵键盘行数
COL_NUM EQU 4 ; 矩阵键盘列数
MS EQU 10 ; 消抖动延时时间,单位为ms
TIMES EQU 5 ; 消抖动读取次数
key_value DB 0 ; 存储键值
segment_code DB 0 ; 存储段码
; 主程序入口
START:
MOV SP, #0x7F ; 初始化栈指针,栈空间大小为128字节
CALL INIT ; 初始化IO口和定时器
B MAIN_LOOP ; 进入主循环
; 初始化IO口和定时器
INIT:
; 初始化IO口
; ...
; 初始化定时器
; ...
RET
; 主循环
MAIN_LOOP:
; 矩阵键盘扫描和键值读取
MOV R0, #0
MOV R1, #0
SCAN_KEY:
CMP R0, ROW_NUM
BEQ END_SCAN
; 将第R0行设置为高电平,其他行设置为低电平
; ...
MOV R1, #0
CHECK_COL:
CMP R1, COL_NUM
BEQ NEXT_ROW
; 判断当前列是否有键被按下
; ...
CMP R2, #KEY_DOWN
BNE NEXT_COL
; 消抖动处理
CALL DEBOUNCE
; 数码管显示
CALL DISPLAY
NEXT_COL:
ADD R1, #1
B CHECK_COL
NEXT_ROW:
; 将第R0行设置为低电平
; ...
ADD R0, #1
B SCAN_KEY
END_SCAN:
B MAIN_LOOP
; 消抖动处理子程序
DEBOUNCE:
MOV R3, #0
MOV R4, #0
DEBOUNCE_LOOP:
CMP R4, #TIMES
BEQ DEBOUNCE_END
CALL GET_KEY_VALUE
ADD R3, R3, R0
CALL DELAY_MS
ADD R4, #1
B DEBOUNCE_LOOP
DEBOUNCE_END:
MOV key_value, R3
MOV R0, R3
RET
; 数码管显示子程序
DISPLAY:
; 查表法获取段码
CALL GET_SEGMENT_CODE
MOV segment_code, R0
; 输出段码到数码管
; ...
RET
; 获取键值
; R0: 列数
; R1: 行数
; 返回值: R0存储键值
GET_KEY_VALUE:
; ...
RET
; 延时函数,延时时间为R0*MS,单位为ms
DELAY_MS:
; ...
RET
; 获取键值对应的段码
; R0: 键值
; 返回值: R0存储段码
GET_SEGMENT_CODE:
; ...
RET
END
```
以上是一个简单的汇编语言代码示例,具体的实现方式和硬件环境有关,可能需要根据实际情况进行调整。希望能对您有所帮助。
矩阵键盘编程keil代码,带有防抖的
以下是一个使用 Keil μVision 编写的带有防抖功能的矩阵键盘驱动程序代码示例:
```c
#include <reg52.h>
// 定义行列数
#define ROWS 4
#define COLS 4
// 定义行列引脚
sbit row1 = P2^0;
sbit row2 = P2^1;
sbit row3 = P2^2;
sbit row4 = P2^3;
sbit col1 = P2^4;
sbit col2 = P2^5;
sbit col3 = P2^6;
sbit col4 = P2^7;
// 定义键盘矩阵
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// 延时函数
void delay(unsigned int n) {
unsigned int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 125; j++);
}
}
// 扫描键盘矩阵
char scan_keypad() {
char key = ' ';
row1 = 0; row2 = 1; row3 = 1; row4 = 1;
if (col1 == 0) { delay(10); if (col1 == 0) { key = keys[0][0]; } }
if (col2 == 0) { delay(10); if (col2 == 0) { key = keys[0][1]; } }
if (col3 == 0) { delay(10); if (col3 == 0) { key = keys[0][2]; } }
if (col4 == 0) { delay(10); if (col4 == 0) { key = keys[0][3]; } }
row1 = 1; row2 = 0; row3 = 1; row4 = 1;
if (col1 == 0) { delay(10); if (col1 == 0) { key = keys[1][0]; } }
if (col2 == 0) { delay(10); if (col2 == 0) { key = keys[1][1]; } }
if (col3 == 0) { delay(10); if (col3 == 0) { key = keys[1][2]; } }
if (col4 == 0) { delay(10); if (col4 == 0) { key = keys[1][3]; } }
row1 = 1; row2 = 1; row3 = 0; row4 = 1;
if (col1 == 0) { delay(10); if (col1 == 0) { key = keys[2][0]; } }
if (col2 == 0) { delay(10); if (col2 == 0) { key = keys[2][1]; } }
if (col3 == 0) { delay(10); if (col3 == 0) { key = keys[2][2]; } }
if (col4 == 0) { delay(10); if (col4 == 0) { key = keys[2][3]; } }
row1 = 1; row2 = 1; row3 = 1; row4 = 0;
if (col1 == 0) { delay(10); if (col1 == 0) { key = keys[3][0]; } }
if (col2 == 0) { delay(10); if (col2 == 0) { key = keys[3][1]; } }
if (col3 == 0) { delay(10); if (col3 == 0) { key = keys[3][2]; } }
if (col4 == 0) { delay(10); if (col4 == 0) { key = keys[3][3]; } }
return key;
}
int main() {
char key = ' ';
while (1) {
key = scan_keypad();
if (key != ' ') {
// 处理按键事件
}
delay(10);
}
return 0;
}
```
以上代码在扫描按键时加入了延时和防抖功能,可以有效避免按键抖动造成的误触。具体实现可以根据实际需要进行修改。