📄 ac16-1.lst
字号:
03A9 8388 STD Y+0,R24
03AA E026 LDI R18,6
03AB E082 LDI R24,2
03AC 9F84 MUL R24,R20
03AD 2D00 MOV R16,R0
03AE D0D8 RCALL _display_hz
03AF 9543 INC R20
03B0 3048 CPI R20,0x8
03B1 F408 BCC 0x03B3
03B2 CFAC RJMP 0x035F
(0102) /*******************************/
(0103) Delay_nms(3000);
03B3 EB08 LDI R16,0xB8
03B4 E01B LDI R17,0xB
03B5 DE9F RCALL _Delay_nms
03B6 CEB4 RJMP 0x026B
03B7 9623 ADIW R28,3
03B8 9508 RET
(0104) }
(0105) }
(0106) /*----------------ATMEGA16L初始化子函数。-----------------------*/
(0107) void m16_init(void)
(0108) {
(0109) PORTA=0x00;
_m16_init:
03B9 2422 CLR R2
03BA BA2B OUT 0x1B,R2
(0110) DDRA=0xff;
03BB EF8F LDI R24,0xFF
03BC BB8A OUT 0x1A,R24
(0111) PORTB=0x00;
03BD BA28 OUT 0x18,R2
(0112) DDRB=0xff;
03BE BB87 OUT 0x17,R24
03BF 9508 RET
(0113) }
(0114) /*---------------判LCM忙子函数---------------*/
(0115) void lcd_busy(void)
(0116) {
(0117) uchar val;
(0118) RS_0;_NOP();
_lcd_busy:
val --> R16
03C0 98C0 CBI 0x18,0
03C1 0000 NOP
(0119) RW_1;_NOP();
03C2 9AC1 SBI 0x18,1
03C3 0000 NOP
(0120) DataPort=0x00;
03C4 2422 CLR R2
03C5 BA2B OUT 0x1B,R2
03C6 C00A RJMP 0x03D1
(0121) while(1)
(0122) {
(0123) EN_1;_NOP();
03C7 9AC2 SBI 0x18,2
03C8 0000 NOP
(0124) DDRA=0x00;
03C9 2422 CLR R2
03CA BA2A OUT 0x1A,R2
(0125) val=PINA;
03CB B309 IN R16,0x19
(0126) if(val<0x80) break;
03CC 3800 CPI R16,0x80
03CD F408 BCC 0x03CF
03CE C003 RJMP 0x03D2
(0127) EN_0;_NOP();
03CF 98C2 CBI 0x18,2
03D0 0000 NOP
03D1 CFF5 RJMP 0x03C7
(0128) }
(0129) DDRA=0xff;
03D2 EF8F LDI R24,0xFF
03D3 BB8A OUT 0x1A,R24
(0130) EN_0;_NOP();
03D4 98C2 CBI 0x18,2
03D5 0000 NOP
03D6 9508 RET
_wcode:
sel_r --> Y+4
sel_l --> R22
c --> R20
03D7 940E04E5 CALL push_gset2
03D9 2F62 MOV R22,R18
03DA 2F40 MOV R20,R16
(0131) }
(0132) /*--------------写指令到LCM子函数---------------*/
(0133) void wcode(uchar c,uchar sel_l,uchar sel_r)
(0134) {
(0135) if(sel_l==1)CS1_1;
03DB 3061 CPI R22,1
03DC F411 BNE 0x03DF
03DD 9AC3 SBI 0x18,3
03DE C001 RJMP 0x03E0
(0136) else CS1_0;
03DF 98C3 CBI 0x18,3
(0137) _NOP();
03E0 0000 NOP
(0138) if(sel_r==1)CS2_1;
03E1 818C LDD R24,Y+4
03E2 3081 CPI R24,1
03E3 F411 BNE 0x03E6
03E4 9AC4 SBI 0x18,4
03E5 C001 RJMP 0x03E7
(0139) else CS2_0;
03E6 98C4 CBI 0x18,4
(0140) _NOP();
03E7 0000 NOP
(0141) lcd_busy();
03E8 DFD7 RCALL _lcd_busy
(0142) RS_0;_NOP();
03E9 98C0 CBI 0x18,0
03EA 0000 NOP
(0143) RW_0;_NOP();
03EB 98C1 CBI 0x18,1
03EC 0000 NOP
(0144) DataPort=c;
03ED BB4B OUT 0x1B,R20
(0145) EN_1;_NOP();
03EE 9AC2 SBI 0x18,2
03EF 0000 NOP
(0146) EN_0;_NOP();
03F0 98C2 CBI 0x18,2
03F1 0000 NOP
03F2 940E04D9 CALL pop_gset2
03F4 9508 RET
_wdata:
sel_r --> Y+4
sel_l --> R22
c --> R20
03F5 940E04E5 CALL push_gset2
03F7 2F62 MOV R22,R18
03F8 2F40 MOV R20,R16
(0147) }
(0148) /*---------------写数据到LCM子函数-------------*/
(0149) void wdata(uchar c,uchar sel_l,uchar sel_r)
(0150) {
(0151) if(sel_l==1)CS1_1;
03F9 3061 CPI R22,1
03FA F411 BNE 0x03FD
03FB 9AC3 SBI 0x18,3
03FC C001 RJMP 0x03FE
(0152) else CS1_0;
03FD 98C3 CBI 0x18,3
(0153) _NOP();
03FE 0000 NOP
(0154) if(sel_r==1)CS2_1;
03FF 818C LDD R24,Y+4
0400 3081 CPI R24,1
0401 F411 BNE 0x0404
0402 9AC4 SBI 0x18,4
0403 C001 RJMP 0x0405
(0155) else CS2_0;
0404 98C4 CBI 0x18,4
(0156) _NOP();
0405 0000 NOP
(0157) lcd_busy();
0406 DFB9 RCALL _lcd_busy
(0158) RS_1;_NOP();
0407 9AC0 SBI 0x18,0
0408 0000 NOP
(0159) RW_0;_NOP();
0409 98C1 CBI 0x18,1
040A 0000 NOP
(0160) DataPort=c;
040B BB4B OUT 0x1B,R20
(0161) EN_1;_NOP();
040C 9AC2 SBI 0x18,2
040D 0000 NOP
(0162) EN_0;_NOP();
040E 98C2 CBI 0x18,2
040F 0000 NOP
0410 940E04D9 CALL pop_gset2
0412 9508 RET
_lw:
dd --> Y+5
y --> R22
x --> R20
0413 940E04E5 CALL push_gset2
0415 2F62 MOV R22,R18
0416 2F40 MOV R20,R16
0417 9721 SBIW R28,1
(0163) }
(0164) /*根据x、y地址定位,将数据写入LCM左半屏或右半屏的子函数*/
(0165) void lw(uchar x, uchar y, uchar dd)
(0166) {
(0167) if(x>=64)
0418 3440 CPI R20,0x40
0419 F050 BCS 0x0424
(0168) {set_xy(x-64,y);
041A 2F26 MOV R18,R22
041B 2F04 MOV R16,R20
041C 5400 SUBI R16,0x40
041D D020 RCALL _set_xy
(0169) wdata(dd,0,1);}
041E E081 LDI R24,1
041F 8388 STD Y+0,R24
0420 2722 CLR R18
0421 810D LDD R16,Y+5
0422 DFD2 RCALL _wdata
0423 C008 RJMP 0x042C
(0170) else
(0171) {set_xy(x,y);
0424 2F26 MOV R18,R22
0425 2F04 MOV R16,R20
0426 D017 RCALL _set_xy
(0172) wdata(dd,1,0);}
0427 2422 CLR R2
0428 8228 STD Y+0,R2
0429 E021 LDI R18,1
042A 810D LDD R16,Y+5
042B DFC9 RCALL _wdata
042C 9621 ADIW R28,1
042D 940E04D9 CALL pop_gset2
042F 9508 RET
_set_startline:
i --> R20
0430 940E04E7 CALL push_gset1
0432 2F40 MOV R20,R16
0433 9721 SBIW R28,1
(0173) }
(0174) /*---------------设定起始行子函数--------------*/
(0175) void set_startline(uchar i)
(0176) {
(0177) i=0xc0+i;
0434 5440 SUBI R20,0x40
(0178) wcode(i,1,1);
0435 E081 LDI R24,1
0436 8388 STD Y+0,R24
0437 E021 LDI R18,1
0438 2F04 MOV R16,R20
0439 DF9D RCALL _wcode
043A 9621 ADIW R28,1
043B 940E04EA CALL pop_gset1
043D 9508 RET
_set_xy:
y --> R20
x --> R22
043E 940E04E5 CALL push_gset2
0440 2F42 MOV R20,R18
0441 2F60 MOV R22,R16
0442 9721 SBIW R28,1
(0179) }
(0180) /*---------------定位x方向、y方向的子函数--------------*/
(0181) void set_xy(uchar x,uchar y)
(0182) {
(0183) x=x+0x40;
0443 5C60 SUBI R22,0xC0
(0184) y=y+0xb8;
0444 5448 SUBI R20,0x48
(0185) wcode(x,1,1);
0445 E081 LDI R24,1
0446 8388 STD Y+0,R24
0447 E021 LDI R18,1
0448 2F06 MOV R16,R22
0449 DF8D RCALL _wcode
(0186) wcode(y,1,1);
044A E081 LDI R24,1
044B 8388 STD Y+0,R24
044C E021 LDI R18,1
044D 2F04 MOV R16,R20
044E DF88 RCALL _wcode
044F 9621 ADIW R28,1
0450 940E04D9 CALL pop_gset2
0452 9508 RET
_dison_off:
o --> R20
0453 940E04E7 CALL push_gset1
0455 2F40 MOV R20,R16
0456 9721 SBIW R28,1
(0187) }
(0188) /*---------------屏幕开启、关闭子函数--------------*/
(0189) void dison_off(uchar o)
(0190) {
(0191) o=o+0x3e;
0457 5C42 SUBI R20,0xC2
(0192) wcode(o,1,1);
0458 E081 LDI R24,1
0459 8388 STD Y+0,R24
045A E021 LDI R18,1
045B 2F04 MOV R16,R20
045C DF7A RCALL _wcode
045D 9621 ADIW R28,1
045E 940E04EA CALL pop_gset1
0460 9508 RET
(0193) }
(0194) /*---------------复位子函数---------------*/
(0195) void reset(void)
(0196) {
(0197) RST_0;
_reset:
0461 98C5 CBI 0x18,5
(0198) Delay_nms(10);
0462 E00A LDI R16,0xA
0463 E010 LDI R17,0
0464 DDF0 RCALL _Delay_nms
(0199) RST_1;
0465 9AC5 SBI 0x18,5
(0200) Delay_nms(10);
0466 E00A LDI R16,0xA
0467 E010 LDI R17,0
0468 DDEC RCALL _Delay_nms
0469 9508 RET
_lcd_init:
y --> R20
x --> R22
046A 940E04E5 CALL push_gset2
046C 9721 SBIW R28,1
(0201) }
(0202) /*--------------LCM初始化子函数-------------*/
(0203) void lcd_init(void)
(0204) {uchar x,y;
(0205) reset();
046D DFF3 RCALL _reset
(0206) set_startline(0);
046E 2700 CLR R16
046F DFC0 RCALL _set_startline
(0207) dison_off(0);
0470 2700 CLR R16
0471 DFE1 RCALL _dison_off
(0208) for(y=0;y<8;y++)
0472 2744 CLR R20
0473 C00B RJMP 0x047F
(0209) {
(0210) for(x=0;x<128;x++)lw(x,y,0);
0474 2766 CLR R22
0475 C006 RJMP 0x047C
0476 2422 CLR R2
0477 8228 STD Y+0,R2
0478 2F24 MOV R18,R20
0479 2F06 MOV R16,R22
047A DF98 RCALL _lw
047B 9563 INC R22
047C 3860 CPI R22,0x80
047D F3C0 BCS 0x0476
047E 9543 INC R20
047F 3048 CPI R20,0x8
0480 F398 BCS 0x0474
(0211) }
(0212) dison_off(1);
0481 E001 LDI R16,1
0482 DFD0 RCALL _dison_off
0483 9621 ADIW R28,1
0484 940E04D9 CALL pop_gset2
0486 9508 RET
_display_hz:
dx --> R20
i --> R22
fb --> R10
n --> R12
yy --> R14
xx --> Y+11
0487 940E04D4 CALL push_arg4
0489 940E04DF CALL push_gset5
048B 2EE2 MOV R14,R18
048C 9721 SBIW R28,1
048D 84CF LDD R12,Y+15
048E 88A9 LDD R10,Y+17
(0213) }
(0214) /*---------------显示汉字子函数--------------*/
(0215) void display_hz(uchar xx, uchar yy, uchar n, uchar fb)
(0216) {
(0217) uchar i,dx;
(0218) for(i=0;i<16;i++)
048F 2766 CLR R22
0490 C03B RJMP 0x04CC
(0219) {dx=hz[2*i+n*32];
0491 E280 LDI R24,0x20
0492 9D8C MUL R24,R12
0493 0110 MOVW R2,R0
0494 E082 LDI R24,2
0495 9F86 MUL R24,R22
0496 01F0 MOVW R30,R0
0497 0DE2 ADD R30,R2
0498 1DF3 ADC R31,R3
0499 E584 LDI R24,0x54
049A E090 LDI R25,0
049B 0FE8 ADD R30,R24
049C 1FF9 ADC R31,R25
049D 9144 LPM R20,0(Z)
(0220) if(fb)dx=255-dx;
049E 20AA TST R10
049F F029 BEQ 0x04A5
04A0 2E24 MOV R2,R20
04A1 2433 CLR R3
04A2 EF4F LDI R20,0xFF
04A3 1942 SUB R20,R2
04A4 0953 SBC R21,R3
(0221) lw(xx*8+i,yy,dx);
04A5 8348 STD Y+0,R20
04A6 2D2E MOV R18,R14
04A7 E088 LDI R24,0x8
04A8 840B LDD R0,Y+11
04A9 9D80 MUL R24,R0
04AA 2D00 MOV R16,R0
04AB 0F06 ADD R16,R22
04AC DF66 RCALL _lw
(0222) dx=hz[(2*i+1)+n*32];
04AD E280 LDI R24,0x20
04AE 9D8C MUL R24,R12
04AF 0110 MOVW R2,R0
04B0 E082 LDI R24,2
04B1 9F86 MUL R24,R22
04B2 01F0 MOVW R30,R0
04B3 9631 ADIW R30,1
04B4 0DE2 ADD R30,R2
04B5 1DF3 ADC R31,R3
04B6 E584 LDI R24,0x54
04B7 E090 LDI R25,0
04B8 0FE8 ADD R30,R24
04B9 1FF9 ADC R31,R25
04BA 9144 LPM R20,0(Z)
(0223) if(fb)dx=255-dx;
04BB 20AA TST R10
04BC F029 BEQ 0x04C2
04BD 2E24 MOV R2,R20
04BE 2433 CLR R3
04BF EF4F LDI R20,0xFF
04C0 1942 SUB R20,R2
04C1 0953 SBC R21,R3
(0224) lw(xx*8+i,yy+1,dx);
FILE: <library>
04C2 8348 STD Y+0,R20
04C3 2D2E MOV R18,R14
04C4 5F2F SUBI R18,0xFF
04C5 E088 LDI R24,0x8
04C6 840B LDD R0,Y+11
04C7 9D80 MUL R24,R0
04C8 2D00 MOV R16,R0
04C9 0F06 ADD R16,R22
04CA DF48 RCALL _lw
04CB 9563 INC R22
04CC 3160 CPI R22,0x10
04CD F408 BCC 0x04CF
04CE CFC2 RJMP 0x0491
04CF 9621 ADIW R28,1
04D0 940E04DC CALL pop_gset5
04D2 9624 ADIW R28,4
04D3 9508 RET
push_arg4:
04D4 933A ST R19,-Y
04D5 932A ST R18,-Y
push_arg2:
04D6 931A ST R17,-Y
04D7 930A ST R16,-Y
04D8 9508 RET
pop_gset2:
04D9 E0E2 LDI R30,2
04DA 940C04EB JMP pop
pop_gset5:
04DC 27EE CLR R30
04DD 940C04EB JMP pop
push_gset5:
04DF 92FA ST R15,-Y
04E0 92EA ST R14,-Y
push_gset4:
04E1 92DA ST R13,-Y
04E2 92CA ST R12,-Y
push_gset3:
04E3 92BA ST R11,-Y
04E4 92AA ST R10,-Y
push_gset2:
04E5 937A ST R23,-Y
04E6 936A ST R22,-Y
push_gset1:
04E7 935A ST R21,-Y
04E8 934A ST R20,-Y
04E9 9508 RET
pop_gset1:
04EA E0E1 LDI R30,1
pop:
04EB 9149 LD R20,Y+
04EC 9159 LD R21,Y+
04ED FDE0 SBRC R30,0
04EE 9508 RET
04EF 9169 LD R22,Y+
04F0 9179 LD R23,Y+
04F1 FDE1 SBRC R30,1
04F2 9508 RET
04F3 90A9 LD R10,Y+
04F4 90B9 LD R11,Y+
04F5 FDE2 SBRC R30,2
04F6 9508 RET
04F7 90C9 LD R12,Y+
04F8 90D9 LD R13,Y+
04F9 FDE3 SBRC R30,3
04FA 9508 RET
04FB 90E9 LD R14,Y+
04FC 90F9 LD R15,Y+
04FD 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -