📄 mega16.lst
字号:
0109 0913 SBC R17,R3
010A DFE1 RCALL _uart0_tx
(0143) }
(0144) uart0_tx(M8Mode);
010B 91000063 LDS R16,M8Mode
010D DFDE RCALL _uart0_tx
(0145) uart0_tx(0xff-M8Mode);
010E 90200063 LDS R2,M8Mode
0110 2433 CLR R3
0111 EF0F LDI R16,0xFF
0112 1902 SUB R16,R2
0113 0913 SBC R17,R3
0114 DFD7 RCALL _uart0_tx
0115 9508 RET
_int0_isr:
0116 922A ST R2,-Y
0117 938A ST R24,-Y
0118 B62F IN R2,0x3F
0119 922A ST R2,-Y
(0146) }
(0147) /***************************************************************************
(0148) 用于手动模式和巡航模式的选择
(0149) ****************************************************************************/
(0150) #pragma interrupt_handler int0_isr:2
(0151) void int0_isr(void)
(0152) {
(0153) //external interupt on INT0
(0154) if(SpeedMode)
011A 90200061 LDS R2,SpeedMode
011C 2022 TST R2
011D F031 BEQ 0x0124
(0155) {
(0156) SpeedMode=0;//手动模式
011E 2422 CLR R2
011F 92200061 STS SpeedMode,R2
(0157) LedDp=0;
0121 92200076 STS LedDp,R2
(0158) }
0123 C00A RJMP 0x012E
(0159) else
(0160) {
(0161) SpeedMode=0x55;//巡航模式
0124 E585 LDI R24,0x55
0125 93800061 STS SpeedMode,R24
(0162) LedDp=0x01;
0127 E081 LDI R24,1
0128 93800076 STS LedDp,R24
(0163) SpeedVal=AdResult;
012A 90200060 LDS R2,AdResult
012C 92200062 STS SpeedVal,R2
(0164) }
012E 9029 LD R2,Y+
012F BE2F OUT 0x3F,R2
0130 9189 LD R24,Y+
0131 9029 LD R2,Y+
0132 9518 RETI
(0165) }
(0166) /***************************************************************************
(0167) A/D初始化
(0168) ****************************************************************************/
(0169) void adc_init(void)
(0170) {
(0171) ADCSRA =0x0; //关闭AD
_adc_init:
0133 2422 CLR R2
0134 B826 OUT 0x06,R2
(0172) ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1); //选择外部参考电源 ADC2 左对齐
0135 E682 LDI R24,0x62
0136 B987 OUT 0x07,R24
(0173) ACSR = (1<<ACD); //关闭模拟比较器
0137 E880 LDI R24,0x80
0138 B988 OUT 0x08,R24
(0174) ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频
0139 E98D LDI R24,0x9D
013A B986 OUT 0x06,R24
013B 9508 RET
_Adc_isr:
ad_tmp --> R20
013C 930A ST R16,-Y
013D 931A ST R17,-Y
013E 932A ST R18,-Y
013F 933A ST R19,-Y
0140 938A ST R24,-Y
0141 939A ST R25,-Y
0142 93EA ST R30,-Y
0143 B70F IN R16,0x3F
0144 930A ST R16,-Y
0145 940E02FA CALL push_gset1
(0175) }
(0176) /***************************************************************************
(0177) A/D中断处理
(0178) ****************************************************************************/
(0179) #pragma interrupt_handler Adc_isr:15
(0180) void Adc_isr(void)
(0181) {
(0182) uint ad_tmp;
(0183) ad_tmp=ADCH; //读取高位数据(左对齐)
0147 B145 IN R20,0x05
0148 2755 CLR R21
(0184) if(ad_tmp>0xd0)ad_tmp=0xd0;
0149 ED80 LDI R24,0xD0
014A E090 LDI R25,0
014B 1784 CP R24,R20
014C 0795 CPC R25,R21
014D F408 BCC 0x014F
014E ED40 LDI R20,0xD0
(0185) if(ad_tmp<0x30)ad_tmp=0x30;
014F 3340 CPI R20,0x30
0150 E0E0 LDI R30,0
0151 075E CPC R21,R30
0152 F410 BCC 0x0155
0153 E340 LDI R20,0x30
0154 E050 LDI R21,0
(0186) ad_tmp-=0x30;
0155 5340 SUBI R20,0x30
0156 4050 SBCI R21,0
(0187) AdResult=(ad_tmp*0xff/0xa0)&0x00ff-1;
0157 EF0F LDI R16,0xFF
0158 E010 LDI R17,0
0159 019A MOVW R18,R20
015A 940E02DC CALL empy16s
015C EA20 LDI R18,0xA0
015D E030 LDI R19,0
015E 940E02C2 CALL div16u
0160 01C8 MOVW R24,R16
0161 7F8E ANDI R24,0xFE
0162 7090 ANDI R25,0
0163 93800060 STS AdResult,R24
0165 940E02FD CALL pop_gset1
0167 9109 LD R16,Y+
0168 BF0F OUT 0x3F,R16
0169 91E9 LD R30,Y+
016A 9199 LD R25,Y+
016B 9189 LD R24,Y+
016C 9139 LD R19,Y+
016D 9129 LD R18,Y+
016E 9119 LD R17,Y+
016F 9109 LD R16,Y+
0170 9518 RETI
_timer1_comp_isr:
tt --> Y+1
0171 922A ST R2,-Y
0172 938A ST R24,-Y
0173 939A ST R25,-Y
0174 B62F IN R2,0x3F
0175 922A ST R2,-Y
(0188) //LedBuf[0]=AdResult;
(0189) }
(0190) #pragma interrupt_handler timer1_comp_isr:9
(0191) void timer1_comp_isr(void)
(0192) {
(0193) //compare occured TCNT1=OCR1
(0194) uchar tt;
(0195) TCNT1 = 0xC2F7; //setup
0176 EF87 LDI R24,0xF7
0177 EC92 LDI R25,0xC2
0178 BD9D OUT 0x2D,R25
0179 BD8C OUT 0x2C,R24
(0196) //PORTD ^=0x60;
(0197) //LedDp[second_data%4]=1;
(0198) //LedBuf[0]=second_data;
(0199) if(++second_data>=60)
017A 91800084 LDS R24,second_data
017C 5F8F SUBI R24,0xFF
017D 2E28 MOV R2,R24
017E 92200084 STS second_data,R2
0180 338C CPI R24,0x3C
0181 F0C8 BCS 0x019B
(0200) {
(0201) second_data=0;
0182 2422 CLR R2
0183 92200084 STS second_data,R2
(0202) if(++minut_data>=60)
0185 91800085 LDS R24,minut_data
0187 5F8F SUBI R24,0xFF
0188 2E28 MOV R2,R24
0189 92200085 STS minut_data,R2
018B 338C CPI R24,0x3C
018C F070 BCS 0x019B
(0203) {
(0204) minut_data=0;
018D 2422 CLR R2
018E 92200085 STS minut_data,R2
(0205) if(++hour_data>=24)
0190 91800086 LDS R24,hour_data
0192 5F8F SUBI R24,0xFF
0193 2E28 MOV R2,R24
0194 92200086 STS hour_data,R2
0196 3188 CPI R24,0x18
0197 F018 BCS 0x019B
(0206) {
(0207) hour_data=0;
0198 2422 CLR R2
0199 92200086 STS hour_data,R2
(0208) }
(0209) }
(0210) }
019B 9029 LD R2,Y+
019C BE2F OUT 0x3F,R2
019D 9199 LD R25,Y+
019E 9189 LD R24,Y+
019F 9029 LD R2,Y+
01A0 9518 RETI
_led_display:
tmp1 --> R22
tmp0 --> R10
delay --> R20
01A1 940E02F6 CALL push_gset3
01A3 2F40 MOV R20,R16
(0211)
(0212) }
(0213)
(0214) //led display
(0215) void led_display(uchar delay)
(0216) {
(0217) uchar tmp0,tmp1;
(0218) tmp0=LedBuf[0];
01A4 90A00074 LDS R10,LedBuf
(0219) tmp1=LedBuf[1];
01A6 91600075 LDS R22,LedBuf+1
(0220) if(tmp0>99)tmp0=99;
01A8 E683 LDI R24,0x63
01A9 158A CP R24,R10
01AA F408 BCC 0x01AC
01AB 2EA8 MOV R10,R24
(0221) if(tmp1>99)tmp1=99;
01AC E683 LDI R24,0x63
01AD 1786 CP R24,R22
01AE F408 BCC 0x01B0
01AF E663 LDI R22,0x63
(0222) PORTB = ~0x08;
01B0 EF87 LDI R24,0xF7
01B1 BB88 OUT 0x18,R24
(0223) PORTA = LedTab[(tmp0%10)];
01B2 E02A LDI R18,0xA
01B3 E030 LDI R19,0
01B4 2D0A MOV R16,R10
01B5 2711 CLR R17
01B6 940E02A2 CALL mod16s
01B8 01F8 MOVW R30,R16
01B9 E684 LDI R24,0x64
01BA E090 LDI R25,0
01BB 0FE8 ADD R30,R24
01BC 1FF9 ADC R31,R25
01BD 8020 LDD R2,Z+0
01BE BA2B OUT 0x1B,R2
(0224) if(LedDp&0x01)PORTB|=0x10;
01BF 90200076 LDS R2,LedDp
01C1 FE20 SBRS R2,0
01C2 C002 RJMP 0x01C5
01C3 9AC4 SBI 0x18,4
01C4 C003 RJMP 0x01C8
(0225) else PORTB&=0xEF;
01C5 B388 IN R24,0x18
01C6 7E8F ANDI R24,0xEF
01C7 BB88 OUT 0x18,R24
(0226) ms_delay(delay);
01C8 2F04 MOV R16,R20
01C9 2711 CLR R17
01CA D058 RCALL _ms_delay
(0227)
(0228) PORTB = ~0x04;
01CB EF8B LDI R24,0xFB
01CC BB88 OUT 0x18,R24
(0229) PORTA = LedTab[((tmp0/10)&0x0f)];
01CD E02A LDI R18,0xA
01CE E030 LDI R19,0
01CF 2D0A MOV R16,R10
01D0 2711 CLR R17
01D1 940E02A6 CALL div16s
01D3 01F8 MOVW R30,R16
01D4 70EF ANDI R30,0xF
01D5 70F0 ANDI R31,0
01D6 E684 LDI R24,0x64
01D7 E090 LDI R25,0
01D8 0FE8 ADD R30,R24
01D9 1FF9 ADC R31,R25
01DA 8020 LDD R2,Z+0
01DB BA2B OUT 0x1B,R2
(0230) if(LedDp&0x02)PORTB|=0x10;
01DC 90200076 LDS R2,LedDp
01DE FE21 SBRS R2,1
01DF C002 RJMP 0x01E2
01E0 9AC4 SBI 0x18,4
01E1 C003 RJMP 0x01E5
(0231) else PORTB&=0xEF;
01E2 B388 IN R24,0x18
01E3 7E8F ANDI R24,0xEF
01E4 BB88 OUT 0x18,R24
(0232) ms_delay(delay);
01E5 2F04 MOV R16,R20
01E6 2711 CLR R17
01E7 D03B RCALL _ms_delay
(0233)
(0234) PORTB = ~0x02;
01E8 EF8D LDI R24,0xFD
01E9 BB88 OUT 0x18,R24
(0235) PORTA = LedTab[(tmp1%10)];
01EA E02A LDI R18,0xA
01EB E030 LDI R19,0
01EC 2F06 MOV R16,R22
01ED 2711 CLR R17
01EE 940E02A2 CALL mod16s
01F0 01F8 MOVW R30,R16
01F1 E684 LDI R24,0x64
01F2 E090 LDI R25,0
01F3 0FE8 ADD R30,R24
01F4 1FF9 ADC R31,R25
01F5 8020 LDD R2,Z+0
01F6 BA2B OUT 0x1B,R2
(0236) if(LedDp&0x04)PORTB|=0x10;
01F7 90200076 LDS R2,LedDp
01F9 FE22 SBRS R2,2
01FA C002 RJMP 0x01FD
01FB 9AC4 SBI 0x18,4
01FC C003 RJMP 0x0200
(0237) else PORTB&=0xEF;
01FD B388 IN R24,0x18
01FE 7E8F ANDI R24,0xEF
01FF BB88 OUT 0x18,R24
(0238) ms_delay(delay);
0200 2F04 MOV R16,R20
0201 2711 CLR R17
0202 D020 RCALL _ms_delay
(0239)
(0240) PORTB = ~0x01;
0203 EF8E LDI R24,0xFE
0204 BB88 OUT 0x18,R24
(0241) PORTA = LedTab[((tmp1/10)&0x0f)];
0205 E02A LDI R18,0xA
0206 E030 LDI R19,0
0207 2F06 MOV R16,R22
0208 2711 CLR R17
0209 940E02A6 CALL div16s
020B 01F8 MOVW R30,R16
020C 70EF ANDI R30,0xF
020D 70F0 ANDI R31,0
020E E684 LDI R24,0x64
020F E090 LDI R25,0
0210 0FE8 ADD R30,R24
0211 1FF9 ADC R31,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -