📄 rd_lcd1602b.s
字号:
_LCDSendData::
.dbline -1
.dbline 278
; }
;
; /***********************************************************
; * 函数说明:向LCD发送数据函数 *
; * 输入: 需要发送的数据 *
; * 输出: 无 *
; * 调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendData(char Data)
; {
.dbline 279
; SetWrite;
ldi R24,255
out 0x1a,R24
.dbline 279
.dbline 279
in R24,0x18
andi R24,253
out 0x18,R24
.dbline 279
.dbline 280
; SetData;
in R24,0x18
ori R24,1
out 0x18,R24
.dbline 280
.dbline 294
; #ifndef _LCD1602_FULL_DATA_MODEL
; {
; LCD_SEND_HALF_CHAR_HIGH(Data);
; LCD_E = HIGH;
; LCD_E = LOW;
; }
;
; {
; LCD_SEND_HALF_CHAR_LOW(Data);
; LCD_E = HIGH;
; LCD_E = LOW;
; }
; #else
; LCD_DATA_PORT = Data;
out 0x1b,R16
.dbline 295
; LCD_E = HIGH;
in R24,0x18
ori R24,4
out 0x18,R24
.dbline 296
; LCD_E = LOW;
in R24,0x18
andi R24,251
out 0x18,R24
.dbline 298
; #endif
; SetRead;
clr R2
out 0x1a,R2
.dbline 298
ldi R24,255
out 0x1b,R24
.dbline 298
.dbline 298
in R24,0x18
ori R24,2
out 0x18,R24
.dbline 298
.dbline 299
; SetCommand;
in R24,0x18
andi R24,254
out 0x18,R24
.dbline 299
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbsym r Data 16 c
.dbend
.dbfunc e LCDWaitForReady _LCDWaitForReady fV
.even
_LCDWaitForReady::
.dbline -1
.dbline 309
; }
;
; /***********************************************************
; * 函数说明:等待LCD空闲状态函数 *
; * 输入: 无 *
; * 输出: 无 *
; * 调用函数:LCDDelayUs() *
; ***********************************************************/
; void LCDWaitForReady(void)
; {
.dbline 311
; #ifdef _USE_LCD_ONLY_WRITE
; LCDDelayUs(500);
ldi R16,500
ldi R17,1
xcall _LCDDelayUs
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCDSetXY _LCDSetXY fV
; Address0 -> R20
; Y -> R10
; X -> R22
.even
_LCDSetXY::
xcall push_xgsetF00C
mov R10,R18
mov R22,R16
.dbline -1
.dbline 401
; #else
;
; SetRead;
; SetCommand;
;
; LCD_E = HIGH;
; while (LCD_BF == 1); //RW=1,读PD7,为0表示空闲;
; LCD_E = LOW;
;
; #endif
; }
; #else
;
; /***********************************************************
; * 函数说明:向LCD发送指令函数 *
; * 输入: 需要发送的指令 *
; * 输出: 无 *
; * 调用函数:LCD_SEND_HALF_CHAR_HIGH() *
; * LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendCommand(char Command)
; {
; SetCommand;
; {
; SetEnable;
;
; LCD_SEND_HALF_CHAR_HIGH(Command);
;
; SetDisable;
; }
; {
; SetEnable;
;
; LCD_SEND_HALF_CHAR_LOW(Command);
;
; SetDisable;
; }
; SetCommand;
; }
;
; /***********************************************************
; * 函数说明:向LCD发送数据函数 *
; * 输入: 需要发送的数据 *
; * 输出: 无 *
; * 调用函数:LCD_SEND_HALF_CHAR_HIGH() *
; * LCD_SEND_HALF_CHAR_LOW() *
; ***********************************************************/
; void LCDSendData(char Data)
; {
; SetData;
; {
; SetEnable;
;
; LCD_SEND_HALF_CHAR_HIGH(Data);
;
; SetDisable;
; }
;
; {
; SetEnable;
;
; LCD_SEND_HALF_CHAR_LOW(Data);
;
; SetDisable;
; }
; SetCommand;
; }
;
; /***********************************************************
; * 函数说明:等待LCD空闲状态函数 *
; * 输入: 无 *
; * 输出: 无 *
; * 调用函数:LCDDelayUs() *
; ***********************************************************/
; void LCDWaitForReady(void)
; {
; LCDDelayUs(30);
; }
;
; #endif
;
;
; /***********************************************************
; * 函数说明:设置显示坐标函数 *
; * 输入: x,y坐标值 *
; * 输出: 无 *
; * 调用函数:LCDWaitForReady() LCDSendCommand() *
; ***********************************************************/
; void LCDSetXY(char X,char Y)
; {
.dbline 403
; char Address;
; if (Y == 0)
tst R10
brne L16
X2:
.dbline 404
; {
.dbline 405
; Address = 0x80 + X;
mov R20,R22
subi R20,128 ; addi 128
.dbline 406
; }
xjmp L17
L16:
.dbline 408
; else
; {
.dbline 409
; Address = 0xc0 + X;
mov R20,R22
subi R20,64 ; addi 192
.dbline 410
; }
L17:
.dbline 412
;
; LCDWaitForReady();
xcall _LCDWaitForReady
.dbline 413
; LCDSendCommand(Address);
mov R16,R20
xcall _LCDSendCommand
.dbline -2
L15:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r Address0 20 c
.dbsym r Y 10 c
.dbsym r X 22 c
.dbend
.dbfunc e LCDDisplayString _LCDDisplayString fV
; String -> R20,R21
.even
_LCDDisplayString::
st -y,R20
st -y,R21
movw R20,R16
.dbline -1
.dbline 423
; }
;
; /***********************************************************
; * 函数说明:LCD字符串显示函数 *
; * 输入: 要显示的字符串指针 *
; * 输出: 无 *
; * 调用函数:LCDWaitForReady() LCDSendData() *
; ***********************************************************/
; void LCDDisplayString(char *String)
; {
xjmp L20
L19:
.dbline 425
; while(*String)
; {
.dbline 426
; LCDWaitForReady();
xcall _LCDWaitForReady
.dbline 427
; LCDSendData(*String);
movw R30,R20
ldd R16,z+0
xcall _LCDSendData
.dbline 428
; String++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 429
; }
L20:
.dbline 424
movw R30,R20
ldd R2,z+0
tst R2
brne L19
X3:
.dbline -2
L18:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r String 20 pc
.dbend
.dbfunc e LCDDisplayNum _LCDDisplayNum fV
; a1 -> R20
; BitCount -> y+5
; Num -> y+1
.even
_LCDDisplayNum::
xcall push_arg4
st -y,R20
.dbline -1
.dbline 439
; }
;
; /***********************************************************
; * 函数说明:数值显示函数(HEX) *
; * 输入: 需要显示的数字(无符号长整形) *
; * 输出: 无 *
; * 调用函数:LCDSendData() *
; ***********************************************************/
; void LCDDisplayNum(unsigned long Num,char BitCount)
; {
.dbline 440
; char a = 0;
.dbline 441
; for (a = 8-BitCount ;a<8;a++)
ldi R20,8
ldd R0,y+5
sub R20,R0
xjmp L26
L23:
.dbline 442
; {
.dbline 443
; LCDSendData(CHR[(Num<<(a<<2))>>28]);
mov R2,R20
clr R3
lsl R2
rol R3
lsl R2
rol R3
ldd R16,y+1
ldd R17,y+2
ldd R18,y+3
ldd R19,y+4
st -y,R2
xcall lsl32
ldi R24,28
ldi R25,0
st -y,R24
xcall lsr32
movw R30,R16
ldi R24,<_CHR
ldi R25,>_CHR
add R30,R24
adc R31,R25
lpm R16,Z
xcall _LCDSendData
.dbline 444
; }
L24:
.dbline 441
inc R20
L26:
.dbline 441
cpi R20,8
brlo L23
X4:
.dbline -2
L22:
.dbline 0 ; func end
ld R20,y+
adiw R28,4
ret
.dbsym r a1 20 c
.dbsym l BitCount 5 c
.dbsym l Num 1 l
.dbend
.area data(ram, con, rel)
.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
L28:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
L29:
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
.area text(rom, con, rel)
.dbfile O:\2007全国电子设计大赛\键盘显示模块\RD_LCD1602B.c
.dbfunc e RunString _RunString fV
.dbsym s RunTimeCounter L29 i
.dbsym s StringHead L28 c
; SCREEN -> y+0
; a1 -> R12
; StringLong0 -> R10
; Point0 -> R14
; EndX -> y+31
; StartX -> R20
; Y -> y+27
; String -> R22,R23
.even
_RunString::
st -y,r19
st -y,r18
xcall push_xgsetF0FC
movw R22,R16
sbiw R28,17
ldd R20,y+29
.dbline -1
.dbline 455
; }
;
;
; /***********************************************************
; * 函数说明:滚屏字幕效果 *
; * 输入: 需要滚屏的字符串 长度 位置 *
; * 输出: 无 *
; * 调用函数:LOCATE() PRINT() *
; ***********************************************************/
; void RunString(char *String,char Y,char StartX,char EndX)
; {
.dbline 458
; static char StringHead = 0;
; char SCREEN[17];
; char a = 0;
.dbline 459
; char Point = StringHead;
lds R14,L28
.dbline 460
; char StringLong = StringLength(String);
movw R16,R22
xcall _StringLength
mov R10,R16
.dbline 463
; static unsigned int RunTimeCounter = 0;
;
; for (a = 0;a<EndX - StartX + 1;a++)
clr R12
xjmp L33
L30:
.dbline 464
; {
.dbline 465
; SCREEN[a] = String[Point];
mov R30,R14
clr R31
add R30,R22
adc R31,R23
ldd R2,z+0
movw R24,R28
mov R30,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 466
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -