📄 adc.lst
字号:
__start:
__text_start:
38 EFCF LDI R28,0xFF
39 E0D4 LDI R29,4
3A BFCD OUT 0x3D,R28
3B BFDE OUT 0x3E,R29
3C 51C0 SUBI R28,0x10
3D 40D0 SBCI R29,0
3E EA0A LDI R16,0xAA
3F 8308 STD Y+0,R16
40 2400 CLR R0
41 E0E4 LDI R30,4
42 E0F1 LDI R31,1
43 E011 LDI R17,1
44 30E6 CPI R30,6
45 07F1 CPC R31,R17
46 F011 BEQ 0x0049
47 9201 ST R0,Z+
48 CFFB RJMP 0x0044
49 8300 STD Z+0,R16
4A E6EC LDI R30,0x6C
4B E0F0 LDI R31,0
4C E0A0 LDI R26,0
4D E0B1 LDI R27,1
4E E010 LDI R17,0
4F 37E0 CPI R30,0x70
50 07F1 CPC R31,R17
51 F021 BEQ 0x0056
52 95C8 LPM
53 9631 ADIW R30,1
54 920D ST R0,X+
55 CFF9 RJMP 0x004F
56 940E 00B9 CALL _main
_exit:
58 CFFF RJMP _exit
FILE: E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
(0001) // **************************************************************
(0002) // *** 广 州 天 河 双 龙 电 子 公 司 ***
(0003) // *** http://www.sl.com.cn ***
(0004) // *** 实验:ADC转换 ***
(0005) // *** 作者:zxy@sl.com.cn ***
(0006) // *** 2006年3月28日 ***
(0007) // *** 目标MCU:MEGA169 晶振:内部(INT)8MHZ ***
(0008) // **************************************************************
(0009) //用跳线短接J3的ADC2,调节可变电阻R7,LED显示将发生变化
(0010) #include <iom169v.h>
(0011) #include <macros.h>
(0012) #define Vref 3212//参考电压值,注意不同环境下的Vref不相同
(0013)
(0014) extern const unsigned char seg_table[16];
(0015) extern unsigned char led_buff[4];
(0016) extern void delay_ms(unsigned int time);
(0017) extern void display(void);
(0018) unsigned int adc_rel;//AD转换结果
(0019)
(0020) //ADC初始化
(0021) void adc_init(void)
(0022) {
(0023) ADCSRA = 0x00; //设置前,先关闭ADC
_adc_init:
59 2422 CLR R2
5A 9220 007A STS 0x007A,R2
(0024) ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC1
5C E481 LDI R24,0x41
5D 9380 007C STS 0x007C,R24
(0025) ACSR =(1<<ACD);//关闭模拟比较器,禁止位P148
5F E880 LDI R24,0x80
60 BF80 OUT 0x30,R24
(0026) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//ADC时钟64分频
61 EC8F LDI R24,0xCF
62 9380 007A STS 0x007A,R24
64 9508 RET
_adc_isr:
65 938A ST R24,-Y
66 939A ST R25,-Y
67 B78F IN R24,0x3F
68 938A ST R24,-Y
(0027) }
(0028)
(0029) //ADC完成中断
(0030) #pragma interrupt_handler adc_isr:20
(0031) //AD 中断
(0032)
(0033) void adc_isr(void)
(0034) {
(0035)
(0036) adc_rel = ADC&0x3ff;
69 9180 0078 LDS R24,0x0078
6B 9190 0079 LDS R25,0x0079
6D 7093 ANDI R25,3
6E 9390 0105 STS adc_rel+1,R25
70 9380 0104 STS adc_rel,R24
(0037) //ADMUX =(1<<REFS0)|(1<<MUX0);
(0038) ADCSRA|=(1<<ADSC);//启动AD转换
72 9180 007A LDS R24,0x007A
74 6480 ORI R24,0x40
75 9380 007A STS 0x007A,R24
77 9189 LD R24,Y+
78 BF8F OUT 0x3F,R24
79 9199 LD R25,Y+
7A 9189 LD R24,Y+
7B 9518 RETI
_ADCtoBCD:
i --> R12
temp --> R10
7C 940E 0165 CALL push_xgsetF03C
7E 0158 MOVW R10,R16
(0039) }
(0040)
(0041) //ADC结果转换成电压值
(0042) void ADCtoBCD(unsigned int temp)
(0043) {
(0044) unsigned char i;
(0045) temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/1024);//ADC结果转换成电压值
7F 0115 MOVW R2,R10
80 2444 CLR R4
81 2455 CLR R5
82 E84C LDI R20,0x8C
83 E05C LDI R21,0xC
84 E060 LDI R22,0
85 E070 LDI R23,0
86 925A ST R5,-Y
87 924A ST R4,-Y
88 923A ST R3,-Y
89 922A ST R2,-Y
8A 018A MOVW R16,R20
8B 019B MOVW R18,R22
8C 940E 0131 CALL empy32s
8E E08A LDI R24,0xA
8F E090 LDI R25,0
90 938A ST R24,-Y
91 940E 01A2 CALL lsr32
93 0158 MOVW R10,R16
(0046) for(i=0;i<4;i++)
94 24CC CLR R12
95 C019 RJMP 0x00AF
(0047) {
(0048) led_buff[i]=seg_table[temp%10];//结果存入显示缓存
96 E02A LDI R18,0xA
97 E030 LDI R19,0
98 0185 MOVW R16,R10
99 940E 0115 CALL mod16u
9B 01F8 MOVW R30,R16
9C E58C LDI R24,0x5C
9D E090 LDI R25,0
9E 0FE8 ADD R30,R24
9F 1FF9 ADC R31,R25
A0 9024 LPM R2,0(Z)
A1 E080 LDI R24,0
A2 E091 LDI R25,1
A3 2DEC MOV R30,R12
A4 27FF CLR R31
A5 0FE8 ADD R30,R24
A6 1FF9 ADC R31,R25
A7 8220 STD Z+0,R2
(0049) temp=temp/10;
A8 E02A LDI R18,0xA
A9 E030 LDI R19,0
AA 0185 MOVW R16,R10
AB 940E 0117 CALL div16u
AD 0158 MOVW R10,R16
AE 94C3 INC R12
AF 2D8C MOV R24,R12
B0 3084 CPI R24,4
B1 F320 BCS 0x0096
(0050) }
(0051) led_buff[3]&=0x7f;
B2 9180 0103 LDS R24,led_buff+3
B4 778F ANDI R24,0x7F
B5 9380 0103 STS led_buff+3,R24
B7 940C 016E JMP pop_xgsetF03C
(0052) }
(0053)
(0054) void main(void)
(0055) {
(0056) unsigned int adc_old;
(0057) adc_init();//AD初始化
_main:
adc_old --> R10
B9 DF9F RCALL _adc_init
(0058)
(0059) DDRE=0xff;//E口初始化
BA EF8F LDI R24,0xFF
BB B98D OUT 0x0D,R24
(0060) PORTE=0xff;//E口初始化
BC B98E OUT 0x0E,R24
(0061) DDRB|=0xf0;//B口初始化
BD B184 IN R24,0x04
BE 6F80 ORI R24,0xF0
BF B984 OUT 0x04,R24
(0062) PORTB|=0xf0;//B口初始化
C0 B185 IN R24,0x05
C1 6F80 ORI R24,0xF0
C2 B985 OUT 0x05,R24
(0063) SEI();//使能全局中断
C3 9478 BSET 7
C4 C00C RJMP 0x00D1
(0064) while(1)
(0065) {
(0066) if(adc_old!=adc_rel)
C5 9020 0104 LDS R2,adc_rel
C7 9030 0105 LDS R3,adc_rel+1
C9 14A2 CP R10,R2
CA 04B3 CPC R11,R3
CB F019 BEQ 0x00CF
(0067) {
(0068) adc_old=adc_rel; //AD转换结果
CC 0151 MOVW R10,R2
(0069) ADCtoBCD(adc_old);//进制转换
CD 0181 MOVW R16,R2
CE DFAD RCALL _ADCtoBCD
(0070) }
(0071) display(); //显示函数
CF 940E 00EA CALL _display
D1 CFF3 RJMP 0x00C5
D2 9508 RET
FILE: E:\WORK\WORK_DEMO\169P_demo\169ADC\LEDNUM.C
(0001) #include<iom169v.h>
(0002) const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
(0003) 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0004) unsigned char led_buff[4]={0,0,0,0};
(0005) /* 微秒级延时程序 */
(0006) void delay_us(int time)
(0007) {
(0008) do
(0009) {
(0010) time--;
_delay_us:
time --> R16
D3 5001 SUBI R16,1
D4 4010 SBCI R17,0
(0011) }
(0012) while (time>1);
D5 E081 LDI R24,1
D6 E090 LDI R25,0
D7 1780 CP R24,R16
D8 0791 CPC R25,R17
D9 F3CC BLT 0x00D3
DA 9508 RET
_delay_ms:
time --> R20
DB 934A ST R20,-Y
DC 935A ST R21,-Y
DD 01A8 MOVW R20,R16
(0013) }
(0014) /* 毫秒级延时程序 */
(0015) void delay_ms(unsigned int time)
(0016) {
DE C005 RJMP 0x00E4
(0017) while(time!=0)
(0018) {
(0019) delay_us(1000);
DF EE08 LDI R16,0xE8
E0 E013 LDI R17,3
E1 DFF1 RCALL _delay_us
(0020) time--;
E2 5041 SUBI R20,1
E3 4050 SBCI R21,0
E4 3040 CPI R20,0
E5 0745 CPC R20,R21
E6 F7C1 BNE 0x00DF
E7 9159 LD R21,Y+
E8 9149 LD R20,Y+
E9 9508 RET
_display:
n --> R20
EA 934A ST R20,-Y
EB 935A ST R21,-Y
(0021) }
(0022) }
(0023) void display(void)
(0024) {
(0025) unsigned char n;
(0026) DDRE=0xff;
EC EF8F LDI R24,0xFF
ED B98D OUT 0x0D,R24
(0027) PORTE=0xff;
EE B98E OUT 0x0E,R24
(0028) DDRB|=0xf0;
EF B184 IN R24,0x04
F0 6F80 ORI R24,0xF0
F1 B984 OUT 0x04,R24
(0029) PORTB|=0xf0;
F2 B185 IN R24,0x05
F3 6F80 ORI R24,0xF0
F4 B985 OUT 0x05,R24
(0030) for(n=0;n<4;n++)
F5 2744 CLR R20
F6 C019 RJMP 0x0110
(0031) {
(0032) PORTE=led_buff[n];
F7 E080 LDI R24,0
F8 E091 LDI R25,1
F9 2FE4 MOV R30,R20
FA 27FF CLR R31
FB 0FE8 ADD R30,R24
FC 1FF9 ADC R31,R25
FD 8020 LDD R2,Z+0
FE B82E OUT 0x0E,R2
(0033) PORTB&=~(1<<(n+4));
FF 2F14 MOV R17,R20
100 5F1C SUBI R17,0xFC
101 E001 LDI R16,1
102 940E 019C CALL lsl8
104 2E20 MOV R2,R16
105 9420 COM R2
106 B035 IN R3,0x05
107 2032 AND R3,R2
108 B835 OUT 0x05,R3
(0034) delay_ms(1);
109 E001 LDI R16,1
10A E010 LDI R17,0
10B DFCF RCALL _delay_ms
(0035) PORTB|=0xf0;
FILE: <library>
10C B185 IN R24,0x05
10D 6F80 ORI R24,0xF0
10E B985 OUT 0x05,R24
10F 9543 INC R20
110 3044 CPI R20,4
111 F328 BCS 0x00F7
112 9159 LD R21,Y+
113 9149 LD R20,Y+
114 9508 RET
mod16u:
115 9468 BSET 6
116 C001 RJMP xdiv16u
div16u:
117 94E8 BCLR 6
xdiv16u:
118 92EA ST R14,-Y
119 92FA ST R15,-Y
11A 938A ST R24,-Y
11B 24EE CLR R14
11C 24FF CLR R15
11D E180 LDI R24,0x10
11E 0F00 LSL R16
11F 1F11 ROL R17
120 1CEE ROL R14
121 1CFF ROL R15
122 16E2 CP R14,R18
123 06F3 CPC R15,R19
124 F018 BCS 0x0128
125 1AE2 SUB R14,R18
126 0AF3 SBC R15,R19
127 9503 INC R16
128 958A DEC R24
129 F7A1 BNE 0x011E
12A F416 BRTC 0x012D
12B 2D0E MOV R16,R14
12C 2D1F MOV R17,R15
12D 9189 LD R24,Y+
12E 90F9 LD R15,Y+
12F 90E9 LD R14,Y+
130 9508 RET
empy32s:
empy32u:
131 940E 0177 CALL long_prolog
133 927A ST R7,-Y
134 940E 0190 CALL tstzero1
136 F159 BEQ 0x0162
137 2477 CLR R7
138 940E 0196 CALL tstzero2
13A F419 BNE 0x013E
13B 018C MOVW R16,R24
13C 019D MOVW R18,R26
13D C024 RJMP 0x0162
13E 920A ST R0,-Y
13F 921A ST R1,-Y
140 9F08 MUL R16,R24
141 2CB0 MOV R11,R0
142 2CA1 MOV R10,R1
143 9F28 MUL R18,R24
144 2C90 MOV R9,R0
145 2C81 MOV R8,R1
146 9F18 MUL R17,R24
147 0CA0 ADD R10,R0
148 1C91 ADC R9,R1
149 1C87 ADC R8,R7
14A 9F09 MUL R16,R25
14B 0CA0 ADD R10,R0
14C 1C91 ADC R9,R1
14D 1C87 ADC R8,R7
14E 9F19 MUL R17,R25
14F 0C90 ADD R9,R0
150 1C81 ADC R8,R1
151 9F0A MUL R16,R26
152 0C90 ADD R9,R0
153 1C81 ADC R8,R1
154 9F38 MUL R19,R24
155 0C80 ADD R8,R0
156 9F29 MUL R18,R25
157 0C80 ADD R8,R0
158 9F1A MUL R17,R26
159 0C80 ADD R8,R0
15A 9F0B MUL R16,R27
15B 0C80 ADD R8,R0
15C 9019 LD R1,Y+
15D 9009 LD R0,Y+
15E 2D0B MOV R16,R11
15F 2D1A MOV R17,R10
160 2D29 MOV R18,R9
161 2D38 MOV R19,R8
162 9079 LD R7,Y+
163 940C 0185 JMP long_epilog
push_xgsetF03C:
165 937A ST R23,-Y
166 936A ST R22,-Y
167 935A ST R21,-Y
168 934A ST R20,-Y
169 92DA ST R13,-Y
16A 92CA ST R12,-Y
16B 92BA ST R11,-Y
16C 92AA ST R10,-Y
16D 9508 RET
pop_xgsetF03C:
16E 90A9 LD R10,Y+
16F 90B9 LD R11,Y+
170 90C9 LD R12,Y+
171 90D9 LD R13,Y+
172 9149 LD R20,Y+
173 9159 LD R21,Y+
174 9169 LD R22,Y+
175 9179 LD R23,Y+
176 9508 RET
long_prolog:
177 928A ST R8,-Y
178 929A ST R9,-Y
179 92AA ST R10,-Y
17A 92BA ST R11,-Y
17B 93EA ST R30,-Y
17C 938A ST R24,-Y
17D 939A ST R25,-Y
17E 93AA ST R26,-Y
17F 93BA ST R27,-Y
180 8589 LDD R24,Y+9
181 859A LDD R25,Y+10
182 85AB LDD R26,Y+11
183 85BC LDD R27,Y+12
184 9508 RET
long_epilog:
185 91B9 LD R27,Y+
186 91A9 LD R26,Y+
187 9199 LD R25,Y+
188 9189 LD R24,Y+
189 91E9 LD R30,Y+
18A 90B9 LD R11,Y+
18B 90A9 LD R10,Y+
18C 9099 LD R9,Y+
18D 9089 LD R8,Y+
18E 9624 ADIW R28,4
18F 9508 RET
tstzero1:
190 27EE CLR R30
191 2BE0 OR R30,R16
192 2BE1 OR R30,R17
193 2BE2 OR R30,R18
194 2BE3 OR R30,R19
195 9508 RET
tstzero2:
196 27EE CLR R30
197 2BE8 OR R30,R24
198 2BE9 OR R30,R25
199 2BEA OR R30,R26
19A 2BEB OR R30,R27
19B 9508 RET
lsl8:
19C 2311 TST R17
19D F019 BEQ 0x01A1
19E 0F00 LSL R16
19F 951A DEC R17
1A0 CFFB RJMP lsl8
1A1 9508 RET
lsr32:
1A2 920F PUSH R0
1A3 9009 LD R0,Y+
1A4 2000 TST R0
1A5 F031 BEQ 0x01AC
1A6 9536 LSR R19
1A7 9527 ROR R18
1A8 9517 ROR R17
1A9 9507 ROR R16
1AA 940A DEC R0
1AB CFF8 RJMP 0x01A4
1AC 900F POP R0
1AD 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -