?? 1.lst
字號:
(0068) TCNT1L = 0x2F; //重裝值低位
2A6 E28F LDI R24,0x2F
2A7 BD8C OUT 0x2C,R24
(0069)
(0070) TCCR1A = 0x00;
2A8 BC2F OUT 0x2F,R2
(0071) TCCR1B = 0x05;//啟動定時器
2A9 E085 LDI R24,5
2AA BD8E OUT 0x2E,R24
2AB 9508 RET
_timer1_ovf_isr:
2AC 920A ST R0,-Y
2AD 921A ST R1,-Y
2AE 922A ST R2,-Y
2AF 923A ST R3,-Y
2B0 924A ST R4,-Y
2B1 925A ST R5,-Y
2B2 926A ST R6,-Y
2B3 927A ST R7,-Y
2B4 928A ST R8,-Y
2B5 929A ST R9,-Y
2B6 930A ST R16,-Y
2B7 931A ST R17,-Y
2B8 932A ST R18,-Y
2B9 933A ST R19,-Y
2BA 938A ST R24,-Y
2BB 939A ST R25,-Y
2BC 93AA ST R26,-Y
2BD 93BA ST R27,-Y
2BE 93EA ST R30,-Y
2BF 93FA ST R31,-Y
2C0 B60F IN R0,0x3F
2C1 920A ST R0,-Y
(0072) }
(0073)
(0074)
(0075) //定時器T1溢出中斷服務程序
(0076) #pragma interrupt_handler timer1_ovf_isr:9
(0077) void timer1_ovf_isr(void)
(0078) {
(0079) TCNT1H = 0xFC; //重裝值高位
2C2 EF8C LDI R24,0xFC
2C3 BD8D OUT 0x2D,R24
(0080) TCNT1L = 0x2F; //重裝值低位
2C4 E28F LDI R24,0x2F
2C5 BD8C OUT 0x2C,R24
(0081) CLI();
2C6 94F8 BCLR 7
(0082) adc_rel=0;
2C7 2422 CLR R2
2C8 2433 CLR R3
2C9 9230 00B6 STS adc_rel+1,R3
2CB 9220 00B5 STS adc_rel,R2
(0083) adc_old=0;
2CD 9230 00B1 STS adc_old+1,R3
2CF 9220 00B0 STS adc_old,R2
(0084) if(adc_mux<3)
2D1 9180 00B4 LDS R24,adc_mux
2D3 3083 CPI R24,3
2D4 F420 BCC 0x02D9
(0085) adc_mux++;//遞增
2D5 5F8F SUBI R24,0xFF
2D6 9380 00B4 STS adc_mux,R24
2D8 C003 RJMP 0x02DC
(0086) else
(0087) adc_mux=0;
2D9 2422 CLR R2
2DA 9220 00B4 STS adc_mux,R2
(0088) SEI();
2DC 9478 BSET 7
(0089) miao++;
2DD 9180 006A LDS R24,miao
2DF 5F8F SUBI R24,0xFF
2E0 9380 006A STS miao,R24
(0090) if(miao==350)
2E2 358E CPI R24,0x5E
2E3 F419 BNE 0x02E7
(0091)
(0092) //LCD_write_string(9,1,Format(miao,"00"));
(0093) {stop();
2E4 D0D0 RCALL _stop
(0094) TCCR1B = 0x00;//停止定時器
2E5 2422 CLR R2
2E6 BC2E OUT 0x2E,R2
(0095) }
2E7 9009 LD R0,Y+
2E8 BE0F OUT 0x3F,R0
2E9 91F9 LD R31,Y+
2EA 91E9 LD R30,Y+
2EB 91B9 LD R27,Y+
2EC 91A9 LD R26,Y+
2ED 9199 LD R25,Y+
2EE 9189 LD R24,Y+
2EF 9139 LD R19,Y+
2F0 9129 LD R18,Y+
2F1 9119 LD R17,Y+
2F2 9109 LD R16,Y+
2F3 9099 LD R9,Y+
2F4 9089 LD R8,Y+
2F5 9079 LD R7,Y+
2F6 9069 LD R6,Y+
2F7 9059 LD R5,Y+
2F8 9049 LD R4,Y+
2F9 9039 LD R3,Y+
2FA 9029 LD R2,Y+
2FB 9019 LD R1,Y+
2FC 9009 LD R0,Y+
2FD 9518 RETI
(0096) }
(0097)
(0098)
(0099)
(0100) void adc_init(void)
(0101) {
(0102) //adc轉換初始化
(0103) ADCSRA = 0x00; //禁止AD轉換
_adc_init:
2FE 2422 CLR R2
2FF B826 OUT 0x06,R2
(0104) //ADMUX = 0xC1; //通道1 1100 0001
(0105) ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);//選擇內部AVCC為基準
300 9180 00B4 LDS R24,adc_mux
302 718F ANDI R24,0x1F
303 6C80 ORI R24,0xC0
304 B987 OUT 0x07,R24
(0106) SFIOR |= 0x00;
305 B620 IN R2,0x30
306 BE20 OUT 0x30,R2
(0107) ACSR = 0x80; //禁止模擬比較器
307 E880 LDI R24,0x80
308 B988 OUT 0x08,R24
(0108) ADCSRA |= 0xEE; //1110 1110
309 B186 IN R24,0x06
30A 6E8E ORI R24,0xEE
30B B986 OUT 0x06,R24
(0109) ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分頻
30C B186 IN R24,0x06
30D 6E8E ORI R24,0xEE
30E B986 OUT 0x06,R24
30F 9508 RET
_ADCtoBCD:
i --> Y,+3
temp --> R10
310 940E 066A CALL push_xgsetF03C
312 0158 MOVW R10,R16
313 9722 SBIW R28,2
(0110) }
(0111)
(0112)
(0113) //ADC結果轉換成電壓值
(0114) void ADCtoBCD(unsigned int temp)
(0115) {
(0116) unsigned char i;
(0117)
(0118) temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
314 0115 MOVW R2,R10
315 2444 CLR R4
316 2455 CLR R5
317 E040 LDI R20,0
318 E05A LDI R21,0xA
319 E060 LDI R22,0
31A E070 LDI R23,0
31B 925A ST R5,-Y
31C 924A ST R4,-Y
31D 923A ST R3,-Y
31E 922A ST R2,-Y
31F 018A MOVW R16,R20
320 019B MOVW R18,R22
321 940E 05FA CALL empy32u
323 EF4F LDI R20,0xFF
324 E053 LDI R21,3
325 E060 LDI R22,0
326 E070 LDI R23,0
327 937A ST R23,-Y
328 936A ST R22,-Y
329 935A ST R21,-Y
32A 934A ST R20,-Y
32B 940E 0580 CALL div32u
32D 0158 MOVW R10,R16
(0119) voltage=temp;
32E 92B0 00B3 STS voltage+1,R11
330 92A0 00B2 STS voltage,R10
(0120) switch(adc_mux)
332 90C0 00B4 LDS R12,adc_mux
334 24DD CLR R13
335 20CC TST R12
336 F411 BNE 0x0339
337 20DD TST R13
338 F071 BEQ 0x0347
339 01C6 MOVW R24,R12
33A 3081 CPI R24,1
33B E0E0 LDI R30,0
33C 079E CPC R25,R30
33D F071 BEQ 0x034C
33E 3082 CPI R24,2
33F E0E0 LDI R30,0
340 079E CPC R25,R30
341 F079 BEQ 0x0351
342 3083 CPI R24,3
343 E0E0 LDI R30,0
344 079E CPC R25,R30
345 F081 BEQ 0x0356
346 C013 RJMP 0x035A
(0121) {
(0122) case 0:V0=temp;break;
347 92B0 00AF STS V0+1,R11
349 92A0 00AE STS V0,R10
34B C00E RJMP 0x035A
(0123) case 1:V1=temp;break;
34C 92B0 00AD STS V1+1,R11
34E 92A0 00AC STS V1,R10
350 C009 RJMP 0x035A
(0124) case 2:V2=temp;break;
351 92B0 00AB STS V2+1,R11
353 92A0 00AA STS V2,R10
355 C004 RJMP 0x035A
(0125) case 3:V3=temp;break;
356 92B0 00A9 STS V3+1,R11
358 92A0 00A8 STS V3,R10
(0126) }
(0127) LCD_write_shu(0,0,temp);
35A 82B9 STD Y+1,R11
35B 82A8 STD Y+0,R10
35C 2722 CLR R18
35D 2733 CLR R19
35E 2700 CLR R16
35F 2711 CLR R17
360 DE5E RCALL _LCD_write_shu
361 9622 ADIW R28,2
362 940C 0673 JMP pop_xgsetF03C
_adc_isr:
364 938A ST R24,-Y
365 939A ST R25,-Y
366 B78F IN R24,0x3F
367 938A ST R24,-Y
(0128)
(0129) }
(0130)
(0131)
(0132) #pragma interrupt_handler adc_isr:15
(0133) void adc_isr(void)
(0134) {
(0135) //轉換完成后中斷處理
(0136) adc_rel=ADC&0x3ff; //
368 B184 IN R24,0x04
369 B195 IN R25,0x05
36A 7093 ANDI R25,3
36B 9390 00B6 STS adc_rel+1,R25
36D 9380 00B5 STS adc_rel,R24
(0137) ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);
36F 9180 00B4 LDS R24,adc_mux
371 718F ANDI R24,0x1F
372 6C80 ORI R24,0xC0
373 B987 OUT 0x07,R24
(0138) ADCSRA|=(1<<ADSC);//啟動AD轉換//啟動AD轉換
374 9A36 SBI 0x06,6
375 9189 LD R24,Y+
376 BF8F OUT 0x3F,R24
377 9199 LD R25,Y+
378 9189 LD R24,Y+
379 9518 RETI
(0139)
(0140) }
(0141)
(0142)
(0143)
(0144) void init_devices(void)
(0145) {
(0146) CLI(); //禁止所有中斷
_init_devices:
37A 94F8 BCLR 7
(0147) MCUCR = 0x00;
37B 2422 CLR R2
37C BE25 OUT 0x35,R2
(0148) MCUCSR = 0x80;//禁止JTAG
37D E880 LDI R24,0x80
37E BF84 OUT 0x34,R24
(0149) GICR = 0x00;
37F BE2B OUT 0x3B,R2
(0150) port_init();
380 DF12 RCALL _port_init
(0151) timer1_init();
381 DF1D RCALL _timer1_init
(0152) adc_init();
382 DF7B RCALL _adc_init
(0153) SEI();//開全局中斷
383 9478 BSET 7
384 9508 RET
_qianjin:
385 9722 SBIW R28,2
(0154) }
(0155)
(0156) void qianjin()
(0157) {
(0158) //PORTC|=0x80;
(0159) PORTC=0x8A; //1010前進
386 E88A LDI R24,0x8A
387 BB85 OUT 0x15,R24
(0160) LCD_write_string(0,1,"qianjin ");
388 E98A LDI R24,0x9A
389 E090 LDI R25,0
38A 8399 STD Y+1,R25
38B 8388 STD Y+0,R24
38C E021 LDI R18,1
38D 2700 CLR R16
38E DDC0 RCALL _LCD_write_string
38F 9622 ADIW R28,2
390 9508 RET
_houtui:
391 9722 SBIW R28,2
(0161) }
(0162) void houtui()
(0163) {
(0164) PORTC=0x85; //0101后退
392 E885 LDI R24,0x85
393 BB85 OUT 0x15,R24
(0165) LCD_write_string(0,1,"houtui ");
394 E980 LDI R24,0x90
395 E090 LDI R25,0
396 8399 STD Y+1,R25
397 8388 STD Y+0,R24
398 E021 LDI R18,1
399 2700 CLR R16
39A DDB4 RCALL _LCD_write_string
39B 9622 ADIW R28,2
39C 9508 RET
_zuozhuan:
39D 9722 SBIW R28,2
(0166) }
(0167)
(0168) void zuozhuan()
(0169) {
(0170) PORTC=0x82; //0010 左傳
39E E882 LDI R24,0x82
39F BB85 OUT 0x15,R24
(0171) LCD_write_string(0,1,"zuozhuan");
3A0 E887 LDI R24,0x87
3A1 E090 LDI R25,0
3A2 8399 STD Y+1,R25
3A3 8388 STD Y+0,R24
3A4 E021 LDI R18,1
3A5 2700 CLR R16
3A6 DDA8 RCALL _LCD_write_string
3A7 9622 ADIW R28,2
3A8 9508 RET
_youzhuan:
3A9 9722 SBIW R28,2
(0172) }
(0173) void youzhuan()
(0174) {
(0175) PORTC=0x88; //1000右轉
3AA E888 LDI R24,0x88
3AB BB85 OUT 0x15,R24
(0176) LCD_write_string(0,1,"youzhuan");
3AC E78E LDI R24,0x7E
3AD E090 LDI R25,0
3AE 8399 STD Y+1,R25
3AF 8388 STD Y+0,R24
3B0 E021 LDI R18,1
3B1 2700 CLR R16
3B2 DD9C RCALL _LCD_write_string
3B3 9622 ADIW R28,2
3B4 9508 RET
_stop:
3B5 9722 SBIW R28,2
(0177) }
(0178) void stop()
(0179) {
(0180) PORTC=0x80;
3B6 E880 LDI R24,0x80
3B7 BB85 OUT 0x15,R24
(0181) LCD_write_string(0,1,"stop ");
3B8 E786 LDI R24,0x76
3B9 E090 LDI R25,0
3BA 8399 STD Y+1,R25
3BB 8388 STD Y+0,R24
3BC E021 LDI R18,1
3BD 2700 CLR R16
3BE DD90 RCALL _LCD_write_string
3BF 9622 ADIW R28,2
3C0 9508 RET
_get_adc:
3C1 9722 SBIW R28,2
(0182) }
(0183)
(0184) void get_adc()
(0185) {
(0186) if(adc_old!=adc_rel)
3C2 9020 00B5 LDS R2,adc_rel
3C4 9030 00B6 LDS R3,adc_rel+1
3C6 9040 00B0 LDS R4,adc_old
3C8 9050 00B1 LDS R5,adc_old+1
3CA 1442 CP R4,R2
3CB 0453 CPC R5,R3
3CC F049 BEQ 0x03D6
(0187) {
(0188) adc_old=adc_rel;
3CD 9230 00B1 STS adc_old+1,R3
3CF 9220 00B0 STS adc_old,R2
(0189) ADCtoBCD(adc_old);
3D1 9100 00B0 LDS R16,adc_old
3D3 9110 00B1 LDS R17,adc_old+1
3D5 DF3A RCALL _ADCtoBCD
(0190) }
(0191) LCD_write_shu(0,1,voltage);
3D6 9020 00B2 LDS R2,voltage
3D8 9030 00B3 LDS R3,voltage+1
3DA 8239 STD Y+1,R3
3DB 8228 STD Y+0,R2
3DC E021 LDI R18,1
3DD E030 LDI R19,0
3DE 2700 CLR R16
3DF 2711 CLR R17
3E0 DDDE RCALL _LCD_write_shu
3E1 9622 ADIW R28,2
3E2 9508 RET
_shaomiao:
i --> R20
3E3 934A ST R20,-Y
3E4 935A ST R21,-Y
3E5 9722 SBIW R28,2
(0192) }
(0193) void shaomiao()
(0194) {unsigned int i;
(0195) PORTC=0x89;
3E6 E889 LDI R24,0x89
3E7 BB85 OUT 0x15,R24
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -