一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 1944|回复: 2

[其他综合] 我也发个单按,长按的按键扫描程序,汇编的

[复制链接]
发表于 2013-5-30 00:43 | 显示全部楼层 |阅读模式
有些注释不是很科学,见笑了,
我目前玩的是51,所以以下一些定义是以51为例的;

下面是位定义;
UP_KEY                        BIT    P1.0;     能提供弱上拉的IO口都行;不能提供弱上拉的话则外接上拉电阻;
KEY_UP_ON_ZT            BIT    20H.0;  单按状态;
KEY_UP_ONON_ZT       BIT    20H.1;  连按状态;
KEY_UP_TIME               EQU  21H;     进入连按时间寄存器,连按执行时间寄存器;
KEY_UP_LONG_TIME    EQU   50;       我原来的程序是定时器20ms中断里面执行按键扫描程序,长按1秒后进入连按状态;可根据需要随便修改;
KEY_UP_ADD_TIME      EQU   3;         连按速度;可根据需要随便调整;
;==========================================================
这个是按键复位子程序;上电后需要执行一次;
UP_KEY_RST:  CLR    KEY_UP_ON_ZT;
                       CLR    KEY_UP_ONON_ZT;
                       SETB  UP_KEY
                      MOV    KEY_UP_TIME,#KEY_UP_LONG_TIME;
                      RET
;===========================================================

以下是按键扫描程序;可作为一个子程序供调用,但要注意节拍时间;一般都是10ms-20ms;也可以作为一个程序段放到定时器中断内执行;按键大部分时间都是空闲的,这时只是执行了几句判断程序,不影响运行效率,
;==========UP按键=======================================================================================
UP_KEY:         JB UP_KEY,UP_KEY_ONON_EXIT;            没有按下(按下为零),则转移判断是按键松开还是未按下;  
;以下是按键按住时的判断程序;                 
                SETB KEY_UP_ON_ZT;;                                               按键有按下,置位单按状态;;               
                JB KEY_UP_ONON_ZT,UP_KEY_ONON;                        判断按键连按状态;如果是1,表示进入连按的状态;初始是0;
                DJNZ KEY_UP_TIME,GO_UP_KEY_EXIT   
                MOV KEY_UP_TIME,#KEY_UP_ADD_TIME;                    赋值连按速度;
                SETB KEY_UP_ONON_ZT;                                            成功进入连按状态;
;UP按键退出;               
GO_UP_KEY_EXIT:   
                或者跳到显示程序;
                或者JMP TIME_OUT;      在定时器中断内执行按键扫描程序时,可以直接到定时器退出;
                或者RET;                      ;按键扫描程序作为一个子程序时返回;
                或者JMP DOWN_KEY     ;继续判断down键;一般情况下加键和减键不会同时按的,所以可以不这样做;以提高效率;           
;====连按累加速度======               
UP_KEY_ONON:    DJNZ KEY_UP_TIME,GO_UP_KEY_EXIT;
                MOV KEY_UP_ADD_TIME,#KEY_UP_ADD_TIME;                  赋值连按速度;
;=========================================================
;执行长按处理程序;                 
               例:LCALL UP_KEY_DO;                       这句是执行单按一次的程序;按住不放时是连续执行单次按的程序;   

                JMP GO_UP_KEY_EXIT;                      这句要有;               
;=========================================================
;以下是按键未按下时的判断程序;判断是没有键按下;还是长按退出;还是短按退出;
;长按松键判断                                            
UP_KEY_ONON_EXIT:JNB KEY_UP_ONON_ZT,UP_KEY_ON_EXIT     ;判断长按标志位是否等于1,;
                 LCALL UP_KEY_RST;                     ;复位按键状态;这个一定要有;
;=========================================================
;执行长按退出功能程序;                 

                 例:LCALL SAVE......                              ;保存后退出

                 JMP GO_UP_KEY_EXIT                           或者不执行任何功能程序,退出;
;=========================================================
;单按松键判断   
UP_KEY_ON_EXIT:  JNB KEY_UP_ON_ZT,GO_UP_KEY_EXIT;;      判断单按标志位是否等于1,
                 LCALL UP_KEY_RST;                 ;    复位按键状态;这个也一定要有;   
;==============================================================
;执行单按处理程序(松开有效);
                例: LCALL UP_KEY_DO;                       执行单按功能程序;

                 JMP GO_UP_KEY_EXIT                     ;这句也要有
;==========================================================================================================
;==========================================================================================================

 楼主| 发表于 2013-5-30 00:47 | 显示全部楼层
如果要做多功能按键的话,就要加入按键指针,往往是几个按键组合,通过键序来改变指针,再根据指针的数值来跳转到对应的功能程序去执行,
回复

使用道具 举报

发表于 2013-5-30 14:29 | 显示全部楼层
汇编的看不懂了哟,
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-1 08:08 , Processed in 0.031887 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表