📄 1602.lst
字号:
__start:
__text_start:
0041 E5CF LDI R28,0x5F
0042 E0D4 LDI R29,4
0043 BFCD OUT 0x3D,R28
0044 BFDE OUT 0x3E,R29
0045 51C0 SUBI R28,0x10
0046 40D0 SBCI R29,0
0047 EA0A LDI R16,0xAA
0048 8308 STD Y+0,R16
0049 2400 CLR R0
004A E8ED LDI R30,0x8D
004B E0F0 LDI R31,0
004C E010 LDI R17,0
004D 38ED CPI R30,0x8D
004E 07F1 CPC R31,R17
004F F011 BEQ 0x0052
0050 9201 ST R0,Z+
0051 CFFB RJMP 0x004D
0052 8300 STD Z+0,R16
0053 E5E4 LDI R30,0x54
0054 E0F0 LDI R31,0
0055 E6A0 LDI R26,0x60
0056 E0B0 LDI R27,0
0057 E010 LDI R17,0
0058 38E1 CPI R30,0x81
0059 07F1 CPC R31,R17
005A F021 BEQ 0x005F
005B 95C8 LPM
005C 9631 ADIW R30,1
005D 920D ST R0,X+
005E CFF9 RJMP 0x0058
005F 940E00EA CALL _main
_exit:
0061 CFFF RJMP _exit
FILE: E:\单片机\单片机程序\AVR程序\1602\1602.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include <stdio.h> //标准输入输出头文件
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006)
(0007) //uchar DATA[16] = {'W','e','l','c','o','m','e',' ','t','o',' ','C','U','M','T','!'};
(0008) uchar DATA1[] = {" Welcome to "};
(0009) uchar DATA2[] = {" CUMT! "};
(0010) /********** LCD1602接线引脚定义 ***********/
(0011) //E -- PD4
(0012) //RW -- PD5
(0013) //RS -- PD6
(0014) //DB0~7 -- PC0~7
(0015)
(0016) /****************** 延时函数 *****************/
(0017) void delay(uint t)
(0018) {
(0019) while(t--);
_delay:
t --> R16
0062 0118 MOVW R2,R16
0063 5001 SUBI R16,1
0064 4010 SBCI R17,0
0065 2022 TST R2
0066 F7D9 BNE 0x0062
0067 2033 TST R3
0068 F7C9 BNE 0x0062
0069 9508 RET
_delay_ms:
i --> R20
j --> R22
t --> R16
006A 940E013F CALL push_gset2
(0020) }
(0021)
(0022) void delay_ms(uint t)
(0023) {
(0024) uint i,j;
(0025) for(i=t;i>0;i--)
006C 01A8 MOVW R20,R16
006D C00B RJMP 0x0079
(0026) for(j=0;j<1140;j++);
006E 2766 CLR R22
006F 2777 CLR R23
0070 C002 RJMP 0x0073
0071 5F6F SUBI R22,0xFF
0072 4F7F SBCI R23,0xFF
0073 3764 CPI R22,0x74
0074 E0E4 LDI R30,4
0075 077E CPC R23,R30
0076 F3D0 BCS 0x0071
0077 5041 SUBI R20,1
0078 4050 SBCI R21,0
0079 3040 CPI R20,0
007A 0745 CPC R20,R21
007B F791 BNE 0x006E
007C 940E0136 CALL pop_gset2
007E 9508 RET
(0027) }
(0028)
(0029) /****************** 端口初始化 *****************/
(0030) void port_init(void)
(0031) {
(0032) PORTA = 0x00;
_port_init:
007F 2422 CLR R2
0080 BA2B OUT 0x1B,R2
(0033) DDRA = 0xFF;
0081 EF8F LDI R24,0xFF
0082 BB8A OUT 0x1A,R24
(0034) PORTB = 0x00;
0083 BA28 OUT 0x18,R2
(0035) DDRB = 0x00;
0084 BA27 OUT 0x17,R2
(0036) PORTC = 0x00;
0085 BA25 OUT 0x15,R2
(0037) DDRC = 0xFF;
0086 BB84 OUT 0x14,R24
(0038) PORTD = 0x00;
0087 BA22 OUT 0x12,R2
(0039) DDRD = 0xFF;
0088 BB81 OUT 0x11,R24
0089 9508 RET
(0040) }
(0041)
(0042) /****************** mega16 初始化 *****************/
(0043) void init_devices(void)
(0044) {
(0045) CLI();
_init_devices:
008A 94F8 BCLR 7
(0046) port_init();
008B DFF3 RCALL _port_init
(0047) MCUCR = 0x00;
008C 2422 CLR R2
008D BE25 OUT 0x35,R2
(0048) GICR = 0x00;
008E BE2B OUT 0x3B,R2
(0049) TIMSK = 0x00;
008F BE29 OUT 0x39,R2
(0050) SEI();
0090 9478 BSET 7
0091 9508 RET
(0051) }
(0052)
(0053) /****************** 检查忙信号 *****************/
(0054) void lcd_busy()
(0055) {
(0056) DDRC = 0X00; //PC 口改为输入
_lcd_busy:
0092 2422 CLR R2
0093 BA24 OUT 0x14,R2
(0057) PORTD = 0X20;
0094 E280 LDI R24,0x20
0095 BB82 OUT 0x12,R24
(0058) delay(10);
0096 E00A LDI R16,0xA
0097 E010 LDI R17,0
0098 DFC9 RCALL _delay
(0059) PORTD = 0X30;
0099 E380 LDI R24,0x30
009A BB82 OUT 0x12,R24
(0060) while(PINC & 0X80); //lcd 忙,则在此循环
009B 999F SBIC 0x13,7
009C CFFE RJMP 0x009B
(0061) PORTD = 0X20;
009D E280 LDI R24,0x20
009E BB82 OUT 0x12,R24
(0062) DDRC = 0XFF; //PC 口改为输出
009F EF8F LDI R24,0xFF
00A0 BB84 OUT 0x14,R24
00A1 9508 RET
_lcd_cmd:
cmd --> R20
00A2 940E0141 CALL push_gset1
00A4 2F40 MOV R20,R16
(0063) }
(0064)
(0065) /****************** 写命令函数 *****************/
(0066) void lcd_cmd(uchar cmd)
(0067) {
(0068) lcd_busy();
00A5 DFEC RCALL _lcd_busy
(0069) PORTD = 0X00;
00A6 2422 CLR R2
00A7 BA22 OUT 0x12,R2
(0070) delay(1);
00A8 E001 LDI R16,1
00A9 E010 LDI R17,0
00AA DFB7 RCALL _delay
(0071) PORTC = cmd; //PC 口输出命令
00AB BB45 OUT 0x15,R20
(0072) delay(1);
00AC E001 LDI R16,1
00AD E010 LDI R17,0
00AE DFB3 RCALL _delay
(0073) PORTD = 0X10;
00AF E180 LDI R24,0x10
00B0 BB82 OUT 0x12,R24
(0074) delay(1); //延时
00B1 E001 LDI R16,1
00B2 E010 LDI R17,0
00B3 DFAE RCALL _delay
(0075) PORTD = 0X00;
00B4 2422 CLR R2
00B5 BA22 OUT 0x12,R2
00B6 940E0144 CALL pop_gset1
00B8 9508 RET
_lcd_data:
data --> R20
00B9 940E0141 CALL push_gset1
00BB 2F40 MOV R20,R16
(0076) }
(0077)
(0078) /****************** 写数据函数 *****************/
(0079) void lcd_data(uchar data)
(0080) {
(0081) lcd_busy();
00BC DFD5 RCALL _lcd_busy
(0082) PORTD = 0X40;
00BD E480 LDI R24,0x40
00BE BB82 OUT 0x12,R24
(0083) delay(1);
00BF E001 LDI R16,1
00C0 E010 LDI R17,0
00C1 DFA0 RCALL _delay
(0084) PORTC = data; //写要显示的字
00C2 BB45 OUT 0x15,R20
(0085) delay(1);
00C3 E001 LDI R16,1
00C4 E010 LDI R17,0
00C5 DF9C RCALL _delay
(0086) PORTD = 0X50;
00C6 E580 LDI R24,0x50
00C7 BB82 OUT 0x12,R24
(0087) delay(1);
00C8 E001 LDI R16,1
00C9 E010 LDI R17,0
00CA DF97 RCALL _delay
(0088) PORTD = 0X40;
00CB E480 LDI R24,0x40
00CC BB82 OUT 0x12,R24
00CD 940E0144 CALL pop_gset1
00CF 9508 RET
_lcd_DAT:
DAT --> Y+4
y --> R22
x --> R20
00D0 940E013F CALL push_gset2
00D2 2F62 MOV R22,R18
00D3 2F40 MOV R20,R16
(0089) }
(0090)
(0091) /****************** 显示函数 *****************/
(0092) void lcd_DAT(uchar x,uchar y,uchar DAT)
(0093) {
(0094) if(y) x += 0x40;
00D4 2366 TST R22
00D5 F009 BEQ 0x00D7
00D6 5C40 SUBI R20,0xC0
(0095) x |= 0x80;
00D7 6840 ORI R20,0x80
(0096) lcd_cmd(x); //写要显示的地址
00D8 2F04 MOV R16,R20
00D9 DFC8 RCALL _lcd_cmd
(0097) lcd_data(DAT); //写显示的内容
00DA 810C LDD R16,Y+4
00DB DFDD RCALL _lcd_data
00DC 940E0136 CALL pop_gset2
00DE 9508 RET
(0098) }
(0099)
(0100) /****************** lcd 初始化 *****************/
(0101) void lcd_init()
(0102) {
(0103) lcd_cmd(0x38);
_lcd_init:
00DF E308 LDI R16,0x38
00E0 DFC1 RCALL _lcd_cmd
(0104) lcd_cmd(0x08);
00E1 E008 LDI R16,0x8
00E2 DFBF RCALL _lcd_cmd
(0105) lcd_cmd(0x01);
00E3 E001 LDI R16,1
00E4 DFBD RCALL _lcd_cmd
(0106) lcd_cmd(0x06);
00E5 E006 LDI R16,6
00E6 DFBB RCALL _lcd_cmd
(0107) lcd_cmd(0x0c);
00E7 E00C LDI R16,0xC
00E8 DFB9 RCALL _lcd_cmd
00E9 9508 RET
_main:
p --> R20
m --> R22
i --> R10
00EA 9721 SBIW R28,1
(0108) }
(0109)
(0110) /****************** 主函数 *****************/
(0111) void main(void)
(0112) {
(0113) uchar i,p=1;
00EB E041 LDI R20,1
(0114) char m = 11;
00EC E06B LDI R22,0xB
(0115) init_devices();
00ED DF9C RCALL _init_devices
(0116) delay_ms(100);
00EE E604 LDI R16,0x64
00EF E010 LDI R17,0
00F0 DF79 RCALL _delay_ms
(0117) lcd_init();
00F1 DFED RCALL _lcd_init
(0118)
(0119) /*lcd_DAT(0,0,'G');
(0120) lcd_DAT(1,0,'O');
(0121) lcd_DAT(2,0,'O');
(0122) lcd_DAT(3,0,'D');
(0123) lcd_DAT(5,1,'B');
(0124) lcd_DAT(6,1,'Y');
(0125) lcd_DAT(7,1,'E');*/
(0126) lcd_cmd(0x80);
00F2 E800 LDI R16,0x80
00F3 DFAE RCALL _lcd_cmd
(0127) for(i=0;DATA1[i] != '\0';i++)
00F4 24AA CLR R10
00F5 C00C RJMP 0x0102
(0128) {
(0129) lcd_DAT(i,0,DATA1[i]);
00F6 E680 LDI R24,0x60
00F7 E090 LDI R25,0
00F8 2DEA MOV R30,R10
00F9 27FF CLR R31
00FA 0FE8 ADD R30,R24
00FB 1FF9 ADC R31,R25
00FC 8020 LDD R2,Z+0
00FD 8228 STD Y+0,R2
00FE 2722 CLR R18
00FF 2D0A MOV R16,R10
0100 DFCF RCALL _lcd_DAT
0101 94A3 INC R10
0102 E680 LDI R24,0x60
0103 E090 LDI R25,0
0104 2DEA MOV R30,R10
0105 27FF CLR R31
0106 0FE8 ADD R30,R24
0107 1FF9 ADC R31,R25
0108 8020 LDD R2,Z+0
0109 2022 TST R2
010A F759 BNE 0x00F6
010B C027 RJMP 0x0133
(0130) }
(0131) while(1)
(0132) {
(0133) for(i=0;i<16;i++)
010C 24AA CLR R10
010D C010 RJMP 0x011E
(0134) {
(0135) lcd_DAT(i,1,DATA2[i+m]);
010E 2E26 MOV R2,R22
010F 2433 CLR R3
0110 2DEA MOV R30,R10
0111 27FF CLR R31
0112 0DE2 ADD R30,R2
0113 1DF3 ADC R31,R3
0114 E781 LDI R24,0x71
0115 E090 LDI R25,0
0116 0FE8 ADD R30,R24
0117 1FF9 ADC R31,R25
0118 8020 LDD R2,Z+0
0119 8228 STD Y+0,R2
011A E021 LDI R18,1
011B 2D0A MOV R16,R10
011C DFB3 RCALL _lcd_DAT
011D 94A3 INC R10
011E 2D8A MOV R24,R10
011F 3180 CPI R24,0x10
0120 F368 BCS 0x010E
(0136) }
(0137) delay_ms(700); //滚动屏
0121 EB0C LDI R16,0xBC
0122 E012 LDI R17,2
0123 DF46 RCALL _delay_ms
(0138) if(p == 1) m --;
0124 3041 CPI R20,1
0125 F411 BNE 0x0128
0126 956A DEC R22
0127 C003 RJMP 0x012B
(0139) else if(p == 0) m++;
0128 2344 TST R20
0129 F409 BNE 0x012B
012A 9563 INC R22
(0140) if(m >= 11) p = 1;
012B 306B CPI R22,0xB
012C F010 BCS 0x012F
012D E041 LDI R20,1
012E C004 RJMP 0x0133
(0141) else if(m <= 0) p = 0;
FILE: <library>
012F 2422 CLR R2
0130 1626 CP R2,R22
0131 F008 BCS 0x0133
0132 2744 CLR R20
0133 CFD8 RJMP 0x010C
0134 9621 ADIW R28,1
0135 9508 RET
pop_gset2:
0136 E0E2 LDI R30,2
0137 940C0145 JMP pop
push_gset5:
0139 92FA ST R15,-Y
013A 92EA ST R14,-Y
push_gset4:
013B 92DA ST R13,-Y
013C 92CA ST R12,-Y
push_gset3:
013D 92BA ST R11,-Y
013E 92AA ST R10,-Y
push_gset2:
013F 937A ST R23,-Y
0140 936A ST R22,-Y
push_gset1:
0141 935A ST R21,-Y
0142 934A ST R20,-Y
0143 9508 RET
pop_gset1:
0144 E0E1 LDI R30,1
pop:
0145 9149 LD R20,Y+
0146 9159 LD R21,Y+
0147 FDE0 SBRC R30,0
0148 9508 RET
0149 9169 LD R22,Y+
014A 9179 LD R23,Y+
014B FDE1 SBRC R30,1
014C 9508 RET
014D 90A9 LD R10,Y+
014E 90B9 LD R11,Y+
014F FDE2 SBRC R30,2
0150 9508 RET
0151 90C9 LD R12,Y+
0152 90D9 LD R13,Y+
0153 FDE3 SBRC R30,3
0154 9508 RET
0155 90E9 LD R14,Y+
0156 90F9 LD R15,Y+
0157 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -