model.lst
来自「移动机器人(小车)的物理坐标和逻辑坐标的转换源码」· LST 代码 · 共 1,693 行 · 第 1/5 页
LST
1,693 行
(0280) LCD_SEND_HALF_CHAR_LOW(Command);
2C4 B18B IN R24,0x0B
2C5 7887 ANDI R24,0x87
2C6 B98B OUT 0x0B,R24
2C7 2F80 MOV R24,R16
2C8 708F ANDI R24,0xF
2C9 0F88 LSL R24
2CA 0F88 LSL R24
2CB 0F88 LSL R24
2CC B02B IN R2,0x0B
2CD 2A28 OR R2,R24
2CE B82B OUT 0x0B,R2
(0281) LCD_E = HIGH;
2CF B18B IN R24,0x0B
2D0 6880 ORI R24,0x80
2D1 B98B OUT 0x0B,R24
(0282) LCD_E = LOW;
2D2 B18B IN R24,0x0B
2D3 778F ANDI R24,0x7F
2D4 B98B OUT 0x0B,R24
(0283) }
(0284) #else
(0285) LCD_DATA_PORT = Command;
(0286) LCD_E = HIGH;
(0287) LCD_E = LOW;
(0288) #endif
(0289) SetRead;
2D5 B18A IN R24,0x0A
2D6 7887 ANDI R24,0x87
2D7 B98A OUT 0x0A,R24
2D8 B18B IN R24,0x0B
2D9 6788 ORI R24,0x78
2DA B98B OUT 0x0B,R24
2DB 0000 NOP
2DC B185 IN R24,0x05
2DD 6081 ORI R24,1
2DE B985 OUT 0x05,R24
(0290) SetCommand;
2DF B185 IN R24,0x05
2E0 7F8D ANDI R24,0xFD
2E1 B985 OUT 0x05,R24
2E2 9508 RET
(0291) }
(0292)
(0293) /***********************************************************
(0294) * 函数说明:向LCD发送数据函数 *
(0295) * 输入: 需要发送的数据 *
(0296) * 输出: 无 *
(0297) * 调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
(0298) ***********************************************************/
(0299) void LCDSendData(UINT8 Data)
(0300) {
(0301) SetWrite;
_LCDSendData:
Data --> R16
2E3 B18A IN R24,0x0A
2E4 6788 ORI R24,0x78
2E5 B98A OUT 0x0A,R24
2E6 B18B IN R24,0x0B
2E7 6788 ORI R24,0x78
2E8 B98B OUT 0x0B,R24
2E9 0000 NOP
2EA B185 IN R24,0x05
2EB 7F8E ANDI R24,0xFE
2EC B985 OUT 0x05,R24
(0302) SetData;
2ED B185 IN R24,0x05
2EE 6082 ORI R24,2
2EF B985 OUT 0x05,R24
(0303) #ifndef _LCD1602_FULL_DATA_MODEL
(0304) {
(0305) LCD_SEND_HALF_CHAR_HIGH(Data);
2F0 B18B IN R24,0x0B
2F1 7887 ANDI R24,0x87
2F2 B98B OUT 0x0B,R24
2F3 2F80 MOV R24,R16
2F4 7F80 ANDI R24,0xF0
2F5 9586 LSR R24
2F6 B02B IN R2,0x0B
2F7 2A28 OR R2,R24
2F8 B82B OUT 0x0B,R2
(0306) LCD_E = HIGH;
2F9 B18B IN R24,0x0B
2FA 6880 ORI R24,0x80
2FB B98B OUT 0x0B,R24
(0307) LCD_E = LOW;
2FC B18B IN R24,0x0B
2FD 778F ANDI R24,0x7F
2FE B98B OUT 0x0B,R24
(0308) }
(0309)
(0310) {
(0311) LCD_SEND_HALF_CHAR_LOW(Data);
2FF B18B IN R24,0x0B
300 7887 ANDI R24,0x87
301 B98B OUT 0x0B,R24
302 2F80 MOV R24,R16
303 708F ANDI R24,0xF
304 0F88 LSL R24
305 0F88 LSL R24
306 0F88 LSL R24
307 B02B IN R2,0x0B
308 2A28 OR R2,R24
309 B82B OUT 0x0B,R2
(0312) LCD_E = HIGH;
30A B18B IN R24,0x0B
30B 6880 ORI R24,0x80
30C B98B OUT 0x0B,R24
(0313) LCD_E = LOW;
30D B18B IN R24,0x0B
30E 778F ANDI R24,0x7F
30F B98B OUT 0x0B,R24
(0314) }
(0315) #else
(0316) LCD_DATA_PORT = Data;
(0317) LCD_E = HIGH;
(0318) LCD_E = LOW;
(0319) #endif
(0320) SetRead;
310 B18A IN R24,0x0A
311 7887 ANDI R24,0x87
312 B98A OUT 0x0A,R24
313 B18B IN R24,0x0B
314 6788 ORI R24,0x78
315 B98B OUT 0x0B,R24
316 0000 NOP
317 B185 IN R24,0x05
318 6081 ORI R24,1
319 B985 OUT 0x05,R24
(0321) SetCommand;
31A B185 IN R24,0x05
31B 7F8D ANDI R24,0xFD
31C B985 OUT 0x05,R24
31D 9508 RET
(0322) }
(0323)
(0324) /***********************************************************
(0325) * 函数说明:等待LCD空闲状态函数 *
(0326) * 输入: 无 *
(0327) * 输出: 无 *
(0328) * 调用函数:LCDDelayUs() *
(0329) ***********************************************************/
(0330) void LCDWaitForReady(void)
(0331) {
(0332) #ifdef _USE_LCD_ONLY_WRITE
(0333) LCDDelayUs(500);
(0334) #else
(0335)
(0336) SetRead;
_LCDWaitForReady:
31E B18A IN R24,0x0A
31F 7887 ANDI R24,0x87
320 B98A OUT 0x0A,R24
321 B18B IN R24,0x0B
322 6788 ORI R24,0x78
323 B98B OUT 0x0B,R24
324 0000 NOP
325 B185 IN R24,0x05
326 6081 ORI R24,1
327 B985 OUT 0x05,R24
(0337) SetCommand;
328 B185 IN R24,0x05
329 7F8D ANDI R24,0xFD
32A B985 OUT 0x05,R24
(0338)
(0339) LCD_E = HIGH;
32B B18B IN R24,0x0B
32C 6880 ORI R24,0x80
32D B98B OUT 0x0B,R24
(0340) while (LCD_BF == 1); //RW=1,读PD7,为0表示空闲;
32E B189 IN R24,0x09
32F 9586 LSR R24
330 9586 LSR R24
331 9586 LSR R24
332 9586 LSR R24
333 9586 LSR R24
334 9586 LSR R24
335 7081 ANDI R24,1
336 3081 CPI R24,1
337 F3B1 BEQ 0x032E
(0341) LCD_E = LOW;
338 B18B IN R24,0x0B
339 778F ANDI R24,0x7F
33A B98B OUT 0x0B,R24
33B 9508 RET
_LCDSetXY:
Address0 --> R20
Y --> R10
X --> R22
33C D57C RCALL push_xgsetF00C
33D 2EA2 MOV R10,R18
33E 2F60 MOV R22,R16
(0342)
(0343) #endif
(0344) }
(0345) #else
(0346)
(0347) /***********************************************************
(0348) * 函数说明:向LCD发送指令函数 *
(0349) * 输入: 需要发送的指令 *
(0350) * 输出: 无 *
(0351) * 调用函数:LCD_SEND_HALF_CHAR_HIGH() *
(0352) * LCD_SEND_HALF_CHAR_LOW() *
(0353) ***********************************************************/
(0354) void LCDSendCommand(UINT8 Command)
(0355) {
(0356) SetCommand;
(0357) {
(0358) SetEnable;
(0359)
(0360) LCD_SEND_HALF_CHAR_HIGH(Command);
(0361)
(0362) SetDisable;
(0363) }
(0364) {
(0365) SetEnable;
(0366)
(0367) LCD_SEND_HALF_CHAR_LOW(Command);
(0368)
(0369) SetDisable;
(0370) }
(0371) SetCommand;
(0372) }
(0373)
(0374) /***********************************************************
(0375) * 函数说明:向LCD发送数据函数 *
(0376) * 输入: 需要发送的数据 *
(0377) * 输出: 无 *
(0378) * 调用函数:LCD_SEND_HALF_CHAR_HIGH() *
(0379) * LCD_SEND_HALF_CHAR_LOW() *
(0380) ***********************************************************/
(0381) void LCDSendData(UINT8 Data)
(0382) {
(0383) SetData;
(0384) {
(0385) SetEnable;
(0386)
(0387) LCD_SEND_HALF_CHAR_HIGH(Data);
(0388)
(0389) SetDisable;
(0390) }
(0391)
(0392) {
(0393) SetEnable;
(0394)
(0395) LCD_SEND_HALF_CHAR_LOW(Data);
(0396)
(0397) SetDisable;
(0398) }
(0399) SetCommand;
(0400) }
(0401)
(0402) /***********************************************************
(0403) * 函数说明:等待LCD空闲状态函数 *
(0404) * 输入: 无 *
(0405) * 输出: 无 *
(0406) * 调用函数:LCDDelayUs() *
(0407) ***********************************************************/
(0408) void LCDWaitForReady(void)
(0409) {
(0410) LCDDelayUs(30);
(0411) }
(0412)
(0413) #endif
(0414)
(0415)
(0416) /***********************************************************
(0417) * 函数说明:设置显示坐标函数 *
(0418) * 输入: x,y坐标值 *
(0419) * 输出: 无 *
(0420) * 调用函数:LCDWaitForReady() LCDSendCommand() *
(0421) ***********************************************************/
(0422) void LCDSetXY(UINT8 X,UINT8 Y)
(0423) {
(0424) UINT8 Address;
(0425) if (Y == 0)
33F 20AA TST R10
340 F419 BNE 0x0344
(0426) {
(0427) Address = 0x80 + X;
341 2F46 MOV R20,R22
342 5840 SUBI R20,0x80
(0428) }
343 C002 RJMP 0x0346
(0429) else
(0430) {
(0431) Address = 0xc0 + X;
344 2F46 MOV R20,R22
345 5440 SUBI R20,0x40
(0432) }
(0433)
(0434) LCDWaitForReady();
346 DFD7 RCALL _LCDWaitForReady
(0435) LCDSendCommand(Address);
347 2F04 MOV R16,R20
348 DF5F RCALL _LCDSendCommand
349 C576 RJMP pop_xgsetF00C
_LCDDisplayString:
String --> R20
34A 934A ST R20,-Y
34B 935A ST R21,-Y
34C 01A8 MOVW R20,R16
(0436) }
(0437)
(0438) /***********************************************************
(0439) * 函数说明:LCD字符串显示函数 *
(0440) * 输入: 要显示的字符串指针 *
(0441) * 输出: 无 *
(0442) * 调用函数:LCDWaitForReady() LCDSendData() *
(0443) ***********************************************************/
(0444) void LCDDisplayString(UINT8 *String)
(0445) {
34D C006 RJMP 0x0354
(0446) while(*String)
(0447) {
(0448) LCDWaitForReady();
34E DFCF RCALL _LCDWaitForReady
(0449) LCDSendData(*String);
34F 01FA MOVW R30,R20
350 8100 LDD R16,Z+0
351 DF91 RCALL _LCDSendData
(0450) String++;
352 5F4F SUBI R20,0xFF
353 4F5F SBCI R21,0xFF
354 01FA MOVW R30,R20
355 8020 LDD R2,Z+0
356 2022 TST R2
357 F7B1 BNE 0x034E
358 9159 LD R21,Y+
359 9149 LD R20,Y+
35A 9508 RET
_LCDDisplayNum:
a1 --> R20
BitCount --> Y,+5
Num --> Y,+1
35B D4AD RCALL push_arg4
35C
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?