📄 adc.lst
字号:
row --> R22
186 940E 02C7 CALL push_xgsetF00C
188 0159 MOVW R10,R18
189 01B8 MOVW R22,R16
18A 814E LDD R20,Y+6
18B 815F LDD R21,Y+7
(0180) }
(0181) }
(0182) //====================================================
(0183) // 描述:在任意位置写数字函数
(0184) // 入口:’row‘表示要写数字所在的行地址,只能为1或2
(0185) // ’col‘表示要写数字所在的列地址,只能为0--15
(0186) // ‘num’表示要写的数字,只能为0--9
(0187) // 出口:无
(0188) //===================================================
(0189) void WriteNum(uint row,uint col,uint num)
(0190) {
(0191) if (row == 1) row = 0x80 + col;
18C 3061 CPI R22,1
18D E0E0 LDI R30,0
18E 077E CPC R23,R30
18F F421 BNE 0x0194
190 01B5 MOVW R22,R10
191 5860 SUBI R22,0x80
192 4F7F SBCI R23,0xFF
193 C003 RJMP 0x0197
(0192) else row = 0xC0 + col;
194 01B5 MOVW R22,R10
195 5460 SUBI R22,0x40
196 4F7F SBCI R23,0xFF
(0193) writecom(row);
197 2F06 MOV R16,R22
198 DF10 RCALL _writecom
(0194) if (num<=0 | num>9) num =0x30;
199 3040 CPI R20,0
19A 0745 CPC R20,R21
19B F421 BNE 0x01A0
19C E081 LDI R24,1
19D E090 LDI R25,0
19E 015C MOVW R10,R24
19F C002 RJMP 0x01A2
1A0 24AA CLR R10
1A1 24BB CLR R11
1A2 E089 LDI R24,0x9
1A3 E090 LDI R25,0
1A4 1784 CP R24,R20
1A5 0795 CPC R25,R21
1A6 F418 BCC 0x01AA
1A7 E061 LDI R22,1
1A8 E070 LDI R23,0
1A9 C002 RJMP 0x01AC
1AA 2766 CLR R22
1AB 2777 CLR R23
1AC 0115 MOVW R2,R10
1AD 2A26 OR R2,R22
1AE 2A37 OR R3,R23
1AF 2022 TST R2
1B0 F411 BNE 0x01B3
1B1 2033 TST R3
1B2 F019 BEQ 0x01B6
1B3 E340 LDI R20,0x30
1B4 E050 LDI R21,0
1B5 C002 RJMP 0x01B8
(0195) else num = 0x30 + num;
1B6 5D40 SUBI R20,0xD0
1B7 4F5F SBCI R21,0xFF
(0196)
(0197) PORTA|=(1<<RS);
1B8 9ADD SBI 0x1B,5
(0198) s_ms(500);
1B9 EF04 LDI R16,0xF4
1BA E011 LDI R17,1
1BB DEB9 RCALL _s_ms
(0199) PORTA&=~(1<<RW);
1BC 98DE CBI 0x1B,6
(0200) s_ms(500);
1BD EF04 LDI R16,0xF4
1BE E011 LDI R17,1
1BF DEB5 RCALL _s_ms
(0201) PORTD = num;
1C0 BB42 OUT 0x12,R20
(0202) s_ms(500);
1C1 EF04 LDI R16,0xF4
1C2 E011 LDI R17,1
1C3 DEB1 RCALL _s_ms
(0203) PORTA|=(1<<EN);
1C4 9ADF SBI 0x1B,7
(0204) s_ms(500);
1C5 EF04 LDI R16,0xF4
1C6 E011 LDI R17,1
1C7 DEAD RCALL _s_ms
(0205) PORTA&=~(1<<EN);
1C8 98DF CBI 0x1B,7
(0206) s_ms(500);
1C9 EF04 LDI R16,0xF4
1CA E011 LDI R17,1
1CB DEA9 RCALL _s_ms
1CC 940C 02CE JMP pop_xgsetF00C
_WriteChar:
t --> R12
i --> R10
pBuffer --> R20
num --> Y,+8
col --> R10
row --> R22
1CE 940E 02D5 CALL push_xgsetF03C
1D0 2EA2 MOV R10,R18
1D1 2F60 MOV R22,R16
1D2 854A LDD R20,Y+10
1D3 855B LDD R21,Y+11
(0207) }
(0208) //================================================================
(0209) // 描述:在任意位置写任意多个字符
(0210) // 入口:’row‘要写的字符所在的行,只能为1或2;
(0211) // ‘col’要写的字符所在的列,只能为0---15
(0212) // ‘num’要写字符的个数
(0213) // ‘pbuffer’要写字符的首地址
(0214) //==================================================================
(0215) void WriteChar(uchar row,uchar col,uint num,uchar *pBuffer)
(0216) {
(0217) uchar i,t;
(0218) if (row == 1) row = 0x80 + col;
1D4 3061 CPI R22,1
1D5 F419 BNE 0x01D9
1D6 2D6A MOV R22,R10
1D7 5860 SUBI R22,0x80
1D8 C002 RJMP 0x01DB
(0219) else row = 0xC0 + col;
1D9 2D6A MOV R22,R10
1DA 5460 SUBI R22,0x40
(0220) writecom(row);
1DB 2F06 MOV R16,R22
1DC DECC RCALL _writecom
(0221) //if (num<=0 | num>9) num =0x30;
(0222) //else num = 0x30 + num;
(0223)
(0224) PORTA|=(1<<RS);
1DD 9ADD SBI 0x1B,5
(0225) s_ms(500);
1DE EF04 LDI R16,0xF4
1DF E011 LDI R17,1
1E0 DE94 RCALL _s_ms
(0226) PORTA&=~(1<<RW);
1E1 98DE CBI 0x1B,6
(0227) s_ms(500);
1E2 EF04 LDI R16,0xF4
1E3 E011 LDI R17,1
1E4 DE90 RCALL _s_ms
(0228) for(i=num;i!=0;i--)
1E5 84A8 LDD R10,Y+8
1E6 C014 RJMP 0x01FB
(0229) {
(0230) t = *pBuffer;
1E7 01FA MOVW R30,R20
1E8 80C0 LDD R12,Z+0
(0231) s_ms(500);
1E9 EF04 LDI R16,0xF4
1EA E011 LDI R17,1
1EB DE89 RCALL _s_ms
(0232) PORTD = t;
1EC BAC2 OUT 0x12,R12
(0233) s_ms(500);
1ED EF04 LDI R16,0xF4
1EE E011 LDI R17,1
1EF DE85 RCALL _s_ms
(0234) PORTA|=(1<<EN);
1F0 9ADF SBI 0x1B,7
(0235) s_ms(500);
1F1 EF04 LDI R16,0xF4
1F2 E011 LDI R17,1
1F3 DE81 RCALL _s_ms
(0236) PORTA&=~(1<<EN);
1F4 98DF CBI 0x1B,7
(0237) s_ms(500);
1F5 EF04 LDI R16,0xF4
1F6 E011 LDI R17,1
1F7 DE7D RCALL _s_ms
(0238) pBuffer++;
1F8 5F4F SUBI R20,0xFF
1F9 4F5F SBCI R21,0xFF
1FA 94AA DEC R10
1FB 20AA TST R10
1FC F751 BNE 0x01E7
1FD 940C 02DE JMP pop_xgsetF03C
_main:
adc_h1 --> Y,+5
adc_l1 --> Y,+5
ten_4 --> Y,+5
adc_h0 --> R12
adc_l0 --> R10
adc_data1 --> R20
ten_1 --> R10
ten_2 --> R12
adc_data0 --> R22
ten_3 --> R14
i --> R20
1FF 9724 SBIW R28,4
FILE: D:\16实验程序\模数转换\adc_1602\ADC-1602.c
(0001) //ADC转换程序
(0002) //通过电位器W1来调节ADC0的电压输入
(0003) //采集的电压值用1602液晶显示
(0004) #include<iom16v.h>
(0005) #include <macros.h>
(0006) #include"1602.h"
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009)
(0010) uchar adc_0[]={"ADC_0: . V"};
(0011) uchar adc_1[]={"ADC_1: . V"};
(0012)
(0013) //ADC测试,使用1602显示ADC0和ADC1的值
(0014) //主函数
(0015) main()
(0016) {
(0017) uchar ten_1,ten_2,ten_3,ten_4,i;
(0018) uint adc_data0,adc_l0,adc_h0,adc_data1,adc_l1,adc_h1;
(0019)
(0020) //初始化端口
(0021) DDRA=0xf0;
200 EF80 LDI R24,0xF0
201 BB8A OUT 0x1A,R24
(0022) PORTA=0x00;
202 2422 CLR R2
203 BA2B OUT 0x1B,R2
(0023) DDRB=0x00;
204 BA27 OUT 0x17,R2
(0024) DDRD=0xff;
205 EF8F LDI R24,0xFF
206 BB81 OUT 0x11,R24
(0025) PORTD=0x00;
207 BA22 OUT 0x12,R2
(0026) //1602初始化
(0027) LcdInit();
208 DEBC RCALL _LcdInit
(0028) WriteChar(1,2,11,adc_0);
209 E080 LDI R24,0
20A E091 LDI R25,1
20B 839B STD Y+3,R25
20C 838A STD Y+2,R24
20D E08B LDI R24,0xB
20E E090 LDI R25,0
20F 8399 STD Y+1,R25
210 8388 STD Y+0,R24
211 E022 LDI R18,2
212 E001 LDI R16,1
213 DFBA RCALL _WriteChar
(0029) WriteChar(2,2,11,adc_1);
214 E08C LDI R24,0xC
215 E091 LDI R25,1
216 839B STD Y+3,R25
217 838A STD Y+2,R24
218 E08B LDI R24,0xB
219 E090 LDI R25,0
21A 8399 STD Y+1,R25
21B 8388 STD Y+0,R24
21C E022 LDI R18,2
21D E002 LDI R16,2
21E DFAF RCALL _WriteChar
21F C088 RJMP 0x02A8
(0030)
(0031) while(1)
(0032) {
(0033) //取ADC_0
(0034) ADCSR=0x00;
220 2422 CLR R2
221 B826 OUT 0x06,R2
(0035) ADMUX=0x40;
222 E480 LDI R24,0x40
223 B987 OUT 0x07,R24
(0036) ADCSR=(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|0x07; //128分频,连续转换
224 EE87 LDI R24,0xE7
225 B986 OUT 0x06,R24
(0037) s_ms(500); //延时很重要,给出转换的时间
226 EF04 LDI R16,0xF4
227 E011 LDI R17,1
228 DE4C RCALL _s_ms
(0038) adc_l0=ADCL;
229 B0A4 IN R10,0x04
22A 24BB CLR R11
(0039) adc_h0=ADCH;
22B B0C5 IN R12,0x05
22C 24DD CLR R13
(0040) adc_data0=adc_h0<<8|adc_l0;
22D 01B6 MOVW R22,R12
22E 2F76 MOV R23,R22
22F 2766 CLR R22
230 296A OR R22,R10
231 297B OR R23,R11
(0041) adc_data0=adc_data0>>1; //放弃一位的精度
232 9576 LSR R23
233 9567 ROR R22
(0042) adc_data0-=35; //修正
234 5263 SUBI R22,0x23
235 4070 SBCI R23,0
(0043)
(0044) //取ADC_1
(0045) //ADCSR=0x00;
(0046) //ADMUX=0x41;
(0047) //ADCSR=(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|0x07;
(0048) //s_ms(500);
(0049) //adc_l1=ADCL;
(0050) //adc_h1=ADCH;
(0051) //adc_data1=adc_h1<<8|adc_l1;
(0052) //adc_data1=adc_data1>>1;
(0053) //adc_data1-=35;
(0054) adc_data1=500;
236 EF44 LDI R20,0xF4
237 E051 LDI R21,1
(0055)
(0056) //显示ADC0
(0057) ten_3=(adc_data0)/100;
238 E624 LDI R18,0x64
239 E030 LDI R19,0
23A 018B MOVW R16,R22
23B 940E 02AD CALL div16u
23D 2EE0 MOV R14,R16
(0058) ten_2=(adc_data0-(ten_3*100))/10;
23E E684 LDI R24,0x64
23F 9D8E MUL R24,R14
240 018B MOVW R16,R22
241 1900 SUB R16,R0
242 0911 SBC R17,R1
243 E02A LDI R18,0xA
244 E030 LDI R19,0
245 940E 02AD CALL div16u
247 2EC0 MOV R12,R16
(0059) ten_1=adc_data0-(ten_3*100)-ten_2*10;
248 E684 LDI R24,0x64
249 9D8E MUL R24,R14
24A 2EA6 MOV R10,R22
24B 18A0 SUB R10,R0
24C 08B1 SBC R11,R1
24D E08A LDI R24,0xA
24E 9D8C MUL R24,R12
24F 18A0 SUB R10,R0
250 08B1 SBC R11,R1
(0060) WriteNum(1,8,(ten_3));
251 2C2E MOV R2,R14
252 2433 CLR R3
253 8239 STD Y+1,R3
254 8228 STD Y+0,R2
255 E028 LDI R18,0x8
256 E030 LDI R19,0
257 E001 LDI R16,1
258 E010 LDI R17,0
259 DF2C RCALL _WriteNum
(0061) WriteNum(1,10,(ten_2));
25A 2C2C MOV R2,R12
25B 2433 CLR R3
25C 8239 STD Y+1,R3
25D 8228 STD Y+0,R2
25E E02A LDI R18,0xA
25F E030 LDI R19,0
260 E001 LDI R16,1
261 E010 LDI R17,0
262 DF23 RCALL _WriteNum
(0062) WriteNum(1,11,(ten_1));
263 2C2A MOV R2,R10
264 2433 CLR R3
265 8239 STD Y+1,R3
266 8228 STD Y+0,R2
267 E02B LDI R18,0xB
268 E030 LDI R19,0
269 E001 LDI R16,1
26A E010 LDI R17,0
26B DF1A RCALL _WriteNum
(0063)
(0064) //显示ADC1
(0065) ten_3=(adc_data1)/100;
26C E624 LDI R18,0x64
26D E030 LDI R19,0
26E 018A MOVW R16,R20
26F 940E 02AD CALL div16u
271 2EE0 MOV R14,R16
(0066) ten_2=(adc_data1-(ten_3*100))/10;
272 E684 LDI R24,0x64
273 9D8E MUL R24,R14
274 018A MOVW R16,R20
275 1900 SUB R16,R0
276 0911 SBC R17,R1
277 E02A LDI R18,0xA
278 E030 LDI R19,0
279 940E 02AD CALL div16u
27B 2EC0 MOV R12,R16
(0067) ten_1=adc_data1-(ten_3*100)-ten_2*10;
27C E684 LDI R24,0x64
27D 9D8E MUL R24,R14
27E 2EA4 MOV R10,R20
27F 18A0 SUB R10,R0
280 08B1 SBC R11,R1
281 E08A LDI R24,0xA
282 9D8C MUL R24,R12
283 18A0 SUB R10,R0
284 08B1 SBC R11,R1
(0068) WriteNum(2,8,(ten_3));
285 2C2E MOV R2,R14
286 2433 CLR R3
287 8239 STD Y+1,R3
288 8228 STD Y+0,R2
289 E028 LDI R18,0x8
28A E030 LDI R19,0
28B E002 LDI R16,2
28C E010 LDI R17,0
28D DEF8 RCALL _WriteNum
(0069) WriteNum(2,10,(ten_2));
28E 2C2C MOV R2,R12
28F 2433 CLR R3
290 8239 STD Y+1,R3
291 8228 STD Y+0,R2
292 E02A LDI R18,0xA
293 E030 LDI R19,0
294 E002 LDI R16,2
295 E010 LDI R17,0
296 DEEF RCALL _WriteNum
(0070) WriteNum(2,11,(ten_1));
297 2C2A MOV R2,R10
298 2433 CLR R3
299 8239 STD Y+1,R3
29A 8228 STD Y+0,R2
29B E02B LDI R18,0xB
29C E030 LDI R19,0
29D E002 LDI R16,2
29E E010 LDI R17,0
29F DEE6 RCALL _WriteNum
(0071)
(0072) for(i=0;i<18;i++)
2A0 2744 CLR R20
2A1 C004 RJMP 0x02A6
(0073) {
(0074) s_ms(60000);
FILE: <library>
2A2 E600 LDI R16,0x60
2A3 EE1A LDI R17,0xEA
2A4 DDD0 RCALL _s_ms
2A5 9543 INC R20
2A6 3142 CPI R20,0x12
2A7 F3D0 BCS 0x02A2
2A8 CF77 RJMP 0x0220
2A9 9624 ADIW R28,4
2AA 9508 RET
mod16u:
2AB 9468 BSET 6
2AC C001 RJMP xdiv16u
div16u:
2AD 94E8 BCLR 6
xdiv16u:
2AE 92EA ST R14,-Y
2AF 92FA ST R15,-Y
2B0 938A ST R24,-Y
2B1 24EE CLR R14
2B2 24FF CLR R15
2B3 E180 LDI R24,0x10
2B4 0F00 LSL R16
2B5 1F11 ROL R17
2B6 1CEE ROL R14
2B7 1CFF ROL R15
2B8 16E2 CP R14,R18
2B9 06F3 CPC R15,R19
2BA F018 BCS 0x02BE
2BB 1AE2 SUB R14,R18
2BC 0AF3 SBC R15,R19
2BD 9503 INC R16
2BE 958A DEC R24
2BF F7A1 BNE 0x02B4
2C0 F416 BRTC 0x02C3
2C1 2D0E MOV R16,R14
2C2 2D1F MOV R17,R15
2C3 9189 LD R24,Y+
2C4 90F9 LD R15,Y+
2C5 90E9 LD R14,Y+
2C6 9508 RET
push_xgsetF00C:
2C7 937A ST R23,-Y
2C8 936A ST R22,-Y
2C9 935A ST R21,-Y
2CA 934A ST R20,-Y
2CB 92BA ST R11,-Y
2CC 92AA ST R10,-Y
2CD 9508 RET
pop_xgsetF00C:
2CE 90A9 LD R10,Y+
2CF 90B9 LD R11,Y+
2D0 9149 LD R20,Y+
2D1 9159 LD R21,Y+
2D2 9169 LD R22,Y+
2D3 9179 LD R23,Y+
2D4 9508 RET
push_xgsetF03C:
2D5 937A ST R23,-Y
2D6 936A ST R22,-Y
2D7 935A ST R21,-Y
2D8 934A ST R20,-Y
2D9 92DA ST R13,-Y
2DA 92CA ST R12,-Y
2DB 92BA ST R11,-Y
2DC 92AA ST R10,-Y
2DD 9508 RET
pop_xgsetF03C:
2DE 90A9 LD R10,Y+
2DF 90B9 LD R11,Y+
2E0 90C9 LD R12,Y+
2E1 90D9 LD R13,Y+
2E2 9149 LD R20,Y+
2E3 9159 LD R21,Y+
2E4 9169 LD R22,Y+
2E5 9179 LD R23,Y+
2E6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -