📄 icc17-1.lst
字号:
__text_start:
__start:
081E E5CF LDI R28,0x5F
081F E0D4 LDI R29,4
0820 BFCD OUT 0x3D,R28
0821 BFDE OUT 0x3E,R29
0822 51C0 SUBI R28,0x10
0823 40D0 SBCI R29,0
0824 EA0A LDI R16,0xAA
0825 8308 STD Y+0,R16
0826 2400 CLR R0
0827 E6EF LDI R30,0x6F
0828 E0F0 LDI R31,0
0829 E010 LDI R17,0
082A 39E0 CPI R30,0x90
082B 07F1 CPC R31,R17
082C F011 BEQ 0x082F
082D 9201 ST R0,Z+
082E CFFB RJMP 0x082A
082F 8300 STD Z+0,R16
0830 E2EC LDI R30,0x2C
0831 E1F0 LDI R31,0x10
0832 E6A0 LDI R26,0x60
0833 E0B0 LDI R27,0
0834 E110 LDI R17,0x10
0835 33EB CPI R30,0x3B
0836 07F1 CPC R31,R17
0837 F021 BEQ 0x083C
0838 95C8 LPM
0839 9631 ADIW R30,1
083A 920D ST R0,X+
083B CFF9 RJMP 0x0835
083C 940E10D7 CALL _main
_exit:
083E CFFF RJMP _exit
FILE: D:\文稿\手把手教你学AVR单片机C程序设计\第17章~1\第17章实验程序\icc17-1\lcd.c
(0001) /*---------------判LCM忙子函数---------------*/
(0002) void lcd_busy(void)
(0003) {
(0004) uchar val;
(0005) RS_0;_NOP();_NOP();
_lcd_busy:
val --> R16
083F 98C0 CBI 0x18,0
0840 0000 NOP
0841 0000 NOP
(0006) RW_1;_NOP();_NOP();
0842 9AC1 SBI 0x18,1
0843 0000 NOP
0844 0000 NOP
(0007) DataPort=0x00;
0845 2422 CLR R2
0846 BA2B OUT 0x1B,R2
0847 C00C RJMP 0x0854
(0008) while(1)
(0009) {
(0010) EN_1;_NOP();_NOP();
0848 9AC2 SBI 0x18,2
0849 0000 NOP
084A 0000 NOP
(0011) DDRA=0x00;
084B 2422 CLR R2
084C BA2A OUT 0x1A,R2
(0012) val=PINA;
084D B309 IN R16,0x19
(0013) if(val<0x80) break;
084E 3800 CPI R16,0x80
084F F408 BCC 0x0851
0850 C004 RJMP 0x0855
(0014) EN_0;_NOP();_NOP();
0851 98C2 CBI 0x18,2
0852 0000 NOP
0853 0000 NOP
0854 CFF3 RJMP 0x0848
(0015) }
(0016) DDRA=0xff;
0855 EF8F LDI R24,0xFF
0856 BB8A OUT 0x1A,R24
(0017) EN_0;_NOP();_NOP();
0857 98C2 CBI 0x18,2
0858 0000 NOP
0859 0000 NOP
085A 9508 RET
_wcode:
sel_r --> Y+4
sel_l --> R22
c --> R20
085B 940E129B CALL push_gset2
085D 2F62 MOV R22,R18
085E 2F40 MOV R20,R16
(0018) }
(0019) /*--------------写指令到LCM子函数---------------*/
(0020) void wcode(uchar c,uchar sel_l,uchar sel_r)
(0021) {
(0022) if(sel_l==1)CS1_1;
085F 3061 CPI R22,1
0860 F411 BNE 0x0863
0861 9AC3 SBI 0x18,3
0862 C001 RJMP 0x0864
(0023) else CS1_0;
0863 98C3 CBI 0x18,3
(0024) _NOP();_NOP();
0864 0000 NOP
0865 0000 NOP
(0025) if(sel_r==1)CS2_1;
0866 818C LDD R24,Y+4
0867 3081 CPI R24,1
0868 F411 BNE 0x086B
0869 9AC4 SBI 0x18,4
086A C001 RJMP 0x086C
(0026) else CS2_0;
086B 98C4 CBI 0x18,4
(0027) _NOP();_NOP();
086C 0000 NOP
086D 0000 NOP
(0028) lcd_busy();
086E DFD0 RCALL _lcd_busy
(0029) RS_0;_NOP();_NOP();
086F 98C0 CBI 0x18,0
0870 0000 NOP
0871 0000 NOP
(0030) RW_0;_NOP();_NOP();
0872 98C1 CBI 0x18,1
0873 0000 NOP
0874 0000 NOP
(0031) DataPort=c;
0875 BB4B OUT 0x1B,R20
(0032) EN_1;_NOP();_NOP();
0876 9AC2 SBI 0x18,2
0877 0000 NOP
0878 0000 NOP
(0033) EN_0;_NOP();_NOP();
0879 98C2 CBI 0x18,2
087A 0000 NOP
087B 0000 NOP
087C 940E1289 CALL pop_gset2
087E 9508 RET
_wdata:
sel_r --> Y+4
sel_l --> R22
c --> R20
087F 940E129B CALL push_gset2
0881 2F62 MOV R22,R18
0882 2F40 MOV R20,R16
(0034) }
(0035) /*---------------写数据到LCM子函数-------------*/
(0036) void wdata(uchar c,uchar sel_l,uchar sel_r)
(0037) {
(0038) if(sel_l==1)CS1_1;
0883 3061 CPI R22,1
0884 F411 BNE 0x0887
0885 9AC3 SBI 0x18,3
0886 C001 RJMP 0x0888
(0039) else CS1_0;
0887 98C3 CBI 0x18,3
(0040) _NOP();_NOP();
0888 0000 NOP
0889 0000 NOP
(0041) if(sel_r==1)CS2_1;
088A 818C LDD R24,Y+4
088B 3081 CPI R24,1
088C F411 BNE 0x088F
088D 9AC4 SBI 0x18,4
088E C001 RJMP 0x0890
(0042) else CS2_0;
088F 98C4 CBI 0x18,4
(0043) _NOP();_NOP();
0890 0000 NOP
0891 0000 NOP
(0044) lcd_busy();
0892 DFAC RCALL _lcd_busy
(0045) RS_1;_NOP();_NOP();
0893 9AC0 SBI 0x18,0
0894 0000 NOP
0895 0000 NOP
(0046) RW_0;_NOP();_NOP();
0896 98C1 CBI 0x18,1
0897 0000 NOP
0898 0000 NOP
(0047) DataPort=c;
0899 BB4B OUT 0x1B,R20
(0048) EN_1;_NOP();_NOP();
089A 9AC2 SBI 0x18,2
089B 0000 NOP
089C 0000 NOP
(0049) EN_0;_NOP();_NOP();
089D 98C2 CBI 0x18,2
089E 0000 NOP
089F 0000 NOP
08A0 940E1289 CALL pop_gset2
08A2 9508 RET
_lw:
dd --> Y+5
y --> R22
x --> R20
08A3 940E129B CALL push_gset2
08A5 2F62 MOV R22,R18
08A6 2F40 MOV R20,R16
08A7 9721 SBIW R28,1
(0050) }
(0051) /*根据x、y地址定位,将数据写入LCM左半屏或右半屏的子函数*/
(0052) void lw(uchar x, uchar y, uchar dd)
(0053) {
(0054) if(x>=64)
08A8 3440 CPI R20,0x40
08A9 F050 BCS 0x08B4
(0055) {set_xy(x-64,y);
08AA 2F26 MOV R18,R22
08AB 2F04 MOV R16,R20
08AC 5400 SUBI R16,0x40
08AD D020 RCALL _set_xy
(0056) wdata(dd,0,1);}
08AE E081 LDI R24,1
08AF 8388 STD Y+0,R24
08B0 2722 CLR R18
08B1 810D LDD R16,Y+5
08B2 DFCC RCALL _wdata
08B3 C008 RJMP 0x08BC
(0057) else
(0058) {set_xy(x,y);
08B4 2F26 MOV R18,R22
08B5 2F04 MOV R16,R20
08B6 D017 RCALL _set_xy
(0059) wdata(dd,1,0);}
08B7 2422 CLR R2
08B8 8228 STD Y+0,R2
08B9 E021 LDI R18,1
08BA 810D LDD R16,Y+5
08BB DFC3 RCALL _wdata
08BC 9621 ADIW R28,1
08BD 940E1289 CALL pop_gset2
08BF 9508 RET
_set_startline:
i --> R20
08C0 940E129D CALL push_gset1
08C2 2F40 MOV R20,R16
08C3 9721 SBIW R28,1
(0060) }
(0061) /*---------------设定起始行子函数--------------*/
(0062) void set_startline(uchar i)
(0063) {
(0064) i=0xc0+i;
08C4 5440 SUBI R20,0x40
(0065) wcode(i,1,1);
08C5 E081 LDI R24,1
08C6 8388 STD Y+0,R24
08C7 E021 LDI R18,1
08C8 2F04 MOV R16,R20
08C9 DF91 RCALL _wcode
08CA 9621 ADIW R28,1
08CB 940E12A0 CALL pop_gset1
08CD 9508 RET
_set_xy:
y --> R20
x --> R22
08CE 940E129B CALL push_gset2
08D0 2F42 MOV R20,R18
08D1 2F60 MOV R22,R16
08D2 9721 SBIW R28,1
(0066) }
(0067) /*---------------定位x方向、y方向的子函数--------------*/
(0068) void set_xy(uchar x,uchar y)
(0069) {
(0070) x=x+0x40;
08D3 5C60 SUBI R22,0xC0
(0071) y=y+0xb8;
08D4 5448 SUBI R20,0x48
(0072) wcode(x,1,1);
08D5 E081 LDI R24,1
08D6 8388 STD Y+0,R24
08D7 E021 LDI R18,1
08D8 2F06 MOV R16,R22
08D9 DF81 RCALL _wcode
(0073) wcode(y,1,1);
08DA E081 LDI R24,1
08DB 8388 STD Y+0,R24
08DC E021 LDI R18,1
08DD 2F04 MOV R16,R20
08DE DF7C RCALL _wcode
08DF 9621 ADIW R28,1
08E0 940E1289 CALL pop_gset2
08E2 9508 RET
_dison_off:
o --> R20
08E3 940E129D CALL push_gset1
08E5 2F40 MOV R20,R16
08E6 9721 SBIW R28,1
(0074) }
(0075) /*---------------屏幕开启、关闭子函数--------------*/
(0076) void dison_off(uchar o)
(0077) {
(0078) o=o+0x3e;
08E7 5C42 SUBI R20,0xC2
(0079) wcode(o,1,1);
08E8 E081 LDI R24,1
08E9 8388 STD Y+0,R24
08EA E021 LDI R18,1
08EB 2F04 MOV R16,R20
08EC DF6E RCALL _wcode
08ED 9621 ADIW R28,1
08EE 940E12A0 CALL pop_gset1
08F0 9508 RET
(0080) }
(0081) /*---------------复位子函数---------------*/
(0082) void reset(void)
(0083) {
(0084) RST_0;
_reset:
08F1 98C5 CBI 0x18,5
(0085) Delay_nms(10);
08F2 E00A LDI R16,0xA
08F3 E010 LDI R17,0
08F4 940E11F3 CALL _Delay_nms
(0086) RST_1;
08F6 9AC5 SBI 0x18,5
(0087) Delay_nms(10);
08F7 E00A LDI R16,0xA
08F8 E010 LDI R17,0
08F9 940E11F3 CALL _Delay_nms
08FB 9508 RET
_lcd_init:
y --> R20
x --> R22
08FC 940E129B CALL push_gset2
08FE 9721 SBIW R28,1
(0088) }
(0089) /*--------------LCM初始化子函数-------------*/
(0090) void lcd_init(void)
(0091) {uchar x,y;
(0092) reset();
08FF DFF1 RCALL _reset
(0093) set_startline(0);
0900 2700 CLR R16
0901 DFBE RCALL _set_startline
(0094) dison_off(0);
0902 2700 CLR R16
0903 DFDF RCALL _dison_off
(0095) for(y=0;y<8;y++)
0904 2744 CLR R20
0905 C00B RJMP 0x0911
(0096) {
(0097) for(x=0;x<128;x++)lw(x,y,0);
0906 2766 CLR R22
0907 C006 RJMP 0x090E
0908 2422 CLR R2
0909 8228 STD Y+0,R2
090A 2F24 MOV R18,R20
090B 2F06 MOV R16,R22
090C DF96 RCALL _lw
090D 9563 INC R22
090E 3860 CPI R22,0x80
090F F3C0 BCS 0x0908
0910 9543 INC R20
0911 3048 CPI R20,0x8
0912 F398 BCS 0x0906
(0098) }
(0099) dison_off(1);
0913 E001 LDI R16,1
0914 DFCE RCALL _dison_off
0915 9621 ADIW R28,1
0916 940E1289 CALL pop_gset2
0918 9508 RET
_display_hz:
dx --> R20
i --> R22
p --> R10
fb --> R12
n --> R14
yy --> Y+13
xx --> Y+11
0919 940E1222 CALL push_arg4
091B 940E1295 CALL push_gset5
091D 9721 SBIW R28,1
091E 84EF LDD R14,Y+15
091F 88C9 LDD R12,Y+17
0920 88AB LDD R10,Y+19
0921 88BC LDD R11,Y+20
(0100) }
(0101) /*---------------显示一个汉字子函数--------------*/
(0102) void display_hz(uchar xx, uchar yy, uchar n, uchar fb,uchar const *p)
(0103) {
(0104) uchar i,dx;
(0105) for(i=0;i<16;i++)
0922 2766 CLR R22
0923 C037 RJMP 0x095B
(0106) {dx=p[2*i+n*32];
0924 E280 LDI R24,0x20
0925 9D8E MUL R24,R14
0926 0110 MOVW R2,R0
0927 E082 LDI R24,2
0928 9F86 MUL R24,R22
0929 01F0 MOVW R30,R0
092A 0DE2 ADD R30,R2
092B 1DF3 ADC R31,R3
092C 0DEA ADD R30,R10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -