📄 car.lst
字号:
(0152) //
(0153) void shifth(void) //控制高速
(0154) {
(0155) OCR1BH = 0xFF;
_shifth:
02CD EF8F LDI R24,0xFF
02CE BD89 OUT 0x29,R24
(0156) OCR1BL = 0xFF;
02CF BD88 OUT 0x28,R24
(0157) }
02D0 9508 RET
(0158) //////////////////////////////
(0159) //
(0160) void stop(void) //制动
(0161) {
(0162) OCR1BH = 0x00;
_stop:
02D1 2422 CLR R2
02D2 BC29 OUT 0x29,R2
(0163) OCR1BL = 0x00;
02D3 BC28 OUT 0x28,R2
(0164) }
02D4 9508 RET
(0165) //////////////////////////////
(0166) //
(0167) void shiftl(void) //控制低速
(0168) {
(0169) OCR1BH = 0x01;
_shiftl:
02D5 E081 LDI R24,1
02D6 BD89 OUT 0x29,R24
(0170) OCR1BL = 0xFF;
02D7 EF8F LDI R24,0xFF
02D8 BD88 OUT 0x28,R24
(0171) }
02D9 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\自动往返小汽车\源程序\自动往返小车lcd版\1602B_LCD.c
(0001) /**********************************************************
(0002) /* TC1602B LCD DISPLAY
(0003) /* LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0004) 入命令
(0005) /* LCD第一行显示寄存器地址:0X80-0X8F
(0006) /* LCD第二行显示寄存器地址:0XC0-0XCF
(0007) /* 光标命令:
(0008) /* LCD_write_char(0x0e,0); //光标开
(0009) /* LCD_write_char(0x0d,0); //光标所在字符闪烁
(0010) /* LCD_write_char(0x0c,0); //光标关
(0011) **********************************************************/
(0012) #include <io8515v.h>
(0013) #include <macros.h>
(0014) #include "1602LCD.h"
(0015)
(0016) void LCD_init(void)
(0017) {
(0018) LCD_CTRL_DDR|=LCD_RS | LCD_EN | LCD_RW;
_LCD_init:
02DA B387 IN R24,0x17
02DB 608E ORI R24,0xE
02DC BB87 OUT 0x17,R24
(0019) LCD_DATA_DDR|=LCD_DATA;
02DD B387 IN R24,0x17
02DE 6F80 ORI R24,0xF0
02DF BB87 OUT 0x17,R24
(0020) delay_nms(100);
02E0 E604 LDI R16,0x64
02E1 E010 LDI R17,0
02E2 D107 RCALL _delay_nms
(0021) LCD_write_char(0x28,0); //功能设置
02E3 2722 CLR R18
02E4 2733 CLR R19
02E5 E208 LDI R16,0x28
02E6 E010 LDI R17,0
02E7 D03A RCALL _LCD_write_char
(0022) LCD_write_char(0x28,0); //功能设置
02E8 2722 CLR R18
02E9 2733 CLR R19
02EA E208 LDI R16,0x28
02EB E010 LDI R17,0
02EC D035 RCALL _LCD_write_char
(0023) LCD_write_char(0x28,0); //功能设置
02ED 2722 CLR R18
02EE 2733 CLR R19
02EF E208 LDI R16,0x28
02F0 E010 LDI R17,0
02F1 D030 RCALL _LCD_write_char
(0024) LCD_write_char(0x28,0); //功能设置
02F2 2722 CLR R18
02F3 2733 CLR R19
02F4 E208 LDI R16,0x28
02F5 E010 LDI R17,0
02F6 D02B RCALL _LCD_write_char
(0025) LCD_write_char(0x28,0); //功能设置
02F7 2722 CLR R18
02F8 2733 CLR R19
02F9 E208 LDI R16,0x28
02FA E010 LDI R17,0
02FB D026 RCALL _LCD_write_char
(0026) LCD_write_char(0x28,0); //功能设置
02FC 2722 CLR R18
02FD 2733 CLR R19
02FE E208 LDI R16,0x28
02FF E010 LDI R17,0
0300 D021 RCALL _LCD_write_char
(0027) delay_nus(100);
0301 E604 LDI R16,0x64
0302 E010 LDI R17,0
0303 D0CE RCALL _delay_nus
(0028) LCD_write_char(0x06,0); //显示光标移动设置
0304 2722 CLR R18
0305 2733 CLR R19
0306 E006 LDI R16,6
0307 E010 LDI R17,0
0308 D019 RCALL _LCD_write_char
(0029) delay_nus(100);
0309 E604 LDI R16,0x64
030A E010 LDI R17,0
030B D0C6 RCALL _delay_nus
(0030) LCD_write_char(0x01,0); //显示清屏
030C 2722 CLR R18
030D 2733 CLR R19
030E E001 LDI R16,1
030F E010 LDI R17,0
0310 D011 RCALL _LCD_write_char
(0031) delay_nms(2);
0311 E002 LDI R16,2
0312 E010 LDI R17,0
0313 D0D6 RCALL _delay_nms
(0032) LCD_write_char(0x0C,0); //显示开
0314 2722 CLR R18
0315 2733 CLR R19
0316 E00C LDI R16,0xC
0317 E010 LDI R17,0
0318 D009 RCALL _LCD_write_char
(0033) delay_nus(100);
0319 E604 LDI R16,0x64
031A E010 LDI R17,0
(0034) }
031B C0B6 RJMP _delay_nus
(0035)
(0036) void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0037) {
(0038) LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
031C 9AC3 SBI 0x18,3
(0039) delay_nus(5);
031D E005 LDI R16,5
031E E010 LDI R17,0
031F D0B2 RCALL _delay_nus
(0040) LCD_EN_PORT &= ~LCD_EN;
0320 98C3 CBI 0x18,3
(0041) }
0321 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
0322 D0FD RCALL push_gset4
0323 2EC2 MOV R12,R18
0324 2ED3 MOV R13,R19
0325 2EA0 MOV R10,R16
0326 2EB1 MOV R11,R17
(0042)
(0043) /****************************************************************
(0044) /* LCD_write_char : 英文字符串显示函数
(0045) /* 输入参数:*s :英文字符串指针?
(0046) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0047) LCD第一行显示寄存器地址:0X80-0X8F
(0048) LCD第一行显示寄存器地址:0XC0-0XCF
(0049) *****************************************************************/
(0050) void LCD_write_char(unsigned command,unsigned data)
(0051) {
(0052) unsigned command_temp,data_temp;
(0053)
(0054) command_temp = command;
0327 2D4A MOV R20,R10
0328 2D5B MOV R21,R11
(0055) data_temp = data;
0329 2D6C MOV R22,R12
032A 2D7D MOV R23,R13
(0056) LCD_wait_Ready();
032B D052 RCALL _LCD_wait_Ready
(0057) LCD_RW_PORT &= ~LCD_RW; //RW=0
032C 98C2 CBI 0x18,2
(0058) if (command == 0)
032D 3040 CPI R20,0
032E 0745 CPC R20,R21
032F F471 BNE 0x033E
(0059) {
(0060) LCD_RS_PORT |= LCD_RS; //RS=1
0330 9AC1 SBI 0x18,1
(0061) LCD_DATA_PORT &= 0X0F;
0331 B388 IN R24,0x18
0332 708F ANDI R24,0xF
0333 BB88 OUT 0x18,R24
(0062) LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
0334 2F86 MOV R24,R22
0335 2F97 MOV R25,R23
0336 7F80 ANDI R24,0xF0
0337 7090 ANDI R25,0
0338 B228 IN R2,0x18
0339 2433 CLR R3
033A 2A28 OR R2,R24
033B 2A39 OR R3,R25
033C BA28 OUT 0x18,R2
(0063) }
033D C00D RJMP 0x034B
(0064) else
(0065) {
(0066) LCD_RS_PORT &= ~LCD_RS; //RS=0
033E 98C1 CBI 0x18,1
(0067) LCD_DATA_PORT &= 0X0F;
033F B388 IN R24,0x18
0340 708F ANDI R24,0xF
0341 BB88 OUT 0x18,R24
(0068) LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
0342 2F84 MOV R24,R20
0343 2F95 MOV R25,R21
0344 7F80 ANDI R24,0xF0
0345 7090 ANDI R25,0
0346 B228 IN R2,0x18
0347 2433 CLR R3
0348 2A28 OR R2,R24
0349 2A39 OR R3,R25
034A BA28 OUT 0x18,R2
(0069) }
(0070) LCD_en_write();
034B DFD0 RCALL _LCD_en_write
(0071) command_temp=command_temp << 4; //send low 4bit
034C 0F44 LSL R20
034D 1F55 ROL R21
034E 0F44 LSL R20
034F 1F55 ROL R21
0350 0F44 LSL R20
0351 1F55 ROL R21
0352 0F44 LSL R20
0353 1F55 ROL R21
(0072) data_temp=data_temp << 4;
0354 0F66 LSL R22
0355 1F77 ROL R23
0356 0F66 LSL R22
0357 1F77 ROL R23
0358 0F66 LSL R22
0359 1F77 ROL R23
035A 0F66 LSL R22
035B 1F77 ROL R23
(0073) LCD_DATA_PORT &= 0X0F;
035C B388 IN R24,0x18
035D 708F ANDI R24,0xF
035E BB88 OUT 0x18,R24
(0074) if (command==0)
035F 20AA TST R10
0360 F461 BNE 0x036D
0361 20BB TST R11
0362 F451 BNE 0x036D
(0075) LCD_DATA_PORT |= data_temp&0xf0;
0363 2F86 MOV R24,R22
0364 2F97 MOV R25,R23
0365 7F80 ANDI R24,0xF0
0366 7090 ANDI R25,0
0367 B228 IN R2,0x18
0368 2433 CLR R3
0369 2A28 OR R2,R24
036A 2A39 OR R3,R25
036B BA28 OUT 0x18,R2
036C C009 RJMP 0x0376
(0076) else
(0077) LCD_DATA_PORT |= command_temp&0xf0;
036D 2F84 MOV R24,R20
036E 2F95 MOV R25,R21
036F 7F80 ANDI R24,0xF0
0370 7090 ANDI R25,0
0371 B228 IN R2,0x18
0372 2433 CLR R3
0373 2A28 OR R2,R24
0374 2A39 OR R3,R25
0375 BA28 OUT 0x18,R2
(0078) LCD_en_write();
0376 DFA5 RCALL _LCD_en_write
(0079) LCD_RW_PORT |= LCD_RW;
0377 9AC2 SBI 0x18,2
(0080) LCD_RS_PORT ^= LCD_RS;
0378 E082 LDI R24,2
0379 B228 IN R2,0x18
037A 2628 EOR R2,R24
037B BA28 OUT 0x18,R2
(0081) }
037C D084 RCALL pop_gset4
037D 9508 RET
(0082)
(0083) void LCD_wait_Ready(void) //等待LCD空闲
(0084) {
(0085) LCD_DATA_DDR &= ~0x80; //PB7 I/O口方向设置为输入
_LCD_wait_Ready:
037E 98BF CBI 0x17,7
(0086) LCD_RW_PORT |= LCD_RW; //RW=1
037F 9AC2 SBI 0x18,2
(0087) LCD_RS_PORT &= ~LCD_RS; //RS=0
0380 98C1 CBI 0x18,1
(0088) LCD_EN_PORT |= LCD_EN; //EN=1
0381 9AC3 SBI 0x18,3
(0089) while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
0382 99B7 SBIC 0x16,7
0383 C003 RJMP 0x0387
0384 E001 LDI R16,1
0385 E010 LDI R17,0
0386 C002 RJMP 0x0389
0387 2700 CLR R16
0388 2711 CLR R17
0389 3000 CPI R16,0
038A 0701 CPC R16,R17
038B F3B1 BEQ 0x0382
(0090) LCD_EN_PORT &= ~LCD_EN; //EN=0
038C 98C3 CBI 0x18,3
(0091) LCD_DATA_DDR |= 0xf0;
038D B387 IN R24,0x17
038E 6F80 ORI R24,0xF0
038F BB87 OUT 0x17,R24
(0092) }
0390 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
0391 D088 RCALL push_gset2
0392 2F42 MOV R20,R18
0393 2F60 MOV R22,R16
(0093)
(0094) /**********************************************************
(0095) /* LCD_set_xy : 设置LCD显示的起始位置
(0096) /* 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0097) LCD第一行显示寄存器地址:0X80-0X8F
(0098) LCD第一行显示寄存器地址:0XC0-0XCF
(0099) ***********************************************************/
(0100) void LCD_set_xy( unsigned char x, unsigned char y )
(0101) {
(0102) unsigned char address;
(0103) if (y == 0) address = 0x80 + x;
0394 2344 TST R20
0395 F419 BNE 0x0399
0396 2F46 MOV R20,R22
0397 5840 SUBI R20,0x80
0398 C002 RJMP 0x039B
(0104) else
(0105) address = 0xC0 + x;
0399 2F46 MOV R20,R22
039A 5440 SUBI R20,0x40
(0106) LCD_write_char( address, 0 );
039B 2722 CLR R18
039C 2733 CLR R19
039D 2F04 MOV R16,R20
039E 2711 CLR R17
039F DF82 RCALL _LCD_write_char
(0107) }
03A0 D05C RCALL pop_gset2
03A1 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
03A2 D07A RCALL push_gset3
03A3 2EA2 MOV R10,R18
03A4 2F60 MOV R22,R16
03A5 814E LDD R20,Y+6
03A6 815F LDD R21,Y+7
(0108) /**********************************************************
(0109) /* LCD_write_string : 英文字符串显示函数
(0110) /* 输入参数:*s :英文字符串指针;
(0111) /* X、Y : 显示字符串的位置
(0112) ***********************************************************/
(0113) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0114) {
(0115) LCD_set_xy( X, Y );
03A7 2D2A MOV R18,R10
03A8 2F06 MOV R16,R22
03A9 DFE7 RCALL _LCD_set_xy
03AA C009 RJMP 0x03B4
(0116) while (*s)
(0117) {
(0118) LCD_write_char( 0, *s );
03AB 2FE4 MOV R30,R20
03AC 2FF5 MOV R31,R21
03AD 8120 LDD R18,Z+0
03AE 2733 CLR R19
03AF 2700 CLR R16
03B0 2711 CLR R17
03B1 DF70 RCALL _LCD_write_char
(0119) s ++;
03B2 5F4F SUBI R20,0xFF
03B3 4F5F SBCI R21,0xFF
03B4 2FE4 MOV R30,R20
03B5 2FF5 MOV R31,R21
03B6 8020 LDD R2,Z+0
03B7 2022 TST R2
03B8 F791 BNE 0x03AB
(0120) }
(0121) }
03B9 D045 RCALL pop_gset3
03BA 9508 RET
_LCD_write:
data --> Y+4
Y --> R22
X --> R20
03BB D05E RCALL push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -