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

📄 dispkeyboard.lst

📁 液晶模块LCD1602配合键盘显示的一个实例
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -