📄 test.lst
字号:
__start:
__text_start:
2C E5CF LDI R28,0x5F
2D E0D4 LDI R29,4
2E BFCD OUT 0x3D,R28
2F BFDE OUT 0x3E,R29
30 51CE SUBI R28,0x1E
31 40D0 SBCI R29,0
32 EA0A LDI R16,0xAA
33 8308 STD Y+0,R16
34 2400 CLR R0
35 E9E1 LDI R30,0x91
36 E0F0 LDI R31,0
37 E010 LDI R17,0
38 39E1 CPI R30,0x91
39 07F1 CPC R31,R17
3A F011 BEQ 0x003D
3B 9201 ST R0,Z+
3C CFFB RJMP 0x0038
3D 8300 STD Z+0,R16
3E E2E6 LDI R30,0x26
3F E0F0 LDI R31,0
40 E6A0 LDI R26,0x60
41 E0B0 LDI R27,0
42 E010 LDI R17,0
43 E000 LDI R16,0
44 BF0B OUT 0x3B,R16
45 35E7 CPI R30,0x57
46 07F1 CPC R31,R17
47 F021 BEQ 0x004C
48 95C8 LPM
49 9631 ADIW R30,1
4A 920D ST R0,X+
4B CFF9 RJMP 0x0045
4C D0C4 RCALL _main
_exit:
4D CFFF RJMP _exit
_Delay_MS:
i --> R20
iTime --> R16
4E 934A ST R20,-Y
FILE: f:\MYDOCU~1\AVR\test\delay.h
(0001) //#IFDEF F_CPU
(0002) #define F_CPU 8000000
(0003) //#ENDIF
(0004)
(0005) //延时,对应主频为8MHz
(0006) void Delay_MS(unsigned int iTime)
(0007) { unsigned char i;
4F C008 RJMP 0x0058
(0008) while(iTime>0)
(0009) {
(0010) for (i=1;i<187;i++)
50 E041 LDI R20,1
51 C002 RJMP 0x0054
(0011) asm("nop");
52 0000 NOP
53 9543 INC R20
54 3B4B CPI R20,0xBB
55 F3E0 BCS 0x0052
(0012)
(0013) iTime--;
56 5001 SUBI R16,1
57 4010 SBCI R17,0
58 3000 CPI R16,0
59 0701 CPC R16,R17
5A F7A9 BNE 0x0050
5B 9149 LD R20,Y+
5C 9508 RET
_Delay_US:
j --> R10
i --> R20
iTime --> R16
5D D118 RCALL push_xgset300C
(0014) }
(0015) }
(0016)
(0017) //主频8MHz
(0018) void Delay_US(unsigned int iTime)
(0019) {
(0020) unsigned int i,j;
(0021) j = iTime * 8;
5E 0158 MOVW R10,R16
5F 0CAA LSL R10
60 1CBB ROL R11
61 0CAA LSL R10
62 1CBB ROL R11
63 0CAA LSL R10
64 1CBB ROL R11
(0022) for(i=0;i<j;i++);
65 2744 CLR R20
66 2755 CLR R21
67 C002 RJMP 0x006A
68 5F4F SUBI R20,0xFF
69 4F5F SBCI R21,0xFF
6A 154A CP R20,R10
6B 055B CPC R21,R11
6C F3D8 BCS 0x0068
6D C10D RJMP pop_xgset300C
_OnTimer0:
adv --> R20
6E 920A ST R0,-Y
6F 921A ST R1,-Y
70 922A ST R2,-Y
71 923A ST R3,-Y
72 924A ST R4,-Y
73 925A ST R5,-Y
74 926A ST R6,-Y
75 927A ST R7,-Y
76 928A ST R8,-Y
77 929A ST R9,-Y
78 930A ST R16,-Y
79 931A ST R17,-Y
7A 932A ST R18,-Y
7B 933A ST R19,-Y
7C 938A ST R24,-Y
7D 939A ST R25,-Y
7E 93AA ST R26,-Y
7F 93BA ST R27,-Y
80 93EA ST R30,-Y
81 93FA ST R31,-Y
82 B60F IN R0,0x3F
83 920A ST R0,-Y
84 934A ST R20,-Y
85 935A ST R21,-Y
FILE: f:\MYDOCU~1\AVR\test\main.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003)
(0004) #define F_CPU 8000000 //主频
(0005) #include "delay.h"
(0006)
(0007) #define MAXCH 16 //总通道数
(0008) #define MAXSCALECH 6 //比例通道数
(0009)
(0010) //数码管显示值
(0011) unsigned char SEG7[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0012)
(0013) //通道值
(0014) unsigned char PADV[MAXCH] = {-1};
(0015) unsigned char CADV[MAXCH] = {0};
(0016)
(0017) unsigned char ScaleCHindex = 0;
(0018)
(0019) //以下定义中断处理程序
(0020) #pragma interrupt_handler OnTimer0:iv_TIMER0_OVF
(0021) void OnTimer0(void)
(0022) { unsigned char adv;
(0023) ADMUX = 0x20 + ScaleCHindex; //左对齐,只取高位
86 9180 0090 LDS R24,ScaleCHindex
88 5E80 SUBI R24,0xE0
89 B987 OUT 0x07,R24
(0024)
(0025) ADCSRA|=(1<<ADSC); //启动ADC
8A 9A36 SBI 0x06,6
(0026) Delay_US(100); //第一次结果抛弃
8B E604 LDI R16,0x64
8C E010 LDI R17,0
8D DFCF RCALL _Delay_US
(0027) ADCSRA|=(1<<ADSC); //启动ADC
8E 9A36 SBI 0x06,6
(0028) Delay_US(100);
8F E604 LDI R16,0x64
90 E010 LDI R17,0
91 DFCB RCALL _Delay_US
(0029) adv = ADCH;
92 B145 IN R20,0x05
(0030)
(0031) if(adv == 0xFF) adv = 0xFE;
93 3F4F CPI R20,0xFF
94 F411 BNE 0x0097
95 EF4E LDI R20,0xFE
96 C004 RJMP 0x009B
(0032) else if(ADCH == 0x00) adv = 0x01;
97 B025 IN R2,0x05
98 2022 TST R2
99 F409 BNE 0x009B
9A E041 LDI R20,1
(0033)
(0034) CADV[ScaleCHindex] = adv;
9B E880 LDI R24,0x80
9C E090 LDI R25,0
9D 91E0 0090 LDS R30,ScaleCHindex
9F 27FF CLR R31
A0 0FE8 ADD R30,R24
A1 1FF9 ADC R31,R25
A2 8340 STD Z+0,R20
(0035)
(0036) ScaleCHindex++;
A3 9180 0090 LDS R24,ScaleCHindex
A5 5F8F SUBI R24,0xFF
A6 9380 0090 STS ScaleCHindex,R24
(0037) if(ScaleCHindex >= MAXSCALECH) ScaleCHindex = 0;
A8 3086 CPI R24,6
A9 F018 BCS 0x00AD
AA 2422 CLR R2
AB 9220 0090 STS ScaleCHindex,R2
(0038)
(0039) //去抖
(0040) adv = PIND;
AD B340 IN R20,0x10
(0041) Delay_US(50);
AE E302 LDI R16,0x32
AF E010 LDI R17,0
B0 DFAC RCALL _Delay_US
(0042) if(adv != PIND) return;
B1 B220 IN R2,0x10
B2 1542 CP R20,R2
B3 F009 BEQ 0x00B5
B4 C024 RJMP 0x00D9
(0043)
(0044) CADV[MAXSCALECH] = (PIND & 0x10) ? 0xFF : 0x00;
B5 9B84 SBIS 0x10,4
B6 C003 RJMP 0x00BA
B7 EF4F LDI R20,0xFF
B8 E050 LDI R21,0
B9 C002 RJMP 0x00BC
BA 2744 CLR R20
BB 2755 CLR R21
BC 9340 0086 STS 0x0086,R20
(0045) CADV[MAXSCALECH+1] = (PIND & 0x20) ? 0xFF : 0x00;
BE 9B85 SBIS 0x10,5
BF C003 RJMP 0x00C3
C0 EF4F LDI R20,0xFF
C1 E050 LDI R21,0
C2 C002 RJMP 0x00C5
C3 2744 CLR R20
C4 2755 CLR R21
C5 9340 0087 STS 0x0087,R20
(0046) CADV[MAXSCALECH+2] = (PIND & 0x40) ? 0xFF : 0x00;
C7 9B86 SBIS 0x10,6
C8 C003 RJMP 0x00CC
C9 EF4F LDI R20,0xFF
CA E050 LDI R21,0
CB C002 RJMP 0x00CE
CC 2744 CLR R20
CD 2755 CLR R21
CE 9340 0088 STS 0x0088,R20
(0047) CADV[MAXSCALECH+3] = (PIND & 0x80) ? 0xFF : 0x00;
D0 9B87 SBIS 0x10,7
D1 C003 RJMP 0x00D5
D2 EF4F LDI R20,0xFF
D3 E050 LDI R21,0
D4 C002 RJMP 0x00D7
D5 2744 CLR R20
D6 2755 CLR R21
D7 9340 0089 STS 0x0089,R20
D9 9159 LD R21,Y+
DA 9149 LD R20,Y+
DB 9009 LD R0,Y+
DC BE0F OUT 0x3F,R0
DD 91F9 LD R31,Y+
DE 91E9 LD R30,Y+
DF 91B9 LD R27,Y+
E0 91A9 LD R26,Y+
E1 9199 LD R25,Y+
E2 9189 LD R24,Y+
E3 9139 LD R19,Y+
E4 9129 LD R18,Y+
E5 9119 LD R17,Y+
E6 9109 LD R16,Y+
E7 9099 LD R9,Y+
E8 9089 LD R8,Y+
E9 9079 LD R7,Y+
EA 9069 LD R6,Y+
EB 9059 LD R5,Y+
EC 9049 LD R4,Y+
ED 9039 LD R3,Y+
EE 9029 LD R2,Y+
EF 9019 LD R1,Y+
F0 9009 LD R0,Y+
F1 9518 RETI
(0048)
(0049) //TCNT0 = 0xFF;
(0050) }
(0051)
(0052) #pragma interrupt_handler OnADC:iv_ADC
(0053) void OnADC(void)
(0054) {
_OnADC:
F2 9518 RETI
(0055)
(0056) }
(0057)
(0058) //初始化
(0059) void init_devices(void)
(0060) {
(0061)
(0062) //内部RC校准
(0063) OSCCAL = 0x7D;
_init_devices:
F3 E78D LDI R24,0x7D
F4 BF81 OUT 0x31,R24
(0064)
(0065) CLI();
F5 94F8 BCLR 7
(0066)
(0067) //端口初始化
(0068) PORTB = 0xFF;
F6 EF8F LDI R24,0xFF
F7 BB88 OUT 0x18,R24
(0069) DDRB = 0xFF;
F8 BB87 OUT 0x17,R24
(0070)
(0071) PORTC = 0x00;
F9 2422 CLR R2
FA BA25 OUT 0x15,R2
(0072) DDRC = 0x00;
FB BA24 OUT 0x14,R2
(0073)
(0074) PORTD = 0xF0;
FC EF80 LDI R24,0xF0
FD BB82 OUT 0x12,R24
(0075) DDRD = 0x0F;
FE E08F LDI R24,0xF
FF BB81 OUT 0x11,R24
(0076)
(0077) //定时器初始化
(0078) TCCR0 = 0x00; //禁止计时
100 BE23 OUT 0x33,R2
(0079) TCNT0 = 0x0F; //定时器时长
101 BF82 OUT 0x32,R24
(0080) TCCR0 = 0x05; //启动定时器 CLK/1024
102 E085 LDI R24,5
103 BF83 OUT 0x33,R24
(0081)
(0082) //ADC初始化
(0083) ADCSR = 0x00; //禁止转换
104 B826 OUT 0x06,R2
(0084) ADMUX = 0x20; //多路复用选择寄存器 E0 内部参考源,左对齐(只需高八位),通道0
105 E280 LDI R24,0x20
106 B987 OUT 0x07,R24
(0085) // REFS1 RESF0(参考源) ADLAR(左对齐) 保留 MUX3 MUX2 MUX1 MUX0
(0086) ACSR = 0x80; //模拟比较器控制与状态寄存器
107 E880 LDI R24,0x80
108 B988 OUT 0x08,R24
(0087) ADCSR = 0x83; //10001011 83 禁止中断,使用查询方式
109 E883 LDI R24,0x83
10A B986 OUT 0x06,R24
(0088) //ADEN(AD允许) ADSC(AD开始) ADFR(连续) ADIF(中断标志) ADIE(中断允许) ADPS(预分频,三位)
(0089)
(0090)
(0091) //控制寄存器
(0092) MCUCR = 0x00;
10B BE25 OUT 0x35,R2
(0093) GICR = 0x00;
10C BE2B OUT 0x3B,R2
(0094) TIMSK = 0x01; //充许Timer0中断
10D E081 LDI R24,1
10E BF89 OUT 0x39,R24
(0095)
(0096) SEI();
10F 9478 BSET 7
110 9508 RET
(0097) }
(0098)
(0099) main()
(0100) {
(0101) int i = 0,j = 0;
_main:
i --> R10
j --> R20
111 24AA CLR R10
112 24BB CLR R11
113 2744 CLR R20
114 2755 CLR R21
(0102)
(0103) init_devices();
115 DFDD RCALL _init_devices
116 C05D RJMP 0x0174
(0104)
(0105) while(1)
(0106) {
(0107) for(j=0;j<MAXCH;j++)
117 2744 CLR R20
118 2755 CLR R21
(0108) if(PADV[j] != CADV[j])
119 E880 LDI R24,0x80
11A E090 LDI R25,0
11B 01FA MOVW R30,R20
11C 0FE8 ADD R30,R24
11D 1FF9 ADC R31,R25
11E 8020 LDD R2,Z+0
11F E780 LDI R24,0x70
120 E090 LDI R25,0
121 01FA MOVW R30,R20
122 0FE8 ADD R30,R24
123 1FF9 ADC R31,R25
124 8030 LDD R3,Z+0
125 1432 CP R3,R2
126 F069 BEQ 0x0134
(0109) { i = j;
127 015A MOVW R10,R20
(0110) PADV[j] = CADV[j];
128 E880 LDI R24,0x80
129 E090 LDI R25,0
12A 01FA MOVW R30,R20
12B 0FE8 ADD R30,R24
12C 1FF9 ADC R31,R25
12D 8020 LDD R2,Z+0
12E E780 LDI R24,0x70
12F E090 LDI R25,0
130 01FA MOVW R30,R20
131 0FE8 ADD R30,R24
132 1FF9 ADC R31,R25
133 8220 STD Z+0,R2
134 5F4F SUBI R20,0xFF
135 4F5F SBCI R21,0xFF
136 3140 CPI R20,0x10
137 E0E0 LDI R30,0
138 075E CPC R21,R30
139 F2FC BLT 0x0119
(0111) }
(0112)
(0113) //显示低位
(0114) PORTD = 0x01;
13A E081 LDI R24,1
13B BB82 OUT 0x12,R24
(0115) PORTB = SEG7[CADV[i] & 0x0F];
13C E880 LDI R24,0x80
13D E090 LDI R25,0
13E 01F5 MOVW R30,R10
13F 0FE8 ADD R30,R24
140 1FF9 ADC R31,R25
141 81E0 LDD R30,Z+0
142 27FF CLR R31
143 70EF ANDI R30,0xF
144 70F0 ANDI R31,0
145 E680 LDI R24,0x60
146 E090 LDI R25,0
147 0FE8 ADD R30,R24
148 1FF9 ADC R31,R25
149 8020 LDD R2,Z+0
14A BA28 OUT 0x18,R2
(0116) Delay_MS(20);
14B E104 LDI R16,0x14
14C E010 LDI R17,0
14D DF00 RCALL _Delay_MS
(0117)
(0118) //显示高位
(0119) PORTD = 0x02;
14E E082 LDI R24,2
14F BB82 OUT 0x12,R24
(0120) PORTB = SEG7[CADV[i] >> 4];
150 E880 LDI R24,0x80
151 E090 LDI R25,0
152 01F5 MOVW R30,R10
153 0FE8 ADD R30,R24
154 1FF9 ADC R31,R25
155 81E0 LDD R30,Z+0
156 27FF CLR R31
157 95F5 ASR R31
158 95E7 ROR R30
159 95F5 ASR R31
15A 95E7 ROR R30
15B 95F5 ASR R31
15C 95E7 ROR R30
15D 95F5 ASR R31
15E 95E7 ROR R30
15F E680 LDI R24,0x60
160 E090 LDI R25,0
161 0FE8 ADD R30,R24
162 1FF9 ADC R31,R25
163 8020 LDD R2,Z+0
164 BA28 OUT 0x18,R2
(0121) Delay_MS(20);
165 E104 LDI R16,0x14
166 E010 LDI R17,0
167 DEE6 RCALL _Delay_MS
(0122)
(0123) //通道值
(0124) PORTD = 0x08;
168 E088 LDI R24,0x8
169 BB82 OUT 0x12,R24
(0125) PORTB = SEG7[i];
16A E680 LDI R24,0x60
16B E090 LDI R25,0
16C 01F5 MOVW R30,R10
16D 0FE8 ADD R30,R24
16E 1FF9 ADC R31,R25
16F 8020 LDD R2,Z+0
170 BA28 OUT 0x18,R2
(0126) Delay_MS(20);
FILE: <library>
171 E104 LDI R16,0x14
172 E010 LDI R17,0
173 DEDA RCALL _Delay_MS
174 CFA2 RJMP 0x0117
175 9508 RET
push_xgset300C:
176 935A ST R21,-Y
177 934A ST R20,-Y
178 92BA ST R11,-Y
179 92AA ST R10,-Y
17A 9508 RET
pop_xgset300C:
17B 90A9 LD R10,Y+
17C 90B9 LD R11,Y+
17D 9149 LD R20,Y+
17E 9159 LD R21,Y+
17F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -