📄 adc.lst
字号:
_LCD_write_data:
fuhao --> R22
data --> Y,+0
i --> R20
dat --> R20
Y --> R12
X --> R10
150 940E 02D4 CALL push_xgsetF03C
152 2EC2 MOV R12,R18
153 2EA0 MOV R10,R16
154 9725 SBIW R28,5
155 854D LDD R20,Y+13
156 855E LDD R21,Y+14
(0129) }
(0130) }
(0131)
(0132) /*-------------------------------------------------------------
(0133) 函数: 写数字
(0134) 参数:列---X=0~15,行---Y=0~1 写地址
(0135) dat为所要写的数字
(0136) ---------------------------------------------------------------*/
(0137) void LCD_write_data(unsigned char X,unsigned char Y,int dat)
(0138) {
(0139) unsigned char fuhao;
(0140) unsigned char data[5];
(0141) unsigned char i;
(0142)
(0143) if(dat<0)
157 3040 CPI R20,0
158 E0E0 LDI R30,0
159 075E CPC R21,R30
15A F43C BGE 0x0162
(0144) {
(0145) fuhao='-';
15B E26D LDI R22,0x2D
(0146) dat=0-dat;
15C 2422 CLR R2
15D 2433 CLR R3
15E 1A24 SUB R2,R20
15F 0A35 SBC R3,R21
160 01A1 MOVW R20,R2
(0147) }
161 C001 RJMP 0x0163
(0148) else
(0149) fuhao=' ';
162 E260 LDI R22,0x20
(0150) data[0]=fuhao;
163 8368 STD Y+0,R22
(0151) data[1]=dat/1000+0x30; dat%=1000;
164 EE28 LDI R18,0xE8
165 E033 LDI R19,3
166 018A MOVW R16,R20
167 940E 026E CALL div16s
169 01C8 MOVW R24,R16
16A 96C0 ADIW R24,0x30
16B 8389 STD Y+1,R24
16C EE28 LDI R18,0xE8
16D E033 LDI R19,3
16E 018A MOVW R16,R20
16F 940E 026A CALL mod16s
171 01A8 MOVW R20,R16
(0152) data[2]=dat/100+0x30; dat%=100;
172 E624 LDI R18,0x64
173 E030 LDI R19,0
174 940E 026E CALL div16s
176 01C8 MOVW R24,R16
177 96C0 ADIW R24,0x30
178 838A STD Y+2,R24
179 E624 LDI R18,0x64
17A E030 LDI R19,0
17B 018A MOVW R16,R20
17C 940E 026A CALL mod16s
17E 01A8 MOVW R20,R16
(0153) data[3]=dat/10+0x30;
17F E02A LDI R18,0xA
180 E030 LDI R19,0
181 940E 026E CALL div16s
183 01C8 MOVW R24,R16
184 96C0 ADIW R24,0x30
185 838B STD Y+3,R24
(0154) data[4]=dat%10+0x30;
186 E02A LDI R18,0xA
187 E030 LDI R19,0
188 018A MOVW R16,R20
189 940E 026A CALL mod16s
18B 01C8 MOVW R24,R16
18C 96C0 ADIW R24,0x30
18D 838C STD Y+4,R24
(0155)
(0156) LCD_set_xy(X,Y);
18E 2D2C MOV R18,R12
18F 2D0A MOV R16,R10
190 DF21 RCALL _LCD_set_xy
(0157) for(i=0;i<5;i++)
191 2744 CLR R20
192 C00B RJMP 0x019E
(0158) LCD_write_char(0,data[i]);
193 01CE MOVW R24,R28
194 2FE4 MOV R30,R20
195 27FF CLR R31
196 0FE8 ADD R30,R24
197 1FF9 ADC R31,R25
198 8120 LDD R18,Z+0
199 2733 CLR R19
19A 2700 CLR R16
19B 2711 CLR R17
19C DF2D RCALL _LCD_write_char
19D 9543 INC R20
19E 3045 CPI R20,5
19F F398 BCS 0x0193
1A0 9625 ADIW R28,5
1A1 940C 02DD JMP pop_xgsetF03C
_LCD_write_adc:
data --> Y,+0
i --> R20
dat --> R14
Y --> R12
X --> R10
1A3 940E 02AF CALL push_xgset30FC
1A5 2EC2 MOV R12,R18
1A6 2EA0 MOV R10,R16
1A7 9725 SBIW R28,5
1A8 84ED LDD R14,Y+13
1A9 84FE LDD R15,Y+14
(0159) }
(0160)
(0161) /*-------------------------------------------------------------
(0162) 函数: 写数字
(0163) 参数:列---X=0~15,行---Y=0~1 写地址
(0164) dat为所要写的数字
(0165) ---------------------------------------------------------------*/
(0166) void LCD_write_adc(unsigned char X,unsigned char Y,int dat)
(0167) {
(0168) unsigned char data[5];
(0169) unsigned char i;
(0170)
(0171) dat*=4.928;
1AA E504 LDI R16,0x54
1AB E010 LDI R17,0
1AC 940E 02EF CALL lpm32
1AE 0118 MOVW R2,R16
1AF 0129 MOVW R4,R18
1B0 0187 MOVW R16,R14
1B1 940E 0331 CALL int2fp
1B3 933A ST R19,-Y
1B4 932A ST R18,-Y
1B5 931A ST R17,-Y
1B6 930A ST R16,-Y
1B7 0181 MOVW R16,R2
1B8 0192 MOVW R18,R4
1B9 940E 0427 CALL fpmule2
1BB 940E 0303 CALL fpint
1BD 0178 MOVW R14,R16
(0172) data[0]=dat/1000+0x30; dat%=1000;
1BE EE28 LDI R18,0xE8
1BF E033 LDI R19,3
1C0 940E 026E CALL div16s
1C2 01C8 MOVW R24,R16
1C3 96C0 ADIW R24,0x30
1C4 8388 STD Y+0,R24
1C5 EE28 LDI R18,0xE8
1C6 E033 LDI R19,3
1C7 0187 MOVW R16,R14
1C8 940E 026A CALL mod16s
1CA 0178 MOVW R14,R16
(0173) data[1]='.';
1CB E28E LDI R24,0x2E
1CC 8389 STD Y+1,R24
(0174) data[2]=dat/100+0x30; dat%=100;
1CD E624 LDI R18,0x64
1CE E030 LDI R19,0
1CF 940E 026E CALL div16s
1D1 01C8 MOVW R24,R16
1D2 96C0 ADIW R24,0x30
1D3 838A STD Y+2,R24
1D4 E624 LDI R18,0x64
1D5 E030 LDI R19,0
1D6 0187 MOVW R16,R14
1D7 940E 026A CALL mod16s
1D9 0178 MOVW R14,R16
(0175) data[3]=dat/10+0x30;
1DA E02A LDI R18,0xA
1DB E030 LDI R19,0
1DC 940E 026E CALL div16s
1DE 01C8 MOVW R24,R16
1DF 96C0 ADIW R24,0x30
1E0 838B STD Y+3,R24
(0176) data[4]=dat%10+0x30;
1E1 E02A LDI R18,0xA
1E2 E030 LDI R19,0
1E3 0187 MOVW R16,R14
1E4 940E 026A CALL mod16s
1E6 01C8 MOVW R24,R16
1E7 96C0 ADIW R24,0x30
1E8 838C STD Y+4,R24
(0177)
(0178) LCD_set_xy(X,Y);
1E9 2D2C MOV R18,R12
1EA 2D0A MOV R16,R10
1EB DEC6 RCALL _LCD_set_xy
(0179) for(i=0;i<5;i++)
1EC 2744 CLR R20
1ED C00B RJMP 0x01F9
(0180) LCD_write_char(0,data[i]);
1EE 01CE MOVW R24,R28
1EF 2FE4 MOV R30,R20
1F0 27FF CLR R31
1F1 0FE8 ADD R30,R24
1F2 1FF9 ADC R31,R25
1F3 8120 LDD R18,Z+0
1F4 2733 CLR R19
1F5 2700 CLR R16
1F6 2711 CLR R17
1F7 DED2 RCALL _LCD_write_char
1F8 9543 INC R20
1F9 3045 CPI R20,5
1FA F398 BCS 0x01EE
1FB 9625 ADIW R28,5
1FC 940C 02A4 JMP pop_xgset30FC
FILE: D:\iccavr\mega16\11\10bit_adc\adc.h
(0001)
(0002) /******************************************************
(0003) ** ADC转换初始化 **
(0004) ******************************************************/
(0005) void adc_init(unsigned char adc_channel)
(0006) {
(0007) PORTA&=~(BIT(PA0)|BIT(PA1));
_adc_init:
adc_channel --> R16
1FE B38B IN R24,0x1B
1FF 7F8C ANDI R24,0xFC
200 BB8B OUT 0x1B,R24
(0008) DDRA&=~(BIT(PA0)|BIT(PA1));
201 B38A IN R24,0x1A
202 7F8C ANDI R24,0xFC
203 BB8A OUT 0x1A,R24
(0009) ACSR=0x80;
204 E880 LDI R24,0x80
205 B988 OUT 0x08,R24
(0010) ADMUX=(0<<REFS1)|(1<<REFS0)|adc_channel;
206 2F80 MOV R24,R16
207 6480 ORI R24,0x40
208 B987 OUT 0x07,R24
(0011) ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
209 E880 LDI R24,0x80
20A B986 OUT 0x06,R24
20B 9508 RET
_GetAdcValue:
i --> R20
adc_value --> R10
temp --> R12
adc_channel --> R12
20C 940E 02C6 CALL push_xgset303C
20E 2EC0 MOV R12,R16
(0012) }
(0013)
(0014) /******************************************************
(0015) ** 取通道adc_channel的ADC值 **
(0016) ******************************************************/
(0017) unsigned int GetAdcValue(unsigned char adc_channel)
(0018) {
(0019) unsigned int adc_value=0; //定义全局变量来存储ADC值
20F 24AA CLR R10
210 24BB CLR R11
(0020) unsigned int temp;
(0021) unsigned char i;
(0022)
(0023) adc_init(adc_channel);
211 2D0C MOV R16,R12
212 DFEB RCALL _adc_init
(0024) delay_nms(30);
213 E10E LDI R16,0x1E
214 E010 LDI R17,0
215 DE6E RCALL _delay_nms
(0025)
(0026) for(i=0;i<19;i++)
216 2744 CLR R20
217 C010 RJMP 0x0228
(0027) {
(0028) ADCSRA|=(1<<ADSC);
218 9A36 SBI 0x06,6
(0029) while((ADCSRA&0x10)==0);
219 9B34 SBIS 0x06,4
21A CFFE RJMP 0x0219
(0030) temp=ADCL;
21B B0C4 IN R12,0x04
21C 24DD CLR R13
(0031) temp|=(int)ADCH<<8;
21D B025 IN R2,0x05
21E 2433 CLR R3
21F 2C32 MOV R3,R2
220 2422 CLR R2
221 28C2 OR R12,R2
222 28D3 OR R13,R3
(0032) adc_value=adc_value+temp;
223 0CAC ADD R10,R12
224 1CBD ADC R11,R13
(0033) ADCSR|=(0<<ADSC);
225 B026 IN R2,0x06
226 B826 OUT 0x06,R2
227 9543 INC R20
228 3143 CPI R20,0x13
229 F370 BCS 0x0218
(0034) }
(0035)
(0036) adc_value=adc_value/19;
22A E123 LDI R18,0x13
22B E030 LDI R19,0
22C 0185 MOVW R16,R10
22D 940E 028A CALL div16u
22F 0158 MOVW R10,R16
(0037) return adc_value;
230 940C 02CD JMP pop_xgset303C
FILE: D:\iccavr\mega16\11\10bit_adc\test.c
(0001) //ICC-AVR application builder : 2008-11-4 12:53:50
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #include "delay.h"
(0009) #include "lcd1602.h"
(0010) #include "adc.h"
(0011) //call this routine to initialize all peripherals
(0012) void init_devices(void)
(0013) {
(0014) //stop errant interrupts until set up
(0015) CLI(); //disable all interrupts
_init_devices:
232 94F8 BCLR 7
(0016) LCD_init();
233 DE5F RCALL _LCD_init
(0017) PORTD|=BIT(PD7);
234 9A97 SBI 0x12,7
(0018) DDRD|=BIT(PD7);
235 9A8F SBI 0x11,7
(0019)
(0020) MCUCR = 0x00;
236 2422 CLR R2
237 BE25 OUT 0x35,R2
(0021) GICR = 0x00;
238 BE2B OUT 0x3B,R2
(0022) TIMSK = 0x00; //timer interrupt sources
239 BE29 OUT 0x39,R2
(0023) SEI(); //re-enable interrupts
23A 9478 BSET 7
23B 9508 RET
_main:
adc1 --> R10
adc0 --> R10
23C 9722 SBIW R28,2
(0024) //all peripherals are now initialized
(0025) }
(0026)
(0027) //
(0028) void main(void)
(0029) {
(0030) unsigned int adc0,adc1;
(0031) init_devices();
23D DFF4 RCALL _init_devices
(0032) //insert your functional code here...
(0033) LCD_write_string(0,0,"10_Bit ADC Test!");
23E E882 LDI R24,0x82
23F E090 LDI R25,0
240 8399 STD Y+1,R25
241 8388 STD Y+0,R24
242 2722 CLR R18
243 2700 CLR R16
244 DEF3 RCALL _LCD_write_string
(0034) delay_nms(2000);
245 ED00 LDI R16,0xD0
246 E017 LDI R17,7
247 DE3C RCALL _delay_nms
(0035) LCD_write_string(0,0," ADC0: V ");
248 E781 LDI R24,0x71
249 E090 LDI R25,0
24A 8399 STD Y+1,R25
24B 8388 STD Y+0,R24
24C 2722 CLR R18
24D 2700 CLR R16
24E DEE9 RCALL _LCD_write_string
(0036) LCD_write_string(0,1," ADC1: V ");
24F E680 LDI R24,0x60
250 E090 LDI R25,0
251 8399 STD Y+1,R25
252 8388 STD Y+0,R24
253 E021 LDI R18,1
254 2700 CLR R16
255 DEE2 RCALL _LCD_write_string
256 C010 RJMP 0x0267
(0037) while(1)
(0038) {
(0039) adc0=GetAdcValue(0);
257 2700 CLR R16
258 DFB3 RCALL _GetAdcValue
259 0158 MOVW R10,R16
(0040) LCD_write_adc(7,0,adc0);
25A 82B9 STD Y+1,R11
25B 82A8 STD Y+0,R10
25C 2722 CLR R18
25D E007 LDI R16,7
25E DF44 RCALL _LCD_write_adc
(0041)
(0042) adc1=GetAdcValue(1);
25F E001 LDI R16,1
260 DFAB RCALL _GetAdcValue
261 0158 MOVW R10,R16
(0043) LCD_write_adc(7,1,adc1);
FILE: <library>
262 82B9 STD Y+1,R11
263 82A8 STD Y+0,R10
264 E021 LDI R18,1
265 E007 LDI R16,7
266 DF3C RCALL _LCD_write_adc
267 CFEF RJMP 0x0257
268 9622 ADIW R28,2
269 9508 RET
mod16s:
26A 9468 BSET 6
26B 92DA ST R13,-Y
26C 2ED1 MOV R13,R17
26D C004 RJMP 0x0272
div16s:
26E 94E8 BCLR 6
26F 92DA ST R13,-Y
270 2ED1 MOV R13,R17
271 26D3 EOR R13,R19
272 FF17 SBRS R17,7
273 C004 RJMP 0x0278
274 9510 COM R17
275 9500 COM R16
276 5F0F SUBI R16,0xFF
277 4F1F SBCI R17,0xFF
278 FF37 SBRS R19,7
279 C004 RJMP 0x027E
27A 9530 COM R19
27B 9520 COM R18
27C 5F2F SUBI R18,0xFF
27D 4F3F SBCI R19,0xFF
27E 940E 028B CALL xdiv16u
280 FED7 SBRS R13,7
281 C004 RJMP 0x0286
282 9510 COM R17
283 9500 COM R16
284 5F0F SUBI R16,0xFF
285 4F1F SBCI R17,0xFF
286 90D9 LD R13,Y+
287 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -