📄 dispkeyboard.lst
字号:
(0243) _Key_Scan();
_Add_Key_Code:
2CF DF8F RCALL __Key_Scan
(0244)
(0245) if ((s_cKeyNum == KEY_NULL) && (s_cLongKeyPressNum == KEY_NULL))
2D0 9180 0083 LDS R24,0x0083
2D2 3F8F CPI R24,0xFF
2D3 F429 BNE 0x02D9
2D4 9180 0082 LDS R24,0x0082
2D6 3F8F CPI R24,0xFF
2D7 F409 BNE 0x02D9
(0246) {
(0247) return ;
2D8 C032 RJMP 0x030B
(0248) }
(0249)
(0250) if ((s_cKeyBUFFHeadPoint == s_cKeyBUFFTailPoint) && (s_cKeyBUFFCounter != NULL))
2D9 9020 0081 LDS R2,0x0081
2DB 9030 0080 LDS R3,g_wKeyPressDelayCounter+3
2DD 1432 CP R3,R2
2DE F429 BNE 0x02E4
2DF 9020 007F LDS R2,g_wKeyPressDelayCounter+2
2E1 2022 TST R2
2E2 F009 BEQ 0x02E4
(0251) {
(0252) return ;
2E3 C027 RJMP 0x030B
(0253) }
(0254)
(0255) s_cKeyBUFF[s_cKeyBUFFTailPoint][0] = s_cKeyNum;
2E4 E589 LDI R24,0x59
2E5 E091 LDI R25,1
2E6 91E0 0081 LDS R30,0x0081
2E8 27FF CLR R31
2E9 0FEE LSL R30
2EA 1FFF ROL R31
2EB 0FE8 ADD R30,R24
2EC 1FF9 ADC R31,R25
2ED 9020 0083 LDS R2,0x0083
2EF 8220 STD Z+0,R2
(0256) s_cKeyBUFF[s_cKeyBUFFTailPoint][1] = s_cLongKeyPressNum;
2F0 E58A LDI R24,0x5A
2F1 E091 LDI R25,1
2F2 91E0 0081 LDS R30,0x0081
2F4 27FF CLR R31
2F5 0FEE LSL R30
2F6 1FFF ROL R31
2F7 0FE8 ADD R30,R24
2F8 1FF9 ADC R31,R25
2F9 9020 0082 LDS R2,0x0082
2FB 8220 STD Z+0,R2
(0257)
(0258) s_cKeyBUFFTailPoint ++;
2FC 9180 0081 LDS R24,0x0081
2FE 5F8F SUBI R24,0xFF
2FF 9380 0081 STS 0x0081,R24
(0259) if (s_cKeyBUFFTailPoint == KEY_BUFF_SIZE)
301 3088 CPI R24,0x8
302 F419 BNE 0x0306
(0260) {
(0261) s_cKeyBUFFTailPoint = 0;
303 2422 CLR R2
304 9220 0081 STS 0x0081,R2
(0262) }
(0263) s_cKeyBUFFCounter ++;
306 9180 007F LDS R24,g_wKeyPressDelayCounter+2
308 5F8F SUBI R24,0xFF
309 9380 007F STS g_wKeyPressDelayCounter+2,R24
30B 9508 RET
(0264) }
(0265)
(0266) /***********************************************************
(0267) * 函数说明:从键盘缓冲区中获得一个按键扫描码 *
(0268) * 输出: 返回操作是否成功TRUE / FALSE *
(0269) * 输入: 无 *
(0270) * 调用函数:Add_Key_Code() *
(0271) * -------------------------------------------------------- *
(0272) * [说 明] *
(0273) * 将按键扫描码放到专门的临时缓冲变量中 *
(0274) ***********************************************************/
(0275) unsigned char Get_Key_Code(void)
(0276) {
(0277) g_cReturnKeyNum = KEY_NULL;
_Get_Key_Code:
30C EF8F LDI R24,0xFF
30D 9380 0079 STS g_cReturnKeyNum,R24
(0278) g_cReturnLongPressKeyNum = KEY_NULL;
30F 9380 007A STS g_cReturnLongPressKeyNum,R24
(0279)
(0280) #ifdef _USE_KEY_MANUL_REFRESH
(0281) Add_Key_Code();
(0282) #endif
(0283)
(0284) if ((s_cKeyBUFFHeadPoint == s_cKeyBUFFTailPoint) && (s_cKeyBUFFCounter == NULL))
311 9020 0081 LDS R2,0x0081
313 9030 0080 LDS R3,g_wKeyPressDelayCounter+3
315 1432 CP R3,R2
316 F431 BNE 0x031D
317 9020 007F LDS R2,g_wKeyPressDelayCounter+2
319 2022 TST R2
31A F411 BNE 0x031D
(0285) {
(0286) return FALSE;
31B 2700 CLR R16
31C C028 RJMP 0x0345
(0287) }
(0288)
(0289) g_cReturnKeyNum = s_cKeyBUFF[s_cKeyBUFFHeadPoint][0];
31D E589 LDI R24,0x59
31E E091 LDI R25,1
31F 91E0 0080 LDS R30,g_wKeyPressDelayCounter+3
321 27FF CLR R31
322 0FEE LSL R30
323 1FFF ROL R31
324 0FE8 ADD R30,R24
325 1FF9 ADC R31,R25
326 8020 LDD R2,Z+0
327 9220 0079 STS g_cReturnKeyNum,R2
(0290) g_cReturnLongPressKeyNum = s_cKeyBUFF[s_cKeyBUFFHeadPoint][1];
329 E58A LDI R24,0x5A
32A E091 LDI R25,1
32B 91E0 0080 LDS R30,g_wKeyPressDelayCounter+3
32D 27FF CLR R31
32E 0FEE LSL R30
32F 1FFF ROL R31
330 0FE8 ADD R30,R24
331 1FF9 ADC R31,R25
332 8020 LDD R2,Z+0
333 9220 007A STS g_cReturnLongPressKeyNum,R2
(0291)
(0292) s_cKeyBUFFCounter--;
335 9180 007F LDS R24,g_wKeyPressDelayCounter+2
337 5081 SUBI R24,1
338 9380 007F STS g_wKeyPressDelayCounter+2,R24
(0293) s_cKeyBUFFHeadPoint++;
33A 9180 0080 LDS R24,g_wKeyPressDelayCounter+3
33C 5F8F SUBI R24,0xFF
33D 9380 0080 STS g_wKeyPressDelayCounter+3,R24
(0294) if (s_cKeyBUFFHeadPoint == KEY_BUFF_SIZE)
33F 3088 CPI R24,0x8
340 F419 BNE 0x0344
(0295) {
(0296) s_cKeyBUFFHeadPoint = 0;
341 2422 CLR R2
342 9220 0080 STS g_wKeyPressDelayCounter+3,R2
(0297) }
(0298)
(0299) return TRUE;
344 E001 LDI R16,1
345 9508 RET
RD_LCD1602B.c:LCDDelay:
_LCDDelay:
TimeCounter1 --> R20
Time --> R10
346 940E 0E95 CALL push_xgset300C
348 0158 MOVW R10,R16
FILE: O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
(0001) /***********************************************************
(0002) * 函数库说明:LCD1602B基本驱动函数库 *
(0003) * 版本: v2.11 *
(0004) * 作者: 傻孩子 *
(0005) * 创建日期: 2005年9月6日 *
(0006) * -------------------------------------------------------- *
(0007) * [支 持 库] *
(0008) * -------------------------------------------------------- *
(0009) * [版本更新] *
(0010) * 修改: 傻孩子 *
(0011) * 修改日期: 2006年6月8日 *
(0012) * 版本: v2.11 *
(0013) * -------------------------------------------------------- *
(0014) * [版本历史] *
(0015) * -------------------------------------------------------- *
(0016) * [使用说明] *
(0017) * 1、需要底层硬件驱动函数支持 *
(0018) * 基本的宏定义: *
(0019) * LCD_RS LCD_RW LCD_E *
(0020) * LCD_SET_WRITE_DATA LCD_SET_READ_DATA *
(0021) * LCD_SEND_HALF_CHAR_HIGH(a) *
(0022) * LCD_SEND_HALF_CHAR_LOW(a) *
(0023) * 当处于串行状态下时,只定义LCD_RS *
(0024) * LCD_E LCD_SEND_HALF_CHAR_HIGH(a) *
(0025) * LCD_SEND_HALF_CHAR_LOW(a) *
(0026) * 2、如果采用8数据位连接,则需要定义数据端口 *
(0027) * LCD_DATA_PORT,同时需要定义宏来开启该功 *
(0028) * 能:_LCD1602_FULL_DATA_MODEL *
(0029) * 3、需要修改引用宏定义来指定底层硬件驱动 *
(0030) * 函数库。 *
(0031) * 4、本库驱动下的LCD显示支持1602的各种连 *
(0032) * 接方法。当使用只写模式是请在引用该头 *
(0033) * 文件之前加上宏定义: *
(0034) * # define _USE_LCD_ONLY_WRITE *
(0035) * 5、在调用本库之前,定义RunStringSpeed可 *
(0036) * 以设置滚屏的速度。通过在引用前定义 *
(0037) * FlashTimeOut 和 FlashGIFTimeOut 可以 *
(0038) * 改变字符闪烁的频率。 *
(0039) * 6、增加一个GIF字幕特效函数。 *
(0040) * 7、确定没有LCD复位问题。 *
(0041) * 8、增加对595串行转并行连接的支持。 *
(0042) * 需要头文件SerialToCollateral.h *
(0043) ***********************************************************/
(0044)
(0045) /********************
(0046) * 头 文 件 配 置 区 *
(0047) ********************/
(0048) # include "RD_MacroAndConst.h"
(0049) # include "LIB_Config.h"
(0050) # include "RD_LCD1602B.h"
(0051)
(0052)
(0053) /********************
(0054) * 系 统 宏 定 义 *
(0055) ********************/
(0056)
(0057) /*------------------*
(0058) * 常 数 宏 定 义 *
(0059) *------------------*/
(0060) # define LCD_CMD_DISP_CTR 0x0c
(0061) # define LCD_CMD_CLS 0x01
(0062) # define LCD_CMD_ENTER_SET 0x02
(0063) # define LCD_CMD_ICON_SHOW 0x0f
(0064) # define LCD_CMD_ICON_HIDE 0x0c
(0065) # define LCD_CMD_NOT_MOVE 0x14
(0066)
(0067)
(0068) # define LCD_WRITE 0x00
(0069) # define LCD_READ 0x01
(0070) # define LCD_COMMAND 0x00
(0071) # define LCD_DATA 0x01
(0072)
(0073) #ifndef LCD_RUN_STRING_SPEED
(0074) # define LCD_RUN_STRING_SPEED 100
(0075) #endif
(0076)
(0077) #ifndef LCD_FLASH_TIME_OUT
(0078) # define LCD_FLASH_TIME_OUT 0x03ff
(0079) #endif
(0080) #ifndef LCD_FLASH_STRING_GROUP_TIME_OUT
(0081) # define LCD_FLASH_STRING_GROUP_TIME_OUT 0x03ff
(0082) #endif
(0083)
(0084) /*------------------*
(0085) * 动 作 宏 定 义 *
(0086) *------------------*/
(0087) #ifndef LCD_SET_WRITE_DATA
(0088) # define LCD_SET_WRITE_DATA
(0089) #endif
(0090) #ifndef LCD_SET_READ_DATA
(0091) # define LCD_SET_READ_DATA
(0092) #endif
(0093) #ifndef LCD_RW
(0094) # define LCD_RW LCD_Temp
(0095) #endif
(0096) #ifndef LCD_BF
(0097) # define LCD_BF LCD_Temp
(0098) #endif
(0099)
(0100) #ifndef _Use_LCD1602B_Serial
(0101) # define SetReadState LCD_SET_READ_DATA;LCD_RS = LCD_COMMAND;LCD_RW = LCD_READ;
(0102) # define SetRead LCD_SET_READ_DATA;LCD_RW = LCD_READ;
(0103) # define SetWrite LCD_SET_WRITE_DATA;LCD_RW = LCD_WRITE;
(0104) # define SetCommand LCD_RS = LCD_COMMAND;
(0105) # define SetData LCD_RS = LCD_DATA;
(0106) #else
(0107) # define _USE_LCD_ONLY_WRITE
(0108) # define SetReadState
(0109) # define SetRead
(0110) # define SetWrite
(0111) # define SetCommand LCD_RS = LCD_COMMAND;refreshVirtualPORT();
(0112) # define SetData LCD_RS = LCD_DATA;refreshVirtualPORT();
(0113) # define SetEnable LCD_E = High;refreshVirtualPORT();
(0114) # define SetDisable LCD_E = Low;refreshVirtualPORT();
(0115) #endif
(0116)
(0117) #ifdef _LCD1602_FULL_DATA_MODEL
(0118) #ifndef LCD_DATA_PORT
(0119) #error Need for macro: LCD_DATA_PORT
(0120) #endif
(0121) #endif
(0122) /********************
(0123) * 用户变量类型定义 *
(0124) ********************/
(0125)
(0126) /********************
(0127) * 模块结构体定义区 *
(0128) ********************/
(0129)
(0130) /********************
(0131) * 模块函数声明区 *
(0132) ********************/
(0133) static void LCDDelay(unsigned int Time);
(0134) static void LCDDelayUs(unsigned int Time);
(0135)
(0136)
(0137) /********************
(0138) * 全局函数声明区 *
(0139) ********************/
(0140) void LCDInit(void);
(0141) void LCDSetXY(char X,char Y);
(0142) void LCDDisplayString(char *String);
(0143) void LCDDisplayNum(unsigned long Num,char BitCount);
(0144) void RunString(char *String,char Y,char StartX,char EndX);
(0145) char StringLength(char *String);
(0146) void Flash(char *String,char Icon,char X,char Y);
(0147) void FlashStringGroup(char String[][17],char StringCounter,char X,char Y);
(0148) void LCDWaitForReady(void);
(0149) void LCDSendCommand(char Command);
(0150) void LCDSendData(char Data);
(0151)
(0152) /********************
(0153) * 全局函数引用区 *
(0154) ********************/
(0155) #ifdef _Use_LCD1602B_Serial
(0156) extern void refreshVirtualPORT(void);
(0157) #endif
(0158)
(0159) /********************
(0160) * 模块变量声明区 *
(0161) ********************/
(0162) const static char CHR[16] = {'0','1','2','3','4','5','6','7','8'
(0163) ,'9','a','b','c','d','e','f'};
(0164)
(0165) /********************
(0166) * 全局变量声明区 *
(0167) ********************/
(0168) static char LCD_Temp = 0;
(0169)
(0170) /********************
(0171) * 全局变量引用区 *
(0172) ********************/
(0173) #ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
(0174) extern unsigned i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -