单片机键盘消抖,用延时消抖,汇编语言

单片机键盘消抖,用延时消抖,汇编语言,第1张

RESTART:

JB    START,$        ;第一次检测(检测的位置在抖动的过程中)

DELAY(延时程序)        延时消抖

JB    START,RESTART再次检测(检测位置在稳定阶段)

……

第一次检测有可能会检测到抖动的波峰“尖点”处,信号为1,此时第一条语句会原地踏步,不往下执行,直到检测到波谷“地点”处,信号为0,才开始执行第二条语句,调用延时子程序,延时子程序会持续一段时间(当然这时间自己定,带笑大概就行),来到第三条御羡语句,再次检测信号(稳定阶段),信号为0(前后检测一致),继续往下执行……如果第二次检测是高电平1,说明(①按键没有被按下,只是信号单纯地抖动而已)或者(②延时太短,第二次检测的位置还在前沿抖动阶段)或者(③延时太长,检测位置在后沿抖动阶段)此时就执行跳转回RESTART,继续重新扫描信号,看按键有没有被按下。

看了n多解释,没有一个是我(新手)觉得通俗易懂的,想了很久才恍然大悟,虽然是18年提出的镇行拍问题,还是希望能帮助到不理解的同学。不喜勿喷,谢谢!

在键数较少时可用硬件方法消除键抖动。上图所示的闹指升RS触发器为常用的硬件去抖。图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为0当键按下时,输出为1。此时即使用按键的机械性能,使按键因液老d性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。如果按键较多,常用软件方法去抖,逗高即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。一般来说,软件消抖的方法是不断检测按键值,直到按键值稳定。实现方法:假设未按键时输入1,按键后输入为0,抖动时不定。可以做以下检测:检测到按键输入为0之后,延时5ms~10ms,再次检测,如果按键还为0,那么就认为有按键输入。延时的5ms~10ms恰好避开了抖动期。

P1口接键盘进行扫描,P2口接数码管的位码,P0口接数码管的段码

ORG 0000H

LJMP START

ORG 0030H

START:

MOV 30H,#10H 第8个数码管显示数据缓存寄存器

MOV 31H,#10H 第7个数码管显示数据缓存寄存器

MOV 32H,#10H 第6个数码管显示数据缓存寄存器

MOV 33H,#10H 第5个数码管显示数据缓存寄存器

MOV 34H,#10H 第4个数码管显示数据缓存寄存器

MOV 35H,#10H 第3个数码管显示数据缓存寄存器

MOV 36H,#10H 第2个数码管显闭睁示数据缓存寄存器

MOV 37H,#10H 第1个数码管显示数据缓存寄存器

MAIN:

LCALL SAOMIAO 调用键盘扫描寄存器

LCALL DISPLAY 调用显示寄存器

LJMP MAIN

SAOMIAO:

MOV P1,#11111110B 将轿茄岁P1.4-P1.7口做为输入检测口,屏蔽P1.0-P1.3三行按键,扫描P0.0行的按键

JNB P1.4,A0第一行第一个按键被按下,则跳至A0

JNB P1.5,A1第一行第二个按键被按下,则跳至A1

JNB P1.6,A2第一行第三个按键被按下,则跳至A2

JNB P1.7,A3第一行第四个按键被按下,纳指则跳至A3

MOV P1,#11111101B 扫描P0.1接的第二行

JNB P1.4,A4第二行第一个按键被按下,则跳至A4

JNB P1.5,A5

JNB P1.6,A6

JNB P1.7,A7

MOV P1,#11111011B

JNB P1.4,A8

JNB P1.5,A9

JNB P1.6,A10

JNB P1.7,A11

MOV P1,#11110111B

JNB P1.4,A12

JNB P1.5,A13

JNB P1.6,A14

JNB P1.7,A15

RET

A0:

LJMP AN0 由于JNB指令的跳转范围仅为8位,所以用LJMP跳入按键处理子程序

A1:

LJMP AN1

A2:

LJMP AN2

A3:

LJMP AN3

A4:

LJMP AN4

A5:

LJMP AN5

A6:

LJMP AN6

A7:

LJMP AN7

A8:

LJMP AN8

A9:

LJMP AN9

A10:

LJMP AN10

A11:

LJMP AN11

A12:

LJMP AN12

A13:

LJMP AN13

A14:

LJMP AN14

A15:

LJMP AN15

AN0:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.4,AN0 按键消抖

MOV 3FH,#0 将按键值送入按键缓存寄存器

LJMP YIDONG调用移动子程序

AN1:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.5,AN1

MOV 3FH,#1

LJMP YIDONG

AN2:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.6,AN2

MOV 3FH,#2

LJMP YIDONG

AN3:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.7,AN3

MOV 3FH,#3

LJMP YIDONG

AN4:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.4,AN4

MOV 3FH,#4

LJMP YIDONG

AN5:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.5,AN5

MOV 3FH,#5

LJMP YIDONG

AN6:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.6,AN6

MOV 3FH,#6

LJMP YIDONG

AN7:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.7,AN7

MOV 3FH,#7

LJMP YIDONG

AN8:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.4,AN8

MOV 3FH,#8

LJMP YIDONG

AN9:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.5,AN9

MOV 3FH,#9

LJMP YIDONG

AN10:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.6,AN10

MOV 3FH,#10

LJMP YIDONG

AN11:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.7,AN11

MOV 3FH,#11

LJMP YIDONG

AN12:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.4,AN12

MOV 3FH,#12

LJMP YIDONG

AN13:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.5,AN13

MOV 3FH,#13

LJMP YIDONG

AN14:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.6,AN14

MOV 3FH,#14

LJMP YIDONG

AN15:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.7,AN15

MOV 3FH,#15

LJMP YIDONG

YIDONG: 移动子程序,将数码管数字向左移动一位

MOV 37H,36H

MOV 36H,35H

MOV 35H,34H

MOV 34H,33H

MOV 33H,32H

MOV 32H,31H

MOV 31H,30H

MOV 30H,3FH

RET

DISPLAY:

MOV DPTR,#TAB

MOV A,30H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11101111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,31H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11011111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,32H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#10111111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,33H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#01111111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,34H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111110B

LCALL DELAY

MOV DPTR,#TAB

MOV A,35H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111101B

LCALL DELAY

MOV DPTR,#TAB

MOV A,36H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111011B

LCALL DELAY

MOV DPTR,#TAB

MOV A,37H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11110111B

LCALL DELAY

RET

TAB:

DB 03H 9FH 25H 0DH 99H 49H 41H 1FH 03H到071H是表示0到F

DB 01H 19H 11H 0C1H 0E5H 85H 21H 71H

DB 0FFH“0”——“F”再加上不显示,一共十七个代码

DELAY:

MOV R6,#5

D1:

MOV R7,#255

DJNZ R7,$

DJNZ R6,D1

RET


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12516236.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存