⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rd_usekey.s

📁 LCD1602键盘显示模块实例
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module RD_UseKey.c
	.area text(rom, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_g_cReturnKeyNum::
	.blkb 1
	.area idata
	.byte 255
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_g_cReturnLongPressKeyNum::
	.blkb 1
	.area idata
	.byte 255
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_g_wKeyPressTimeCounter::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_g_wKeyPressDelayCounter::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_s_cKeyBUFFCounter:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_s_cKeyBUFFHeadPoint:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_s_cKeyBUFFTailPoint:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_s_cLongKeyPressNum:
	.blkb 1
	.area idata
	.byte 255
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
_s_cKeyNum:
	.blkb 1
	.area idata
	.byte 255
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
L2:
	.blkb 1
	.area idata
	.byte 255
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
L3:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
L4:
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
	.area text(rom, con, rel)
	.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
	.dbfunc s _Key_Scan __Key_Scan fV
	.dbsym s LongPressAcceleration L4 i
	.dbsym s IfLongKeyPress L3 c
	.dbsym s OldKeyCode L2 c
;    NowKeyCode0 -> R20
	.even
__Key_Scan:
	st -y,R20
	.dbline -1
	.dbline 179
; /***********************************************************
; *   函数库说明:按键处理函数库                             *
; *   版本:      v2.00                                      *
; *   作者:      傻孩子                                     *
; *   创建日期:  2005年11月27日                             *
; * -------------------------------------------------------- *
; *  [支 持 库]                                              *
; *   支持库名称:RD_MacroAndConst.h                         *
; *   需要版本:  v0.01 &abv                                 *
; *   支持库说明:系统常用宏定义库                           *
; *                                                          *
; *   支持库名称:RD_UseKey.h                                *
; *   需要版本:  ----                                       *
; *   支持库说明:按键处理声明库                             *
; * -------------------------------------------------------- *
; *  [版本更新]                                              *
; *   修改:      傻孩子                                     *
; *   修改日期:  2006年4月15日                              *
; *   版本:      v1.3                                       *
; *                                                          *
; *   修改:      傻孩子                                     *
; *   修改日期:  2006年4月23日                              *
; *   版本:      v1.31                                      *
; *                                                          *
; *   修改:      傻孩子                                     *
; *   修改日期:  2006年5月5日                               *
; *   版本:      v1.32                                      *
; *                                                          *
; *   修改:      王卓然                                     *
; *   修改日期:  2007年2月25日                              *
; *   版本:      v2.00                                      *
; * -------------------------------------------------------- *
; *  [版本历史]                                              *
; *     v1.3以下  1、提供了对键盘缓冲区的支持。              *
; *               2、支持长按键处理。                        *
; *               3、需要外部提供一个毫秒级的延时计数器。    *
; *               4、需要外部提供一个有返回值得键盘扫描      *
; *                  函数,该函数需要做基本的去抖。          *
; *               5、可以外部定义缓冲区大小,空键值。        *
; *               6、增加了一个入口键盘扫描码的噪声抑制参    *
; *                 KEY_PRESS_DELAY,该值为毫秒级的单向      *
; *                 递减数值,即如果值不为零,则减到0为。    *
; *                 如果键盘响应过于迟钝,可以适当改小该     *
; *                 参数值。                                 *
; *     v1.3      修改了头文件的组织形式,对外的接口模式     *
; *               对一些时间计数器进行了分类和统一宏定义     *
; *               允许外部通过宏定义将这些接口连接到实际     *
; *               的计数器上。同时兼容从前的版本。           *
; *     v1.31     修正了按键去抖计数器会干扰外部单向计数     *
; *               器的错误。                                 *
; *     v1.32     允许选择自动刷新按键和手动刷新按键两种模式 *
; *     v2.00     支持长按键以重复的间隔触发。               *
; * -------------------------------------------------------- *
; *  [说明]                                                  *
; *            1、在外部合适的位置(毫秒中断程序)增加         *
; *               USEKEY_INSERT_MS_TIMER_OVF_ISR_CODE来保证  *
; *               头文件的正常使用。                         *
; *            2、可以通过定义KEY_BUFF_SIZE来设置键盘缓冲区  *
; *               的大小。                                   *
; *            3、可以通过定义KEY_PRESS_DELAY来设置去抖得    *
; *               时间常数。                                 *
; *            4、可以通过_USE_KEY_PRESS_SCAN_FUNC_INTERFACE *
; *               来连接用于键盘扫描的函数。该函数必须返回   *
; *               扫描码。                                   *
; *            5、通过GetKeyCode()函数来获得缓冲区状态,当   *
; *               该函数返回True时,可以从ReturnKeyNum和     *
; *               ReturnLongPressKeyNum中分别获取按键和长    *
; *               按键的扫描码,两个值不能同时不为KeyNull    *
; *            6、允许通过_USE_KEY_MANUL_REFRESH来选择自动刷 *
; *               新按键缓冲区的模式。                       *
; *            7、可以通过宏_USE_KEY_LONG_PRESS_DELAY_TIME来 *
; *               定义长按键的最小判定时间。                 *
; *            9、可以通过宏_USE_KEY_LONG_PRESS_REPEAT来打开 *
; *               长按键重复触发功能。                       *
; *            8、宏_USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL可  *
; *               以用来设定长按键时重复触发的最小时间间隔等 *
; *               级。取值范围是0至4,数值越大,时间间隔越小 *
; *               默认情况下为2,即一秒钟重复4次。           *
; ***********************************************************/
; 
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "LIB_Config.h"
; # include "RD_UseKey.h"
; 
; /********************
; *   系 统 宏 定 义  *
; ********************/
; 
; 
; /*------------------*
; *   常 数 宏 定 义  *
; *------------------*/
; #ifndef KEY_BUFF_SIZE
;     # define KEY_BUFF_SIZE     8
; #endif
; #ifndef KEY_NULL
;     # define KEY_NULL         0xff
; #endif
; 
; #ifndef KEY_PRESS_DELAY
;     # define KEY_PRESS_DELAY  50
; #endif
; 
; #ifndef _USE_KEY_LONG_PRESS_DELAY_TIME
;     # define _USE_KEY_LONG_PRESS_DELAY_TIME     1000
; #endif
; #ifndef _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL
;     # define _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL 2
; #endif
; 
; #if _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 0
;     # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x03ff
; #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 1
;     # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x01ff
; #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 2
;     # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x00ff
; #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 3
;     # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x007f
; #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 4
;     # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x003f
; #else
;     # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x00ff 
; #endif
; 
; /********************
; *   函 数 声 明 区  *
; ********************/
; static void _Key_Scan(void);
; 
; /********************
; *   函 数 声 明 区  *
; ********************/
; void Add_Key_Code(void);
; unsigned char Get_Key_Code(void);
; 
; /********************
; *   函 数 引 用 区  *
; ********************/
; #ifndef _USE_KEY_PRESS_SCAN_FUNC_INTERFACE
;     # error Need for _USE_KEY_PRESS_SCAN_FUNC_INTERFACE
; #else
;     extern unsigned char _USE_KEY_PRESS_SCAN_FUNC_INTERFACE(void);
; #endif
; 
; /********************
; *   全局变量声明区  *
; ********************/
; unsigned char g_cReturnKeyNum = KEY_NULL;
; unsigned char g_cReturnLongPressKeyNum = KEY_NULL;
; unsigned int g_wKeyPressTimeCounter = 0;
; unsigned int g_wKeyPressDelayCounter = 0;
; 
; /********************
; *   模块变量声明区  *
; ********************/
; static unsigned char s_cKeyBUFF[KEY_BUFF_SIZE][2];
; static unsigned char s_cKeyBUFFCounter = 0;
; static unsigned char s_cKeyBUFFHeadPoint = 0;
; static unsigned char s_cKeyBUFFTailPoint = 0;
; 
; static unsigned char s_cLongKeyPressNum = KEY_NULL;
; static unsigned char s_cKeyNum = KEY_NULL;
; 
; 
; /***********************************************************
; *   函数说明:按键扫描码处理函数                           *
; *   输入:    无                                           *
; *   输出:    无                                           *
; *   调用函数:_USE_KEY_PRESS_SCAN_FUNC_INTERFACE()         *
; * -------------------------------------------------------- *
; *   [说    明]                                             *
; *            按下一个键以后,1s以内松开返回短按键键值      *
; *            1s以上返回长按键键值。键值只保存一个周期      *
; ***********************************************************/
; static void _Key_Scan(void)
; {
	.dbline 184
;     static unsigned char OldKeyCode = KEY_NULL;
;     static unsigned char IfLongKeyPress = FALSE;
;     static unsigned int  LongPressAcceleration = 0;
; 	 
;     unsigned char NowKeyCode = _USE_KEY_PRESS_SCAN_FUNC_INTERFACE();
	xcall _Key_Press_Scan
	mov R20,R16
	.dbline 185
;     s_cKeyNum = KEY_NULL;
	ldi R24,255
	sts _s_cKeyNum,R24
	.dbline 187
; 	
;     if ((OldKeyCode != NowKeyCode) && (g_wKeyPressDelayCounter == 0))
	lds R2,L2
	cp R2,R16
	breq L5
X0:
	lds R2,_g_wKeyPressDelayCounter
	lds R3,_g_wKeyPressDelayCounter+1
	tst R2
	brne L5
	tst R3
	brne L5
X1:
	.dbline 188
;     {
	.dbline 189
;         g_wKeyPressTimeCounter = 0;
	clr R2
	clr R3
	sts _g_wKeyPressTimeCounter+1,R3
	sts _g_wKeyPressTimeCounter,R2
	.dbline 190
;         LongPressAcceleration = 0x03ff;
	ldi R25,3
	sts L4+1,R25
	sts L4,R24
	.dbline 192
;           
;         if ((NowKeyCode == KEY_NULL) && (IfLongKeyPress == FALSE))
	cpi R16,255
	brne L7
X2:
	lds R2,L3
	tst R2
	brne L7
X3:
	.dbline 193
;         {
	.dbline 194
;             s_cKeyNum = OldKeyCode;
	lds R2,L2
	sts _s_cKeyNum,R2
	.dbline 195
;         }
L7:
	.dbline 197
; 		  
;         g_wKeyPressDelayCounter = KEY_PRESS_DELAY;
	ldi R24,50
	ldi R25,0
	sts _g_wKeyPressDelayCounter+1,R25
	sts _g_wKeyPressDelayCounter,R24
	.dbline 199
; 		  
;         OldKeyCode = NowKeyCode;
	sts L2,R20
	.dbline 200
;         IfLongKeyPress = FALSE;
	clr R2
	sts L3,R2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -