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

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

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

由于在学习用DS1302来做LED时钟时,发现开发板附的程序对按键操作,很不灵活,后来在网上找到一篇《一个按键的多次击键组合判别技巧》;C51汇编的参考程序,经学习摸索已改成C51汇编了,并已用XL400 单片;

;以下主程序演示了不同组合按键时,分别控制P2.0-P2.5各端口的LED灯的亮灭。

;单次短击=>P2.0/LED1

;单次长击=>P2.1/LED2

;短击+短击=>P2.2/LED3

;短击+长击=>P2.3/LED4

;长击+短击=>P2.4/LED5

;长击+长击=>P2.5/LED6  

;------------------------------------------------------------

ORG 0040H

AJMP MAIN

MAIN:

MOV P1,#0FFH

MOV P2,#0FFH   ;初始化端口

LOOP:

CALL SREAD_KEY   ;读单按键--子程序

MOV R0,KEY_NUM  

CJNE R0,#00000010B,MAIN1 ;比较键值不等跳

     CPL LED1_6.0   ;取反P2.0

MAIN1:

CJNE R0,#00000011B,MAIN2 ;比较键值不等跳

CPL LED1_6.1   ;取反P2.1

MAIN2:

CJNE R0,#00000100B,MAIN3 ;比较键值不等跳

     CPL LED1_6.2   ;取反P2.2

MAIN3:

CJNE R0,#00000101B,MAIN4 ;比较键值不等跳

CPL LED1_6.3   ;取反P2.3

MAIN4:

CJNE R0,#00000110B,MAIN5 ;比较键值不等跳

CPL LED1_6.4   ;取反P2.4

MAIN5:

CJNE R0,#00000111B,MAIN_EXIT ;比较键值不等跳

CPL LED1_6.5   ;取反P2.5

MAIN_EXIT:

JMP LOOP

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

;读单按键--子程序

;子程序执行后返回值KEY_NUM即键值

;-----------------------------说明----------------------------

;短击:键按下时间<500MS

;长击:键按下时间>500MS

;两次按键间隔时间<700MS

;键值定义:

;KEY_NUM="00000000":  无键按下

;KEY_NUM="00000001":  无意义

;KEY_NUM="00000010":  单次短击

;KEY_NUM="00000011":  单次长击

;KEY_NUM="00000100":  短击+短击

;KEY_NUM="00000101":  短击+长击

;KEY_NUM="00000110":  长击+短击

;KEY_NUM="00000111":  长击+长击

;KEY_NUM="00001000":  短击+短击+短击

;KEY_NUM="00001001":  短击+短击+长击

;KEY_NUM="00001011":  短击+长击+长击

;KEY_NUM="00001111":  长击+长击+长击

;以编码从左看起第一个1看作为分界线,左边为0、而右边的0和1表示为:

;0短击1长击。

;以上组合已足够用了!
返回列表