📄 1602test.lst
字号:
02BF E005 LDI R16,5
02C0 E010 LDI R17,0
02C1 D086 RCALL _delay_nms
(0216)
(0217) vfd_write_command(0x38,1);//显示模式设置(从此之后均需vfd空闲)
02C2 E021 LDI R18,1
02C3 E308 LDI R16,0x38
02C4 D00C RCALL _vfd_write_command
(0218) vfd_write_command(0x08,1);//显示关闭
02C5 E021 LDI R18,1
02C6 E008 LDI R16,0x8
02C7 D009 RCALL _vfd_write_command
(0219) vfd_write_command(0x01,1);//显示清屏
02C8 E021 LDI R18,1
02C9 E001 LDI R16,1
02CA D006 RCALL _vfd_write_command
(0220) vfd_write_command(0x06,1);//显示光标移动设置
02CB E021 LDI R18,1
02CC E006 LDI R16,6
02CD D003 RCALL _vfd_write_command
(0221) vfd_write_command(0x0c,1);//显示开及光标设置
02CE E021 LDI R18,1
02CF E00C LDI R16,0xC
(0222) }
02D0 C000 RJMP _vfd_write_command
02D1 940E038F CALL push_gset2
02D3 2F62 MOV R22,R18
02D4 2F40 MOV R20,R16
(0223) //写指令函数: E=高脉冲 RS=0 RW=0
(0224) void vfd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测VFD忙信号
(0225) {
(0226) if(wait_en)wait_enable();//若wait_en为1,则要检测VFD忙信号,等待其空闲
02D5 2366 TST R22
02D6 F009 BEQ 0x02D8
02D7 D018 RCALL _wait_enable
(0227) vfd_control_port&=~vfd_RS;//RS=0
02D8 9895 CBI 0x12,5
(0228) vfd_control_port&=~vfd_RW;//RW=0
02D9 9897 CBI 0x12,7
(0229) vfd_control_port&=~vfd_EN;//E=0,下面给VFD一个高脉冲
02DA 9896 CBI 0x12,6
(0230) NOP();
02DB 0000 NOP
(0231) vfd_control_port|=vfd_EN;//E=1
02DC 9A96 SBI 0x12,6
(0232) vfd_data_port=command;
02DD BB48 OUT 0x18,R20
(0233) vfd_control_port&=~vfd_EN;//重设E=0
02DE 9896 CBI 0x12,6
(0234) }
02DF 940E036F CALL pop_gset2
02E1 9508 RET
_vfd_write_data:
char_data --> R20
02E2 940E0378 CALL push_gset1
02E4 2F40 MOV R20,R16
(0235) //写数据函数: E =高脉冲 RS=1 RW=0
(0236) void vfd_write_data(unsigned char char_data)
(0237) {
(0238) wait_enable();//等待VFD空闲
02E5 D00A RCALL _wait_enable
(0239) vfd_control_port|=vfd_RS;//RS=1
02E6 9A95 SBI 0x12,5
(0240) vfd_control_port&=~vfd_RW;//RW=0
02E7 9897 CBI 0x12,7
(0241)
(0242) vfd_control_port&=~vfd_EN;//E=0,下面给VFD一个高脉冲
02E8 9896 CBI 0x12,6
(0243) NOP();
02E9 0000 NOP
(0244) vfd_control_port|=vfd_EN;//E=1
02EA 9A96 SBI 0x12,6
(0245) vfd_data_port=char_data;
02EB BB48 OUT 0x18,R20
(0246) vfd_control_port&=~vfd_EN;//重设E=0
02EC 9896 CBI 0x12,6
(0247) }
02ED 940E037B CALL pop_gset1
02EF 9508 RET
(0248) //正常读写操作之前必须检测VFD控制器状态:E=1 RS=0 RW=1;DB7: 0 VFD控制器空闲,1 VFD控制器忙。
(0249) //检测忙信号,等待VFD空闲函数
(0250) void wait_enable(void)
(0251) {
(0252) //delay_nms(10);
(0253) vfd_busy_ddr&=~busy;//设置busy口为输入
_wait_enable:
02F0 98BF CBI 0x17,7
(0254) vfd_control_port&=~vfd_RS;//RS=0
02F1 9895 CBI 0x12,5
(0255) vfd_control_port|=vfd_RW;//RW=1
02F2 9A97 SBI 0x12,7
(0256) NOP();
02F3 0000 NOP
(0257) vfd_control_port|=vfd_EN;//E=1
02F4 9A96 SBI 0x12,6
(0258) while(vfd_busy_pin&busy);//等待VFD_DB7为0
02F5 99B7 SBIC 0x16,7
02F6 CFFE RJMP 0x02F5
(0259) vfd_control_port&=~vfd_EN;//重设E=0
02F7 9896 CBI 0x12,6
(0260) vfd_busy_ddr|=busy;//设置busy口为输出
02F8 9ABF SBI 0x17,7
(0261) }
02F9 9508 RET
_display_a_char:
position_tem --> R22
char_data --> R20
position --> R10
02FA 940E0393 CALL push_gset3
02FC 2F42 MOV R20,R18
02FD 2EA0 MOV R10,R16
(0262) //指定位置显示一个字符:第一行位置0~15,第二行16~31
(0263) //显示一个字符函数
(0264) void display_a_char(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
(0265) {
(0266) unsigned char position_tem;
(0267) if(position>=0x10)
02FE 2D8A MOV R24,R10
02FF 3180 CPI R24,0x10
0300 F018 BCS 0x0304
(0268) position_tem=position+0xb0;
0301 2F68 MOV R22,R24
0302 5560 SUBI R22,0x50
0303 C002 RJMP 0x0306
(0269) else
(0270) position_tem=position+0x80;
0304 2D6A MOV R22,R10
0305 5860 SUBI R22,0x80
(0271) vfd_write_command(position_tem,1);
0306 E021 LDI R18,1
0307 2F06 MOV R16,R22
0308 DFC8 RCALL _vfd_write_command
(0272) vfd_write_data(char_data);
0309 2F04 MOV R16,R20
030A DFD7 RCALL _vfd_write_data
(0273) }
030B 940E0372 CALL pop_gset3
030D 9508 RET
_d_a_s:
col_tem --> R20
i --> R22
ptr --> R10
col --> R20
030E 940E0393 CALL push_gset3
0310 0159 MOVW R10,R18
0311 2F40 MOV R20,R16
(0274) //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
(0275) //显示一行连续字符串函数
(0276) void d_a_s(unsigned char col,unsigned char *ptr)//参数col指定行,*ptr指字符串数组的首指针
(0277) {
(0278) unsigned char col_tem,i;
(0279) col_tem=col<<4;//若col为1(即在VFD第二行显示字符串),先把col左移4位,使显示字符的首位置改到第二行首位,即位置16
0312 2F84 MOV R24,R20
0313 708F ANDI R24,0xF
0314 9582 SWAP R24
0315 2F48 MOV R20,R24
(0280) for(i=0;i<16;i++)
0316 2766 CLR R22
0317 C00A RJMP 0x0322
(0281) display_a_char(col_tem++,*(ptr+i));
0318 2FE6 MOV R30,R22
0319 27FF CLR R31
031A 0DEA ADD R30,R10
031B 1DFB ADC R31,R11
031C 8120 LDD R18,Z+0
031D 2E24 MOV R2,R20
031E 5F4F SUBI R20,0xFF
031F 2D02 MOV R16,R2
0320 DFD9 RCALL _display_a_char
0321 9563 INC R22
0322 3160 CPI R22,0x10
0323 F3A0 BCS 0x0318
(0282) }
0324 940E0372 CALL pop_gset3
0326 9508 RET
_display_a_ch_r:
position_tem --> R20
char_data --> R22
position --> R10
0327 940E0393 CALL push_gset3
0329 2F62 MOV R22,R18
032A 2EA0 MOV R10,R16
(0283) //光标定位子程序
(0284) void display_a_ch_r(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
(0285) {
(0286) unsigned char position_tem;
(0287) if(position>=0x10)
032B 2D8A MOV R24,R10
032C 3180 CPI R24,0x10
032D F018 BCS 0x0331
(0288) position_tem=position+0xb0;
032E 2F48 MOV R20,R24
032F 5540 SUBI R20,0x50
0330 C002 RJMP 0x0333
(0289) else
(0290) position_tem=position+0x80;
0331 2D4A MOV R20,R10
0332 5840 SUBI R20,0x80
(0291) vfd_write_command(position_tem,1);
0333 E021 LDI R18,1
0334 2F04 MOV R16,R20
0335 DF9B RCALL _vfd_write_command
(0292) vfd_write_data(char_data);
0336 2F06 MOV R16,R22
0337 DFAA RCALL _vfd_write_data
(0293) vfd_write_command(position_tem,1);
0338 E021 LDI R18,1
0339 2F04 MOV R16,R20
033A DF96 RCALL _vfd_write_command
(0294) }
033B 940E0372 CALL pop_gset3
033D 9508 RET
(0295) /*---------------------------------------延时函数-------------------------------------*/
(0296) //1ms延时函数
(0297) void delay_1ms(void)
(0298) {
(0299) unsigned int i;
(0300) for(i=0;i<600;i++);
_delay_1ms:
i --> R16
033E 2700 CLR R16
033F 2711 CLR R17
0340 C002 RJMP 0x0343
0341 5F0F SUBI R16,0xFF
0342 4F1F SBCI R17,0xFF
0343 3508 CPI R16,0x58
0344 E0E2 LDI R30,2
0345 071E CPC R17,R30
0346 F3D0 BCS 0x0341
(0301) }
0347 9508 RET
_delay_nms:
i --> R20
n --> R22
0348 940E038F CALL push_gset2
034A 01B8 MOVW R22,R16
(0302) //n ms延时函数
(0303) void delay_nms(unsigned int n)
(0304) {
(0305) unsigned int i;
(0306) for(i=0;i<n;i++)delay_1ms();
034B 2744 CLR R20
034C 2755 CLR R21
034D C003 RJMP 0x0351
034E DFEF RCALL _delay_1ms
034F 5F4F SUBI R20,0xFF
0350 4F5F SBCI R21,0xFF
0351 1746 CP R20,R22
0352 0757 CPC R21,R23
0353 F3D0 BCS 0x034E
(0307) }
FILE: <library>
0354 940E036F CALL pop_gset2
0356 9508 RET
mod8u:
0357 9468 BSET 6
0358 C001 RJMP xdiv8u
div8u:
0359 94E8 BCLR 6
xdiv8u:
035A 932A ST R18,-Y
035B 92FA ST R15,-Y
035C 92EA ST R14,-Y
035D 24FF CLR R15
035E 24EE CLR R14
035F E120 LDI R18,0x10
0360 0F00 LSL R16
0361 1CFF ROL R15
0362 1CEE ROL R14
0363 16E1 CP R14,R17
0364 F010 BCS 0x0367
0365 1AE1 SUB R14,R17
0366 9503 INC R16
0367 952A DEC R18
0368 F7B9 BNE 0x0360
0369 F40E BRTC 0x036B
036A 2D0E MOV R16,R14
036B 90E9 LD R14,Y+
036C 90F9 LD R15,Y+
036D 9129 LD R18,Y+
036E 9508 RET
pop_gset2:
036F E0E2 LDI R30,2
0370 940C037C JMP pop
pop_gset3:
0372 E0E4 LDI R30,4
0373 940C037C JMP pop
pop_gset4:
0375 E0E8 LDI R30,0x8
0376 940C037C JMP pop
push_gset1:
0378 935A ST R21,-Y
0379 934A ST R20,-Y
037A 9508 RET
pop_gset1:
037B E0E1 LDI R30,1
pop:
037C 9149 LD R20,Y+
037D 9159 LD R21,Y+
037E FDE0 SBRC R30,0
037F 9508 RET
0380 9169 LD R22,Y+
0381 9179 LD R23,Y+
0382 FDE1 SBRC R30,1
0383 9508 RET
0384 90A9 LD R10,Y+
0385 90B9 LD R11,Y+
0386 FDE2 SBRC R30,2
0387 9508 RET
0388 90C9 LD R12,Y+
0389 90D9 LD R13,Y+
038A FDE3 SBRC R30,3
038B 9508 RET
038C 90E9 LD R14,Y+
038D 90F9 LD R15,Y+
038E 9508 RET
push_gset2:
038F 937A ST R23,-Y
0390 936A ST R22,-Y
0391 940C0378 JMP push_gset1
push_gset3:
0393 92BA ST R11,-Y
0394 92AA ST R10,-Y
0395 940C038F JMP push_gset2
push_gset4:
0397 92DA ST R13,-Y
0398 92CA ST R12,-Y
0399 940C0393 JMP push_gset3
lsr16:
039B 2322 TST R18
039C F021 BEQ 0x03A1
039D 9516 LSR R17
039E 9507 ROR R16
039F 952A DEC R18
03A0 CFFA RJMP lsr16
03A1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -