📄 rd_lcd1602b.s
字号:
.module RD_LCD1602B.c
.area text(rom, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
_CHR:
.blkb 2
.area idata
.byte 48,49
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.blkb 2
.area idata
.byte 50,51
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.blkb 2
.area idata
.byte 52,53
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.blkb 2
.area idata
.byte 54,55
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.blkb 2
.area idata
.byte 56,57
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.blkb 2
.area idata
.byte 'a,'b
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.blkb 2
.area idata
.byte 'c,'d
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.blkb 2
.area idata
.byte 'e,'f
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
_LCD_Temp:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.area text(rom, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块测试版\Relative_Locate_Module\RD_LCD1602B.c
.dbfunc s LCDDelay _LCDDelay fV
; TimeCounter1 -> R20,R21
; Time -> R10,R11
.even
_LCDDelay:
rcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 211
; /***********************************************************
; * 函数库说明:LCD1602B基本驱动函数库 *
; * 版本: v2.11 *
; * 作者: 傻孩子 *
; * 创建日期: 2005年9月6日 *
; * -------------------------------------------------------- *
; * [支 持 库] *
; * -------------------------------------------------------- *
; * [版本更新] *
; * 修改: 傻孩子 *
; * 修改日期: 2006年6月8日 *
; * 版本: v2.11 *
; * -------------------------------------------------------- *
; * [版本历史] *
; * -------------------------------------------------------- *
; * [使用说明] *
; * 1、需要底层硬件驱动函数支持 *
; * 基本的宏定义: *
; * LCD_RS LCD_RW LCD_E *
; * LCD_SET_WRITE_DATA LCD_SET_READ_DATA *
; * LCD_SEND_HALF_CHAR_HIGH(a) *
; * LCD_SEND_HALF_CHAR_LOW(a) *
; * 当处于串行状态下时,只定义LCD_RS *
; * LCD_E LCD_SEND_HALF_CHAR_HIGH(a) *
; * LCD_SEND_HALF_CHAR_LOW(a) *
; * 2、如果采用8数据位连接,则需要定义数据端口 *
; * LCD_DATA_PORT,同时需要定义宏来开启该功 *
; * 能:_LCD1602_FULL_DATA_MODEL *
; * 3、需要修改引用宏定义来指定底层硬件驱动 *
; * 函数库。 *
; * 4、本库驱动下的LCD显示支持1602的各种连 *
; * 接方法。当使用只写模式是请在引用该头 *
; * 文件之前加上宏定义: *
; * # define _USE_LCD_ONLY_WRITE *
; * 5、在调用本库之前,定义RunStringSpeed可 *
; * 以设置滚屏的速度。通过在引用前定义 *
; * FlashTimeOut 和 FlashGIFTimeOut 可以 *
; * 改变字符闪烁的频率。 *
; * 6、增加一个GIF字幕特效函数。 *
; * 7、确定没有LCD复位问题。 *
; * 8、增加对595串行转并行连接的支持。 *
; * 需要头文件SerialToCollateral.h *
; ***********************************************************/
;
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "LIB_Config.h"
; # include "RD_LCD1602B.h"
;
;
; /********************
; * 系 统 宏 定 义 *
; ********************/
;
; /*------------------*
; * 常 数 宏 定 义 *
; *------------------*/
; # define LCD_CMD_DISP_CTR 0x0c
; # define LCD_CMD_CLS 0x01
; # define LCD_CMD_ENTER_SET 0x02
; # define LCD_CMD_ICON_SHOW 0x0f
; # define LCD_CMD_ICON_HIDE 0x0c
; # define LCD_CMD_NOT_MOVE 0x14
;
;
; # define LCD_WRITE 0x00
; # define LCD_READ 0x01
; # define LCD_COMMAND 0x00
; # define LCD_DATA 0x01
;
; #ifndef LCD_RUN_STRING_SPEED
; # define LCD_RUN_STRING_SPEED 100
; #endif
;
; #ifndef LCD_FLASH_TIME_OUT
; # define LCD_FLASH_TIME_OUT 0x03ff
; #endif
; #ifndef LCD_FLASH_STRING_GROUP_TIME_OUT
; # define LCD_FLASH_STRING_GROUP_TIME_OUT 0x03ff
; #endif
;
; /*------------------*
; * 动 作 宏 定 义 *
; *------------------*/
;
; #if defined(_USE_LCD_ONLY_WRITE) || defined(_Use_LCD1602B_Serial)
; #ifndef LCD_SET_WRITE_DATA
; # define LCD_SET_WRITE_DATA
; #endif
; #ifndef LCD_SET_READ_DATA
; # define LCD_SET_READ_DATA
; #endif
; #ifndef LCD_RW
; # define LCD_RW LCD_Temp
; #endif
;
; #ifndef LCD_BF
; # define LCD_BF LCD_Temp
; #endif
; #else
; #ifndef LCD_SET_WRITE_DATA
; # error No define LCD_SET_WRITE_DATA
; #endif
; #ifndef LCD_SET_READ_DATA
; # error No define LCD_SET_READ_DATA
; #endif
; #ifndef LCD_RW
; # error No define LCD_RW
; #endif
; #ifndef LCD_BF
; # error No define LCD_BF
; #endif
; #endif
;
; #ifndef LCD_RS
; # error Need define LCD_RS
; #endif
;
; #ifndef _Use_LCD1602B_Serial
; # define SetReadState LCD_SET_READ_DATA;LCD_RS = LCD_COMMAND;LCD_RW = LCD_READ;
; # define SetRead LCD_SET_READ_DATA;LCD_RW = LCD_READ;
; # define SetWrite LCD_SET_WRITE_DATA;LCD_RW = LCD_WRITE;
; # define SetCommand LCD_RS = LCD_COMMAND;
; # define SetData LCD_RS = LCD_DATA;
; #else
; # define _USE_LCD_ONLY_WRITE
; # define SetReadState
; # define SetRead
; # define SetWrite
; # define SetCommand LCD_RS = LCD_COMMAND;refreshVirtualPORT();
; # define SetData LCD_RS = LCD_DATA;refreshVirtualPORT();
; # define SetEnable LCD_E = High;refreshVirtualPORT();
; # define SetDisable LCD_E = Low;refreshVirtualPORT();
; #endif
;
; #ifdef _LCD1602_FULL_DATA_MODEL
; #ifndef LCD_DATA_PORT
; #error Need for macro: LCD_DATA_PORT
; #endif
; #endif
; /********************
; * 用户变量类型定义 *
; ********************/
;
; /********************
; * 模块结构体定义区 *
; ********************/
;
; /********************
; * 模块函数声明区 *
; ********************/
; static void LCDDelay(UINT16 Time);
; static void LCDDelayUs(UINT16 Time);
;
;
; /********************
; * 全局函数声明区 *
; ********************/
; void LCDInit(void);
; void LCDSetXY(UINT8 X,UINT8 Y);
; void LCDDisplayString(UINT8 *String);
; void LCDDisplayNum(unsigned long Num,UINT8 BitCount);
; void RunString(UINT8 *String,UINT8 Y,UINT8 StartX,UINT8 EndX);
; UINT8 StringLength(UINT8 *String);
; void Flash(UINT8 *String,UINT8 Icon,UINT8 X,UINT8 Y);
; void FlashStringGroup(UINT8 String[][17],UINT8 StringCounter,UINT8 X,UINT8 Y);
; void LCDWaitForReady(void);
; void LCDSendCommand(UINT8 Command);
; void LCDSendData(UINT8 Data);
; void PrintD(INT32 nNumber,UINT8 chCounter);
;
; /********************
; * 全局函数引用区 *
; ********************/
; #ifdef _Use_LCD1602B_Serial
; extern void refreshVirtualPORT(void);
; #endif
;
; /********************
; * 模块变量声明区 *
; ********************/
; const static UINT8 CHR[16] = {'0','1','2','3','4','5','6','7','8'
; ,'9','a','b','c','d','e','f'};
;
; /********************
; * 全局变量声明区 *
; ********************/
; static UINT8 LCD_Temp = 0;
;
; /********************
; * 全局变量引用区 *
; ********************/
; #ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
; extern UINT16 g_wSystemTimer;
; #define SYS_TIMER_MS_ADD_UNTILL_OVF g_wSystemTimer
; #else
; extern UINT16 SYS_TIMER_MS_ADD_UNTILL_OVF;
; #endif
;
;
;
; /***********************************************************
; * 函数说明:LCD驱动类毫秒延时函数 *
; * 输入: 需要延时的大体毫秒数 *
; * 输出: 无 *
; * 调用函数:LCDDelayUs() *
; ***********************************************************/
; static void LCDDelay(UINT16 Time)
; {
.dbline 212
; UINT16 TimeCounter = 0;
.dbline 214
;
; for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
clr R20
clr R21
rjmp L5
L2:
.dbline 215
; {
.dbline 216
; LCDDelayUs(255);
ldi R16,255
ldi R17,0
rcall _LCDDelayUs
.dbline 217
; }
L3:
.dbline 214
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 214
cp R20,R10
cpc R21,R11
brlo L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
rjmp pop_xgset300C
.dbsym r TimeCounter1 20 i
.dbsym r Time 10 i
.dbend
.dbfunc s LCDDelayUs _LCDDelayUs fV
; TimeCounter1 -> R20,R21
; Time -> R16,R17
.even
_LCDDelayUs:
st -y,R20
st -y,R21
.dbline -1
.dbline 227
; }
;
; /***********************************************************
; * 函数说明:LCD驱动指令周期延时函数 *
; * 输入: 需要大体延时Us数 *
; * 输出: 无 *
; * 调用函数:无 *
; ***********************************************************/
; static void LCDDelayUs(UINT16 Time)
; {
.dbline 228
; UINT16 TimeCounter = 0;
.dbline 229
; for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
clr R20
clr R21
rjmp L10
L7:
.dbline 230
; {
.dbline 231
; asm("nop");
nop
.dbline 232
; }
L8:
.dbline 229
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 229
cp R20,R16
cpc R21,R17
brlo L7
X1:
.dbline -2
L6:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r TimeCounter1 20 i
.dbsym r Time 16 i
.dbend
.dbfunc e LCDInit _LCDInit fV
.even
_LCDInit::
.dbline -1
.dbline 243
; }
;
; /***********************************************************
; * 函数说明:LCD初始化函数 *
; * 输入: 无 *
; * 输出: 无 *
; * 调用函数:LCDDelay() LCDWaitForReady() *
; * LCDSendCommand() *
; ***********************************************************/
; void LCDInit(void)
; {
.dbline 244
; LCDDelay(15);
ldi R16,15
ldi R17,0
rcall _LCDDelay
.dbline 247
;
; #ifndef _LCD1602_FULL_DATA_MODEL
; LCDSendCommand(0x28);
ldi R16,40
rcall _LCDSendCommand
.dbline 251
; #else
; LCDSendCommand(0x38);
; #endif
; LCDWaitForReady();
rcall _LCDWaitForReady
.dbline 252
; LCDSendCommand(LCD_CMD_DISP_CTR);
ldi R16,12
rcall _LCDSendCommand
.dbline 253
; LCDWaitForReady();
rcall _LCDWaitForReady
.dbline 254
; LCDSendCommand(LCD_CMD_CLS);
ldi R16,1
rcall _LCDSendCommand
.dbline 255
; LCDDelay(2);
ldi R16,2
ldi R17,0
rcall _LCDDelay
.dbline 256
; LCDSendCommand(LCD_CMD_ENTER_SET);
ldi R16,2
rcall _LCDSendCommand
.dbline 257
; LCDWaitForReady();
rcall _LCDWaitForReady
.dbline 258
; LCDSendCommand(LCD_CMD_NOT_MOVE);
ldi R16,20
.dbline -2
L11:
.dbline 0 ; func end
rjmp _LCDSendCommand
.dbend
.dbfunc e LCDSendCommand _LCDSendCommand fV
; Command -> R16
.even
_LCDSendCommand::
.dbline -1
.dbline 270
;
; }
;
; #ifndef _Use_LCD1602B_Serial
; /***********************************************************
; * 函数说明:向LCD发送指令函数 *
; * 输入: 需要发送的指令 *
; * 输出: 无 *
; * 调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendCommand(UINT8 Command)
; {
.dbline 271
; SetWrite;
in R24,0xa
ori R24,120
out 0xa,R24
.dbline 271
in R24,0xb
ori R24,120
out 0xb,R24
.dbline 271
nop
.dbline 271
.dbline 271
in R24,0x5
andi R24,254
out 0x5,R24
.dbline 271
.dbline 272
; SetCommand;
in R24,0x5
andi R24,253
out 0x5,R24
.dbline 272
.dbline 274
; #ifndef _LCD1602_FULL_DATA_MODEL
; {
.dbline 275
; LCD_SEND_HALF_CHAR_HIGH(Command);
in R24,0xb
andi R24,135
out 0xb,R24
.dbline 275
mov R24,R16
andi R24,240
lsr R24
in R2,0xb
or R2,R24
out 0xb,R2
.dbline 275
.dbline 276
; LCD_E = HIGH;
in R24,0xb
ori R24,128
out 0xb,R24
.dbline 277
; LCD_E = LOW;
in R24,0xb
andi R24,127
out 0xb,R24
.dbline 278
; }
.dbline 279
; {
.dbline 280
; LCD_SEND_HALF_CHAR_LOW(Command);
in R24,0xb
andi R24,135
out 0xb,R24
.dbline 280
mov R24,R16
andi R24,15
lsl R24
lsl R24
lsl R24
in R2,0xb
or R2,R24
out 0xb,R2
.dbline 280
.dbline 281
; LCD_E = HIGH;
in R24,0xb
ori R24,128
out 0xb,R24
.dbline 282
; LCD_E = LOW;
in R24,0xb
andi R24,127
out 0xb,R24
.dbline 283
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -