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

📄 dispkeyboard.lst

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