首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

单键的多次击键组合判别源程序(下)

单键的多次击键组合判别源程序(下)

;*************************************************************

; KEY EQU P1.0

; KEY_NUM EQU 20H

;*************************************************************

SREAD_KEY:

MOV KEY_NUM,#00H ;键值清0

JB KEY,SKEY_EXIT ;键未按下跳

CALL DL10MS  ;延时去抖动

JB KEY,SKEY_EXIT ;键未按下跳

MOV KEY_NUM,#1  ;置键值为#00000001B

SKEY_A:

MOV R0,#00H  ;清计数器

CLR C   ;清CY

SKEY_B:

CALL DL10MS

INC R0

MOV A,#50

SUBB A,R0

JC SKEY_C  ;当键按下>500MS跳

JNB KEY,SKEY_B  ;键未释放跳

CALL DL10MS  ;延时去抖动

JNB KEY,SKEY_B  ;键未释放跳

CLR C   ;CY置0

JMP SKEY_D

SKEY_C:

JNB KEY,$  ;键未释放停

CALL DL10MS  ;延时去抖动

JNB KEY,$  ;键未释放停

SETB C   ;CY置1

SKEY_D:   

MOV A,KEY_NUM

RLC A   ;键值左移一位,C->键值低位

MOV KEY_NUM,A

JB KEY_NUM.2,SKEY_EXIT ;判断按键检测是否完成,完成跳

;说明:KEY_NUM.1时只判断单次按键两种组合,KEY_NUM.2时可判断两次按键4种组合+单次按键的2种组合=6种,以此类推。

MOV R0,#00H  ;清计数器

CLR C   ;CY置0

SKEY_E:

CALL DL10MS

INC R0

MOV A,#70

SUBB A,R0

JC SKEY_EXIT  ;当未按下>700MS跳出

JB KEY,SKEY_E  ;键释放跳

CALL DL10MS  ;延时去抖动

JB KEY,SKEY_E  ;键释放跳

JMP SKEY_A  ;当未按下<700MS再次检测

SKEY_EXIT:

RET

;************************************************************   

;延时10mS   

;************************************************************   

DL10ms:

MOV R5,#14H  ;20              ;10.262ms=20*511+2*20+1=20.261   

TIME10MS_1:

MOV R6,#0FFH  ;255    ;511us=255*2+1   

DJNZ R6,$   

DJNZ R5,TIME10MS_1   

RET   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

END
返回列表