📄 rd_lcd1602b.lis
字号:
.module RD_LCD1602B.c
.area text(rom, con, rel)
0000 .dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
.area lit(rom, con, rel)
0000 _CHR:
0000 3031 .byte 48,49
0002 3233 .byte 50,51
0004 3435 .byte 52,53
0006 3637 .byte 54,55
0008 3839 .byte 56,57
000A 6162 .byte 'a,'b
000C 6364 .byte 'c,'d
000E 6566 .byte 'e,'f
.area data(ram, con, rel)
0000 .dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
0000 _LCD_Temp:
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
.area text(rom, con, rel)
0000 .dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
0000 .dbfunc s LCDDelay _LCDDelay fV
0000 ; TimeCounter1 -> R20,R21
0000 ; Time -> R10,R11
.even
0000 _LCDDelay:
0000 0E940000 xcall push_xgset300C
0004 5801 movw R10,R16
0006 .dbline -1
0006 .dbline 189
0006 ; /***********************************************************
0006 ; * 函数库说明:LCD1602B基本驱动函数库 *
0006 ; * 版本: v2.11 *
0006 ; * 作者: 傻孩子 *
0006 ; * 创建日期: 2005年9月6日 *
0006 ; * -------------------------------------------------------- *
0006 ; * [支 持 库] *
0006 ; * -------------------------------------------------------- *
0006 ; * [版本更新] *
0006 ; * 修改: 傻孩子 *
0006 ; * 修改日期: 2006年6月8日 *
0006 ; * 版本: v2.11 *
0006 ; * -------------------------------------------------------- *
0006 ; * [版本历史] *
0006 ; * -------------------------------------------------------- *
0006 ; * [使用说明] *
0006 ; * 1、需要底层硬件驱动函数支持 *
0006 ; * 基本的宏定义: *
0006 ; * LCD_RS LCD_RW LCD_E *
0006 ; * LCD_SET_WRITE_DATA LCD_SET_READ_DATA *
0006 ; * LCD_SEND_HALF_CHAR_HIGH(a) *
0006 ; * LCD_SEND_HALF_CHAR_LOW(a) *
0006 ; * 当处于串行状态下时,只定义LCD_RS *
0006 ; * LCD_E LCD_SEND_HALF_CHAR_HIGH(a) *
0006 ; * LCD_SEND_HALF_CHAR_LOW(a) *
0006 ; * 2、如果采用8数据位连接,则需要定义数据端口 *
0006 ; * LCD_DATA_PORT,同时需要定义宏来开启该功 *
0006 ; * 能:_LCD1602_FULL_DATA_MODEL *
0006 ; * 3、需要修改引用宏定义来指定底层硬件驱动 *
0006 ; * 函数库。 *
0006 ; * 4、本库驱动下的LCD显示支持1602的各种连 *
0006 ; * 接方法。当使用只写模式是请在引用该头 *
0006 ; * 文件之前加上宏定义: *
0006 ; * # define _USE_LCD_ONLY_WRITE *
0006 ; * 5、在调用本库之前,定义RunStringSpeed可 *
0006 ; * 以设置滚屏的速度。通过在引用前定义 *
0006 ; * FlashTimeOut 和 FlashGIFTimeOut 可以 *
0006 ; * 改变字符闪烁的频率。 *
0006 ; * 6、增加一个GIF字幕特效函数。 *
0006 ; * 7、确定没有LCD复位问题。 *
0006 ; * 8、增加对595串行转并行连接的支持。 *
0006 ; * 需要头文件SerialToCollateral.h *
0006 ; ***********************************************************/
0006 ;
0006 ; /********************
0006 ; * 头 文 件 配 置 区 *
0006 ; ********************/
0006 ; # include "RD_MacroAndConst.h"
0006 ; # include "LIB_Config.h"
0006 ; # include "RD_LCD1602B.h"
0006 ;
0006 ;
0006 ; /********************
0006 ; * 系 统 宏 定 义 *
0006 ; ********************/
0006 ;
0006 ; /*------------------*
0006 ; * 常 数 宏 定 义 *
0006 ; *------------------*/
0006 ; # define LCD_CMD_DISP_CTR 0x0c
0006 ; # define LCD_CMD_CLS 0x01
0006 ; # define LCD_CMD_ENTER_SET 0x02
0006 ; # define LCD_CMD_ICON_SHOW 0x0f
0006 ; # define LCD_CMD_ICON_HIDE 0x0c
0006 ; # define LCD_CMD_NOT_MOVE 0x14
0006 ;
0006 ;
0006 ; # define LCD_WRITE 0x00
0006 ; # define LCD_READ 0x01
0006 ; # define LCD_COMMAND 0x00
0006 ; # define LCD_DATA 0x01
0006 ;
0006 ; #ifndef LCD_RUN_STRING_SPEED
0006 ; # define LCD_RUN_STRING_SPEED 100
0006 ; #endif
0006 ;
0006 ; #ifndef LCD_FLASH_TIME_OUT
0006 ; # define LCD_FLASH_TIME_OUT 0x03ff
0006 ; #endif
0006 ; #ifndef LCD_FLASH_STRING_GROUP_TIME_OUT
0006 ; # define LCD_FLASH_STRING_GROUP_TIME_OUT 0x03ff
0006 ; #endif
0006 ;
0006 ; /*------------------*
0006 ; * 动 作 宏 定 义 *
0006 ; *------------------*/
0006 ; #ifndef LCD_SET_WRITE_DATA
0006 ; # define LCD_SET_WRITE_DATA
0006 ; #endif
0006 ; #ifndef LCD_SET_READ_DATA
0006 ; # define LCD_SET_READ_DATA
0006 ; #endif
0006 ; #ifndef LCD_RW
0006 ; # define LCD_RW LCD_Temp
0006 ; #endif
0006 ; #ifndef LCD_BF
0006 ; # define LCD_BF LCD_Temp
0006 ; #endif
0006 ;
0006 ; #ifndef _Use_LCD1602B_Serial
0006 ; # define SetReadState LCD_SET_READ_DATA;LCD_RS = LCD_COMMAND;LCD_RW = LCD_READ;
0006 ; # define SetRead LCD_SET_READ_DATA;LCD_RW = LCD_READ;
0006 ; # define SetWrite LCD_SET_WRITE_DATA;LCD_RW = LCD_WRITE;
0006 ; # define SetCommand LCD_RS = LCD_COMMAND;
0006 ; # define SetData LCD_RS = LCD_DATA;
0006 ; #else
0006 ; # define _USE_LCD_ONLY_WRITE
0006 ; # define SetReadState
0006 ; # define SetRead
0006 ; # define SetWrite
0006 ; # define SetCommand LCD_RS = LCD_COMMAND;refreshVirtualPORT();
0006 ; # define SetData LCD_RS = LCD_DATA;refreshVirtualPORT();
0006 ; # define SetEnable LCD_E = High;refreshVirtualPORT();
0006 ; # define SetDisable LCD_E = Low;refreshVirtualPORT();
0006 ; #endif
0006 ;
0006 ; #ifdef _LCD1602_FULL_DATA_MODEL
0006 ; #ifndef LCD_DATA_PORT
0006 ; #error Need for macro: LCD_DATA_PORT
0006 ; #endif
0006 ; #endif
0006 ; /********************
0006 ; * 用户变量类型定义 *
0006 ; ********************/
0006 ;
0006 ; /********************
0006 ; * 模块结构体定义区 *
0006 ; ********************/
0006 ;
0006 ; /********************
0006 ; * 模块函数声明区 *
0006 ; ********************/
0006 ; static void LCDDelay(unsigned int Time);
0006 ; static void LCDDelayUs(unsigned int Time);
0006 ;
0006 ;
0006 ; /********************
0006 ; * 全局函数声明区 *
0006 ; ********************/
0006 ; void LCDInit(void);
0006 ; void LCDSetXY(char X,char Y);
0006 ; void LCDDisplayString(char *String);
0006 ; void LCDDisplayNum(unsigned long Num,char BitCount);
0006 ; void RunString(char *String,char Y,char StartX,char EndX);
0006 ; char StringLength(char *String);
0006 ; void Flash(char *String,char Icon,char X,char Y);
0006 ; void FlashStringGroup(char String[][17],char StringCounter,char X,char Y);
0006 ; void LCDWaitForReady(void);
0006 ; void LCDSendCommand(char Command);
0006 ; void LCDSendData(char Data);
0006 ;
0006 ; /********************
0006 ; * 全局函数引用区 *
0006 ; ********************/
0006 ; #ifdef _Use_LCD1602B_Serial
0006 ; extern void refreshVirtualPORT(void);
0006 ; #endif
0006 ;
0006 ; /********************
0006 ; * 模块变量声明区 *
0006 ; ********************/
0006 ; const static char CHR[16] = {'0','1','2','3','4','5','6','7','8'
0006 ; ,'9','a','b','c','d','e','f'};
0006 ;
0006 ; /********************
0006 ; * 全局变量声明区 *
0006 ; ********************/
0006 ; static char LCD_Temp = 0;
0006 ;
0006 ; /********************
0006 ; * 全局变量引用区 *
0006 ; ********************/
0006 ; #ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
0006 ; extern unsigned int SystemTimer;
0006 ; #define SYS_TIMER_MS_ADD_UNTILL_OVF SystemTimer
0006 ; #else
0006 ; extern unsigned int SYS_TIMER_MS_ADD_UNTILL_OVF;
0006 ; #endif
0006 ;
0006 ;
0006 ;
0006 ; /***********************************************************
0006 ; * 函数说明:LCD驱动类毫秒延时函数 *
0006 ; * 输入: 需要延时的大体毫秒数 *
0006 ; * 输出: 无 *
0006 ; * 调用函数:LCDDelayUs() *
0006 ; ***********************************************************/
0006 ; static void LCDDelay(unsigned int Time)
0006 ; {
0006 .dbline 190
0006 ; unsigned int TimeCounter = 0;
0006 .dbline 192
0006 ;
0006 ; for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
0006 4427 clr R20
0008 5527 clr R21
000A 05C0 xjmp L5
000C L2:
000C .dbline 193
000C ; {
000C .dbline 194
000C ; LCDDelayUs(255);
000C 0FEF ldi R16,255
000E 10E0 ldi R17,0
0010 07D0 xcall _LCDDelayUs
0012 .dbline 195
0012 ; }
0012 L3:
0012 .dbline 192
0012 4F5F subi R20,255 ; offset = 1
0014 5F4F sbci R21,255
0016 L5:
0016 .dbline 192
0016 4A15 cp R20,R10
0018 5B05 cpc R21,R11
001A C0F3 brlo L2
001C X0:
001C .dbline -2
001C L1:
001C .dbline 0 ; func end
001C 0C940000 xjmp pop_xgset300C
0020 .dbsym r TimeCounter1 20 i
0020 .dbsym r Time 10 i
0020 .dbend
0020 .dbfunc s LCDDelayUs _LCDDelayUs fV
0020 ; TimeCounter1 -> R20,R21
0020 ; Time -> R16,R17
.even
0020 _LCDDelayUs:
0020 4A93 st -y,R20
0022 5A93 st -y,R21
0024 .dbline -1
0024 .dbline 205
0024 ; }
0024 ;
0024 ; /***********************************************************
0024 ; * 函数说明:LCD驱动指令周期延时函数 *
0024 ; * 输入: 需要大体延时Us数 *
0024 ; * 输出: 无 *
0024 ; * 调用函数:无 *
0024 ; ***********************************************************/
0024 ; static void LCDDelayUs(unsigned int Time)
0024 ; {
0024 .dbline 206
0024 ; unsigned int TimeCounter = 0;
0024 .dbline 207
0024 ; for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
0024 4427 clr R20
0026 5527 clr R21
0028 03C0 xjmp L10
002A L7:
002A .dbline 208
002A ; {
002A .dbline 209
002A ; asm("nop");
002A 0000 nop
002C .dbline 210
002C ; }
002C L8:
002C .dbline 207
002C 4F5F subi R20,255 ; offset = 1
002E 5F4F sbci R21,255
0030 L10:
0030 .dbline 207
0030 4017 cp R20,R16
0032 5107 cpc R21,R17
0034 D0F3 brlo L7
0036 X1:
0036 .dbline -2
0036 L6:
0036 .dbline 0 ; func end
0036 5991 ld R21,y+
0038 4991 ld R20,y+
003A 0895 ret
003C .dbsym r TimeCounter1 20 i
003C .dbsym r Time 16 i
003C .dbend
003C .dbfunc e LCDInit _LCDInit fV
.even
003C _LCDInit::
003C .dbline -1
003C .dbline 221
003C ; }
003C ;
003C ; /***********************************************************
003C ; * 函数说明:LCD初始化函数 *
003C ; * 输入: 无 *
003C ; * 输出: 无 *
003C ; * 调用函数:LCDDelay() LCDWaitForReady() *
003C ; * LCDSendCommand() *
003C ; ***********************************************************/
003C ; void LCDInit(void)
003C ; {
003C .dbline 222
003C ; LCDDelay(15);
003C 0FE0 ldi R16,15
003E 10E0 ldi R17,0
0040 DFDF xcall _LCDDelay
0042 .dbline 227
0042 ;
0042 ; #ifndef _LCD1602_FULL_DATA_MODEL
0042 ; LCDSendCommand(0x28);
0042 ; #else
0042 ; LCDSendCommand(0x38);
0042 08E3 ldi R16,56
0044 0FD0 xcall _LCDSendCommand
0046 .dbline 229
0046 ; #endif
0046 ; LCDWaitForReady();
0046 42D0 xcall _LCDWaitForReady
0048 .dbline 230
0048 ; LCDSendCommand(LCD_CMD_DISP_CTR);
0048 0CE0 ldi R16,12
004A 0CD0 xcall _LCDSendCommand
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -