📄 dispkeyboard.lst
字号:
(0236) }
(0237)
(0238) (*pData) = pBuffer[nHead];
(0239) )
(0240)
(0241) return TRUE;
25C E001 LDI R16,1
25D 940C 0E76 JMP pop_xgset30FC
__Key_Scan:
NowKeyCode0 --> R20
RD_UseKey.c:_Key_Scan:
25F 934A ST R20,-Y
FILE: O:\2007全国电子设计大赛\键盘显示模块\RD_UseKey.c
(0001) /***********************************************************
(0002) * 函数库说明:按键处理函数库 *
(0003) * 版本: v2.00 *
(0004) * 作者: 傻孩子 *
(0005) * 创建日期: 2005年11月27日 *
(0006) * -------------------------------------------------------- *
(0007) * [支 持 库] *
(0008) * 支持库名称:RD_MacroAndConst.h *
(0009) * 需要版本: v0.01 &abv *
(0010) * 支持库说明:系统常用宏定义库 *
(0011) * *
(0012) * 支持库名称:RD_UseKey.h *
(0013) * 需要版本: ---- *
(0014) * 支持库说明:按键处理声明库 *
(0015) * -------------------------------------------------------- *
(0016) * [版本更新] *
(0017) * 修改: 傻孩子 *
(0018) * 修改日期: 2006年4月15日 *
(0019) * 版本: v1.3 *
(0020) * *
(0021) * 修改: 傻孩子 *
(0022) * 修改日期: 2006年4月23日 *
(0023) * 版本: v1.31 *
(0024) * *
(0025) * 修改: 傻孩子 *
(0026) * 修改日期: 2006年5月5日 *
(0027) * 版本: v1.32 *
(0028) * *
(0029) * 修改: 王卓然 *
(0030) * 修改日期: 2007年2月25日 *
(0031) * 版本: v2.00 *
(0032) * -------------------------------------------------------- *
(0033) * [版本历史] *
(0034) * v1.3以下 1、提供了对键盘缓冲区的支持。 *
(0035) * 2、支持长按键处理。 *
(0036) * 3、需要外部提供一个毫秒级的延时计数器。 *
(0037) * 4、需要外部提供一个有返回值得键盘扫描 *
(0038) * 函数,该函数需要做基本的去抖。 *
(0039) * 5、可以外部定义缓冲区大小,空键值。 *
(0040) * 6、增加了一个入口键盘扫描码的噪声抑制参 *
(0041) * KEY_PRESS_DELAY,该值为毫秒级的单向 *
(0042) * 递减数值,即如果值不为零,则减到0为。 *
(0043) * 如果键盘响应过于迟钝,可以适当改小该 *
(0044) * 参数值。 *
(0045) * v1.3 修改了头文件的组织形式,对外的接口模式 *
(0046) * 对一些时间计数器进行了分类和统一宏定义 *
(0047) * 允许外部通过宏定义将这些接口连接到实际 *
(0048) * 的计数器上。同时兼容从前的版本。 *
(0049) * v1.31 修正了按键去抖计数器会干扰外部单向计数 *
(0050) * 器的错误。 *
(0051) * v1.32 允许选择自动刷新按键和手动刷新按键两种模式 *
(0052) * v2.00 支持长按键以重复的间隔触发。 *
(0053) * -------------------------------------------------------- *
(0054) * [说明] *
(0055) * 1、在外部合适的位置(毫秒中断程序)增加 *
(0056) * USEKEY_INSERT_MS_TIMER_OVF_ISR_CODE来保证 *
(0057) * 头文件的正常使用。 *
(0058) * 2、可以通过定义KEY_BUFF_SIZE来设置键盘缓冲区 *
(0059) * 的大小。 *
(0060) * 3、可以通过定义KEY_PRESS_DELAY来设置去抖得 *
(0061) * 时间常数。 *
(0062) * 4、可以通过_USE_KEY_PRESS_SCAN_FUNC_INTERFACE *
(0063) * 来连接用于键盘扫描的函数。该函数必须返回 *
(0064) * 扫描码。 *
(0065) * 5、通过GetKeyCode()函数来获得缓冲区状态,当 *
(0066) * 该函数返回True时,可以从ReturnKeyNum和 *
(0067) * ReturnLongPressKeyNum中分别获取按键和长 *
(0068) * 按键的扫描码,两个值不能同时不为KeyNull *
(0069) * 6、允许通过_USE_KEY_MANUL_REFRESH来选择自动刷 *
(0070) * 新按键缓冲区的模式。 *
(0071) * 7、可以通过宏_USE_KEY_LONG_PRESS_DELAY_TIME来 *
(0072) * 定义长按键的最小判定时间。 *
(0073) * 9、可以通过宏_USE_KEY_LONG_PRESS_REPEAT来打开 *
(0074) * 长按键重复触发功能。 *
(0075) * 8、宏_USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL可 *
(0076) * 以用来设定长按键时重复触发的最小时间间隔等 *
(0077) * 级。取值范围是0至4,数值越大,时间间隔越小 *
(0078) * 默认情况下为2,即一秒钟重复4次。 *
(0079) ***********************************************************/
(0080)
(0081) /********************
(0082) * 头 文 件 配 置 区 *
(0083) ********************/
(0084) # include "RD_MacroAndConst.h"
(0085) # include "LIB_Config.h"
(0086) # include "RD_UseKey.h"
(0087)
(0088) /********************
(0089) * 系 统 宏 定 义 *
(0090) ********************/
(0091)
(0092)
(0093) /*------------------*
(0094) * 常 数 宏 定 义 *
(0095) *------------------*/
(0096) #ifndef KEY_BUFF_SIZE
(0097) # define KEY_BUFF_SIZE 8
(0098) #endif
(0099) #ifndef KEY_NULL
(0100) # define KEY_NULL 0xff
(0101) #endif
(0102)
(0103) #ifndef KEY_PRESS_DELAY
(0104) # define KEY_PRESS_DELAY 50
(0105) #endif
(0106)
(0107) #ifndef _USE_KEY_LONG_PRESS_DELAY_TIME
(0108) # define _USE_KEY_LONG_PRESS_DELAY_TIME 1000
(0109) #endif
(0110) #ifndef _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL
(0111) # define _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL 2
(0112) #endif
(0113)
(0114) #if _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 0
(0115) # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x03ff
(0116) #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 1
(0117) # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x01ff
(0118) #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 2
(0119) # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x00ff
(0120) #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 3
(0121) # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x007f
(0122) #elif _USE_KEY_LONG_KEY_FASTEST_SPEED_LEVEL == 4
(0123) # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x003f
(0124) #else
(0125) # define _USE_KEY_LONG_PRESS_FASTEST_SPEED 0x00ff
(0126) #endif
(0127)
(0128) /********************
(0129) * 函 数 声 明 区 *
(0130) ********************/
(0131) static void _Key_Scan(void);
(0132)
(0133) /********************
(0134) * 函 数 声 明 区 *
(0135) ********************/
(0136) void Add_Key_Code(void);
(0137) unsigned char Get_Key_Code(void);
(0138)
(0139) /********************
(0140) * 函 数 引 用 区 *
(0141) ********************/
(0142) #ifndef _USE_KEY_PRESS_SCAN_FUNC_INTERFACE
(0143) # error Need for _USE_KEY_PRESS_SCAN_FUNC_INTERFACE
(0144) #else
(0145) extern unsigned char _USE_KEY_PRESS_SCAN_FUNC_INTERFACE(void);
(0146) #endif
(0147)
(0148) /********************
(0149) * 全局变量声明区 *
(0150) ********************/
(0151) unsigned char g_cReturnKeyNum = KEY_NULL;
(0152) unsigned char g_cReturnLongPressKeyNum = KEY_NULL;
(0153) unsigned int g_wKeyPressTimeCounter = 0;
(0154) unsigned int g_wKeyPressDelayCounter = 0;
(0155)
(0156) /********************
(0157) * 模块变量声明区 *
(0158) ********************/
(0159) static unsigned char s_cKeyBUFF[KEY_BUFF_SIZE][2];
(0160) static unsigned char s_cKeyBUFFCounter = 0;
(0161) static unsigned char s_cKeyBUFFHeadPoint = 0;
(0162) static unsigned char s_cKeyBUFFTailPoint = 0;
(0163)
(0164) static unsigned char s_cLongKeyPressNum = KEY_NULL;
(0165) static unsigned char s_cKeyNum = KEY_NULL;
(0166)
(0167)
(0168) /***********************************************************
(0169) * 函数说明:按键扫描码处理函数 *
(0170) * 输入: 无 *
(0171) * 输出: 无 *
(0172) * 调用函数:_USE_KEY_PRESS_SCAN_FUNC_INTERFACE() *
(0173) * -------------------------------------------------------- *
(0174) * [说 明] *
(0175) * 按下一个键以后,1s以内松开返回短按键键值 *
(0176) * 1s以上返回长按键键值。键值只保存一个周期 *
(0177) ***********************************************************/
(0178) static void _Key_Scan(void)
(0179) {
(0180) static unsigned char OldKeyCode = KEY_NULL;
(0181) static unsigned char IfLongKeyPress = FALSE;
(0182) static unsigned int LongPressAcceleration = 0;
(0183)
(0184) unsigned char NowKeyCode = _USE_KEY_PRESS_SCAN_FUNC_INTERFACE();
260 940E 0A1A CALL _Key_Press_Scan
262 2F40 MOV R20,R16
(0185) s_cKeyNum = KEY_NULL;
263 EF8F LDI R24,0xFF
264 9380 0083 STS 0x0083,R24
(0186)
(0187) if ((OldKeyCode != NowKeyCode) && (g_wKeyPressDelayCounter == 0))
266 9020 0084 LDS R2,RD_UseKey.c:OldKeyCode
268 1620 CP R2,R16
269 F149 BEQ 0x0293
26A 9020 007D LDS R2,g_wKeyPressDelayCounter
26C 9030 007E LDS R3,g_wKeyPressDelayCounter+1
26E 2022 TST R2
26F F519 BNE 0x0293
270 2033 TST R3
271 F509 BNE 0x0293
(0188) {
(0189) g_wKeyPressTimeCounter = 0;
272 2422 CLR R2
273 2433 CLR R3
274 9230 007C STS g_wKeyPressTimeCounter+1,R3
276 9220 007B STS g_wKeyPressTimeCounter,R2
(0190) LongPressAcceleration = 0x03ff;
278 E093 LDI R25,3
279 9390 0087 STS LongPressAcceleration+1,R25
27B 9380 0086 STS LongPressAcceleration,R24
(0191)
(0192) if ((NowKeyCode == KEY_NULL) && (IfLongKeyPress == FALSE))
27D 3F0F CPI R16,0xFF
27E F441 BNE 0x0287
27F 9020 0085 LDS R2,RD_UseKey.c:IfLongKeyPress
281 2022 TST R2
282 F421 BNE 0x0287
(0193) {
(0194) s_cKeyNum = OldKeyCode;
283 9020 0084 LDS R2,RD_UseKey.c:OldKeyCode
285 9220 0083 STS 0x0083,R2
(0195) }
(0196)
(0197) g_wKeyPressDelayCounter = KEY_PRESS_DELAY;
287 E382 LDI R24,0x32
288 E090 LDI R25,0
289 9390 007E STS g_wKeyPressDelayCounter+1,R25
28B 9380 007D STS g_wKeyPressDelayCounter,R24
(0198)
(0199) OldKeyCode = NowKeyCode;
28D 9340 0084 STS RD_UseKey.c:OldKeyCode,R20
(0200) IfLongKeyPress = FALSE;
28F 2422 CLR R2
290 9220 0085 STS RD_UseKey.c:IfLongKeyPress,R2
(0201) }
292 C03A RJMP 0x02CD
(0202) else
(0203) {
(0204) s_cKeyNum = KEY_NULL;
293 EF8F LDI R24,0xFF
294 9380 0083 STS 0x0083,R24
(0205) if ((g_wKeyPressTimeCounter > _USE_KEY_LONG_PRESS_DELAY_TIME) && (IfLongKeyPress == FALSE))
296 E080 LDI R24,0
297 E094 LDI R25,4
298 9020 007B LDS R2,g_wKeyPressTimeCounter
29A 9030 007C LDS R3,g_wKeyPressTimeCounter+1
29C 1582 CP R24,R2
29D 0593 CPC R25,R3
29E F4C8 BCC 0x02B8
29F 9020 0085 LDS R2,RD_UseKey.c:IfLongKeyPress
2A1 2022 TST R2
2A2 F4A9 BNE 0x02B8
(0206) {
(0207) #ifdef _USE_KEY_LONG_PRESS_REPEAT
(0208) if (LongPressAcceleration > _USE_KEY_LONG_PRESS_FASTEST_SPEED)
2A3 E78F LDI R24,0x7F
2A4 E090 LDI R25,0
2A5 9020 0086 LDS R2,LongPressAcceleration
2A7 9030 0087 LDS R3,LongPressAcceleration+1
2A9 1582 CP R24,R2
2AA 0593 CPC R25,R3
2AB F430 BCC 0x02B2
(0209) {
(0210) LongPressAcceleration >>= 1;
2AC 9436 LSR R3
2AD 9427 ROR R2
2AE 9230 0087 STS LongPressAcceleration+1,R3
2B0 9220 0086 STS LongPressAcceleration,R2
(0211) }
(0212) #endif
(0213) s_cLongKeyPressNum = NowKeyCode;
2B2 9340 0082 STS 0x0082,R20
(0214) IfLongKeyPress = TRUE;
2B4 E081 LDI R24,1
2B5 9380 0085 STS RD_UseKey.c:IfLongKeyPress,R24
(0215) }
2B7 C015 RJMP 0x02CD
(0216) else
(0217) {
(0218) #ifdef _USE_KEY_LONG_PRESS_REPEAT
(0219) if (!(g_wKeyPressTimeCounter & LongPressAcceleration))
2B8 9020 0086 LDS R2,LongPressAcceleration
2BA 9030 0087 LDS R3,LongPressAcceleration+1
2BC 9040 007B LDS R4,g_wKeyPressTimeCounter
2BE 9050 007C LDS R5,g_wKeyPressTimeCounter+1
2C0 2042 AND R4,R2
2C1 2053 AND R5,R3
2C2 2044 TST R4
2C3 F431 BNE 0x02CA
2C4 2055 TST R5
2C5 F421 BNE 0x02CA
(0220) {
(0221) IfLongKeyPress = FALSE;
2C6 2422 CLR R2
2C7 9220 0085 STS RD_UseKey.c:IfLongKeyPress,R2
(0222) }
2C9 C003 RJMP 0x02CD
(0223) else
(0224) {
(0225) s_cLongKeyPressNum = KEY_NULL;
2CA EF8F LDI R24,0xFF
2CB 9380 0082 STS 0x0082,R24
(0226) }
(0227) #else
(0228) s_cLongKeyPressNum = KEY_NULL;
(0229) #endif
(0230) }
(0231) }
2CD 9149 LD R20,Y+
2CE 9508 RET
(0232)
(0233) }
(0234)
(0235) /***********************************************************
(0236) * 函数说明:键盘缓冲处理函数 *
(0237) * 输入: 无 *
(0238) * 输出: 无 *
(0239) * 调用函数:_Key_Scan() *
(0240) ***********************************************************/
(0241) void Add_Key_Code(void)
(0242) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -