📄 595_1602_example.lst
字号:
0138 7D8F ANDI R24,0xDF
0139 8380 STD Z+0,R24
013A DF80 RCALL _refreshVirtualPORT
013B D1ED RCALL <created procedures>
(0293) }
(0294) SetCommand;
013C 7E8F ANDI R24,0xEF
013D 8380 STD Z+0,R24
013E DF7C RCALL _refreshVirtualPORT
013F D1B7 RCALL pop_gset1
0140 9508 RET
_LCDSendData:
Data --> R20
0141 D1B2 RCALL push_gset1
0142 2F40 MOV R20,R16
0143 D1E5 RCALL <created procedures>
(0295) }
(0296)
(0297) /********************************************************
(0298) * 函数说明:向LCD发送数据函数 *
(0299) ********************************************************/
(0300) void LCDSendData(char Data)
(0301) {
(0302) SetData;
0144 6180 ORI R24,0x10
0145 8380 STD Z+0,R24
0146 DF74 RCALL _refreshVirtualPORT
0147 D1E1 RCALL <created procedures>
(0303) {
(0304) SetEnable;
0148 6280 ORI R24,0x20
0149 8380 STD Z+0,R24
014A DF70 RCALL _refreshVirtualPORT
014B D1E9 RCALL 0x0335
(0305)
(0306) LCD_SendHalfCharHigh(Data);
014C DF6E RCALL _refreshVirtualPORT
014D D1DB RCALL <created procedures>
(0307)
(0308) SetDisable;
014E 7D8F ANDI R24,0xDF
014F 8380 STD Z+0,R24
0150 DF6A RCALL _refreshVirtualPORT
0151 D1D7 RCALL <created procedures>
(0309) }
(0310)
(0311) {
(0312) SetEnable;
0152 6280 ORI R24,0x20
0153 8380 STD Z+0,R24
0154 DF66 RCALL _refreshVirtualPORT
0155 D1F4 RCALL 0x034A
0156 D1EC RCALL 0x0343
(0313)
(0314) LCD_SendHalfCharLow(Data);
0157 DF63 RCALL _refreshVirtualPORT
0158 D1D0 RCALL <created procedures>
(0315)
(0316) SetDisable;
0159 7D8F ANDI R24,0xDF
015A 8380 STD Z+0,R24
015B DF5F RCALL _refreshVirtualPORT
015C D1CC RCALL <created procedures>
(0317) }
(0318) SetCommand;
015D 7E8F ANDI R24,0xEF
015E 8380 STD Z+0,R24
015F DF5B RCALL _refreshVirtualPORT
0160 D196 RCALL pop_gset1
0161 9508 RET
(0319) }
(0320)
(0321) /********************************************************
(0322) * 函数说明:等待LCD空闲状态函数 *
(0323) ********************************************************/
(0324) void LCDWaitForReady(void)
(0325) {
(0326) LCDDelayUs(30);
_LCDWaitForReady:
0162 E10E LDI R16,0x1E
0163 E010 LDI R17,0
0164 DF9D RCALL _LCDDelayUs
0165 9508 RET
_LCDSetXY:
Address --> R20
Y --> R20
X --> R22
0166 D18B RCALL push_gset2
0167 2F42 MOV R20,R18
0168 2F60 MOV R22,R16
(0327) }
(0328)
(0329) #endif
(0330) /********************************************************
(0331) * 函数说明:设置显示坐标函数 *
(0332) ********************************************************/
(0333) void LCDSetXY(char X,char Y)
(0334) {
(0335) char Address;
(0336) if (Y == 0)
0169 2344 TST R20
016A F419 BNE 0x016E
(0337) {
(0338) Address = 0x80 + X;
016B 2F46 MOV R20,R22
016C 5840 SUBI R20,0x80
(0339) }
016D C002 RJMP 0x0170
(0340) else
(0341) {
(0342) Address = 0xc0 + X;
016E 2F46 MOV R20,R22
016F 5440 SUBI R20,0x40
(0343) }
(0344)
(0345) LCDWaitForReady();
0170 DFF1 RCALL _LCDWaitForReady
(0346) LCDSendCommand(Address);
0171 2F04 MOV R16,R20
0172 DFAD RCALL _LCDSendCommand
0173 D174 RCALL pop_gset2
0174 9508 RET
_LCDDisplayString:
String --> R20
0175 D17E RCALL push_gset1
0176 01A8 MOVW R20,R16
(0347) }
(0348)
(0349) /********************************************************
(0350) * 函数说明:LCD字符串显示函数 *
(0351) ********************************************************/
(0352) void LCDDisplayString(char *String)
(0353) {
0177 C006 RJMP 0x017E
(0354) while(*String)
(0355) {
(0356) LCDWaitForReady();
0178 DFE9 RCALL _LCDWaitForReady
(0357) LCDSendData(*String);
0179 01FA MOVW R30,R20
017A 8100 LDD R16,Z+0
017B DFC5 RCALL _LCDSendData
(0358) String++;
017C 5F4F SUBI R20,0xFF
017D 4F5F SBCI R21,0xFF
017E 01FA MOVW R30,R20
017F 8020 LDD R2,Z+0
0180 2022 TST R2
0181 F7B1 BNE 0x0178
0182 D174 RCALL pop_gset1
0183 9508 RET
_LCDDisplayNum:
a --> R20
BitCount --> Y+6
Num --> Y+2
0184 D142 RCALL push_arg4
0185 D16E RCALL push_gset1
(0359) }
(0360) }
(0361)
(0362) /********************************************************
(0363) * 函数说明:数值显示函数(HEX) *
(0364) * 输入: 需要显示的数字(无符号长整形) *
(0365) ********************************************************/
(0366) void LCDDisplayNum(unsigned long Num,char BitCount)
(0367) {
(0368) char a = 0;
0186 2744 CLR R20
(0369) for (a = 8-BitCount ;a<8;a++)
0187 E048 LDI R20,0x8
0188 800E LDD R0,Y+6
0189 1940 SUB R20,R0
018A C01B RJMP 0x01A6
(0370) {
(0371) LCDSendData(CHR[(Num<<(a<<2))>>28]);
018B 2E24 MOV R2,R20
018C 2433 CLR R3
018D 0C22 LSL R2
018E 1C33 ROL R3
018F 0C22 LSL R2
0190 1C33 ROL R3
0191 01FE MOVW R30,R28
0192 8042 LDD R4,Z+2
0193 8053 LDD R5,Z+3
0194 8064 LDD R6,Z+4
0195 8075 LDD R7,Z+5
0196 922A ST R2,-Y
0197 0182 MOVW R16,R4
0198 0193 MOVW R18,R6
0199 D171 RCALL lsl32
019A E18C LDI R24,0x1C
019B E090 LDI R25,0
019C 938A ST R24,-Y
019D D17F RCALL lsr32
019E 01F8 MOVW R30,R16
019F E286 LDI R24,0x26
01A0 E090 LDI R25,0
01A1 0FE8 ADD R30,R24
01A2 1FF9 ADC R31,R25
01A3 9104 LPM R16,0(Z)
01A4 DF9C RCALL _LCDSendData
01A5 9543 INC R20
01A6 3048 CPI R20,0x8
01A7 F318 BCS 0x018B
01A8 D14E RCALL pop_gset1
01A9 9624 ADIW R28,4
01AA 9508 RET
_RunString:
StringLong --> R22
SCREEN --> Y+0
Point --> R14
a --> R10
EndX --> R12
StartX --> R20
Y --> Y+31
Direction --> R22
String --> Y+27
01AB D11B RCALL push_arg4
01AC D13F RCALL push_gset5
01AD 2F62 MOV R22,R18
01AE 9761 SBIW R28,0x11
01AF A149 LDD R20,Y+33
01B0 A0CB LDD R12,Y+35
(0372) }
(0373) }
(0374)
(0375) /********************************************************
(0376) * 函数说明:滚屏字幕效果 *
(0377) * 输入: 需要滚屏的字符串 长度 位置 *
(0378) ********************************************************/
(0379) void RunString(char *String,char Direction,char Y,char StartX,char EndX)
(0380) {
(0381) static char StringHead = 0;
(0382) char SCREEN[17];
(0383) char a = 0;
01B1 24AA CLR R10
(0384) char Point = StringHead;
01B2 90E00065 LDS R14,StringHead
(0385) char StringLong = StringLength(String);
01B4 8D0B LDD R16,Y+27
01B5 8D1C LDD R17,Y+28
01B6 D049 RCALL _StringLength
01B7 2F60 MOV R22,R16
(0386) static unsigned int RunTimeCounter = 0;
(0387)
(0388) for (a = 0;a<EndX - StartX + 1;a++)
01B8 C00E RJMP 0x01C7
(0389) {
(0390) SCREEN[a] = String[Point];
01B9 2DEE MOV R30,R14
01BA 27FF CLR R31
01BB 8C0B LDD R0,Y+27
01BC 8C1C LDD R1,Y+28
01BD 0DE0 ADD R30,R0
01BE 1DF1 ADC R31,R1
01BF 8020 LDD R2,Z+0
01C0 D190 RCALL 0x0351
01C1 8220 STD Z+0,R2
(0391) Point ++;
01C2 94E3 INC R14
(0392) if (Point == StringLong)
01C3 16E6 CP R14,R22
01C4 F409 BNE 0x01C6
(0393) {
(0394) Point = 0;
01C5 24EE CLR R14
01C6 94A3 INC R10
01C7 2D8C MOV R24,R12
01C8 1B84 SUB R24,R20
01C9 5F8F SUBI R24,0xFF
01CA 16A8 CP R10,R24
01CB F368 BCS 0x01B9
(0395) }
(0396) }
(0397)
(0398) for (;a < 17;a++)
01CC C004 RJMP 0x01D1
(0399) {
(0400) SCREEN[a] =' ';
01CD D183 RCALL 0x0351
01CE E280 LDI R24,0x20
01CF 8380 STD Z+0,R24
01D0 94A3 INC R10
01D1 2D8A MOV R24,R10
01D2 3181 CPI R24,0x11
01D3 F3C8 BCS 0x01CD
(0401) }
(0402)
(0403) RunTimeCounter ++;
01D4 91800066 LDS R24,RunTimeCounter
01D6 91900067 LDS R25,RunTimeCounter+1
01D8 9601 ADIW R24,1
01D9 93900067 STS RunTimeCounter+1,R25
01DB 93800066 STS RunTimeCounter,R24
(0404) if (RunTimeCounter >RunStringSpeed)
01DD E08B LDI R24,0xB
01DE E090 LDI R25,0
01DF 90200066 LDS R2,RunTimeCounter
01E1 90300067 LDS R3,RunTimeCounter+1
01E3 1582 CP R24,R2
01E4 0593 CPC R25,R3
01E5 F478 BCC 0x01F5
(0405) {
(0406) StringHead ++;
01E6 91800065 LDS R24,StringHead
01E8 5F8F SUBI R24,0xFF
01E9 93800065 STS StringHead,R24
(0407) RunTimeCounter = 0;
01EB 2422 CLR R2
01EC 2433 CLR R3
01ED 92300067 STS RunTimeCounter+1,R3
01EF 92200066 STS RunTimeCounter,R2
(0408) if (StringHead == StringLong)
01F1 1786 CP R24,R22
01F2 F411 BNE 0x01F5
(0409) {
(0410) StringHead = 0;
01F3 92200065 STS StringHead,R2
(0411) }
(0412) }
(0413)
(0414) Locate(StartX,Y)
01F5 8D2F LDD R18,Y+31
01F6 5021 SUBI R18,1
01F7 2F04 MOV R16,R20
01F8 5001 SUBI R16,1
01F9 DF6C RCALL _LCDSetXY
(0415) Print(SCREEN)
01FA 018E MOVW R16,R28
01FB DF79 RCALL _LCDDisplayString
01FC 9661 ADIW R28,0x11
01FD D0EC RCALL pop_gset5
01FE 9624 ADIW R28,4
01FF 9508 RET
_StringLength:
n --> R20
String --> R16
0200 D0F3 RCALL push_gset1
(0416) }
(0417)
(0418) /********************************************************
(0419) * 函数说明:字符串长度测试函数 *
(0420) ********************************************************/
(0421) char StringLength(char *String)
(0422) {
(0423) char n = 0;
0201 2744 CLR R20
0202 C003 RJMP 0x0206
(0424) while (*String)
(0425) {
(0426) n++;
0203 9543 INC R20
(0427) String ++;
0204 5F0F SUBI R16,0xFF
0205 4F1F SBCI R17,0xFF
0206 01F8 MOVW R30,R16
0207 8020 LDD R2,Z+0
0208 2022 TST R2
0209 F7C9 BNE 0x0203
(0428) }
(0429)
(0430) return n;
020A 2F04 MOV R16,R20
020B D0EB RCALL pop_gset1
020C 9508 RET
_Flash:
StringLong --> R20
a --> R22
Y --> R10
X --> R12
Icon --> R14
String --> Y+10
020D D0B9 RCALL push_arg4
020E D0DD RCALL push_gset5
020F 2EE2 MOV R14,R18
0210 84CE LDD R12,Y+14
0211 88A8 LDD R10,Y+16
(0431) }
(0432)
(0433) /********************************************************
(0434) * 函数说明:闪烁显示函数 *
(0435) ********************************************************/
(0436) void Flash(char *String,char Icon,char X,char Y)
(0437) {
(0438) char a = 0;
0212 2766 CLR R22
(0439) char StringLong = StringLength(String);
0213 850A LDD R16,Y+10
0214 851B LDD R17,Y+11
0215 DFEA RCALL _StringLength
0216 2F40 MOV R20,R16
(0440)
(0441) if (FlashTimeCounter % FlashTimeOut > (FlashTimeOut >> 1))
0217 E220 LDI R18,0x20
0218 E033 LDI R19,3
0219 9100006C LDS R16,FlashTimeCounter
021B 9110006D LDS R17,FlashTimeCounter+1
021D D0AE RCALL mod16u
021E E980 LDI R24,0x90
021F E091 LDI R25,1
0220 1780 CP R24,R16
0221 0791 CPC R25,R17
0222 F448 BCC 0x022C
(0442) {
(0443) Locate(X,Y)
0223 2D2A MOV R18,R10
0224 5021 SUBI R18,1
0225 2D0C MOV R16,R12
0226 5001 SUBI R16,1
0227 DF3E RCALL _LCDSetXY
(0444) Print(String)
0228 850A LDD R16,Y+10
0229 851B LDD R17,Y+11
022A DF4A RCALL _LCDDisplayString
(0445) }
022B C00F RJMP 0x023B
(0446) else
(0447) {
(0448) for (a = X ;a < X+StringLong;a++)
022C 2D6C MOV R22,R12
022D C009 RJMP 0x0237
(0449) {
(0450) Locate(a,Y)
022E 2D2A MOV R18,R10
022F 5021 SUBI R18,1
0230 2F06 MOV R16,R22
0231 5001 SUBI R16,1
0232 DF33 RCALL _LCDSetXY
(0451) LCDWaitForReady();
0233 DF2E RCALL _LCDWaitForReady
(0452) LCDSendData(Icon);
0234 2D0E MOV R16,R14
0235 DF0B RCALL _LCDSendData
0236 9563 INC R22
0237 2C2C MOV R2,R12
0238 0E24 ADD R2,R20
0239 1562 CP R22,R2
023A F398 BCS 0x022E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -