📄 m8demo.lst
字号:
(0156) TWCR= 0x00; //enable twi
_twi_Disable:
01CE 2422 CLR R2
01CF BE26 OUT 0x36,R2
01D0 9508 RET
(0157) }
(0158)
(0159)
(0160) //ADC initialisation
(0161) // Conversion time: 208uS
(0162) void adc_init(void)
(0163) {
(0164) ADCSR = 0x00; //disable adc
_adc_init:
01D1 2422 CLR R2
01D2 B826 OUT 0x06,R2
(0165) ADMUX = 0x00; //select adc input 0
01D3 B827 OUT 0x07,R2
(0166) ACSR = 0x00;
01D4 B828 OUT 0x08,R2
(0167) ADCSR = 0xc8;
01D5 EC88 LDI R24,0xC8
01D6 B986 OUT 0x06,R24
01D7 9508 RET
(0168) }
(0169) void adc_Enable(void)
(0170) {
(0171) DDRC&=0xFE;
_adc_Enable:
01D8 B384 IN R24,0x14
01D9 7F8E ANDI R24,0xFE
01DA BB84 OUT 0x14,R24
(0172) PORTC&=0xFE;
01DB B385 IN R24,0x15
01DC 7F8E ANDI R24,0xFE
01DD BB85 OUT 0x15,R24
(0173) ADCSR = 0xC8;
01DE EC88 LDI R24,0xC8
01DF B986 OUT 0x06,R24
01E0 9508 RET
(0174) }
(0175) void adc_Disable(void)
(0176) {//DDRC|=0x01;
(0177) //PORTC|=0x01;
(0178) ADCSR = 0x00;
_adc_Disable:
01E1 2422 CLR R2
01E2 B826 OUT 0x06,R2
01E3 9508 RET
_adc_isr:
01E4 922A ST R2,-Y
01E5 923A ST R3,-Y
01E6 924A ST R4,-Y
01E7 925A ST R5,-Y
01E8 938A ST R24,-Y
01E9 B62F IN R2,0x3F
01EA 922A ST R2,-Y
(0179) }
(0180) #pragma interrupt_handler adc_isr:15
(0181) void adc_isr(void)
(0182) {
(0183) //conversion complete, read value (int) using...
(0184) adc_value=ADCL; //Read 8 low bits first (important)
01EB B024 IN R2,0x04
01EC 2433 CLR R3
01ED 92300063 STS adc_value+1,R3
01EF 92200062 STS adc_value,R2
(0185) adc_value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
01F1 B025 IN R2,0x05
01F2 2433 CLR R3
01F3 2C32 MOV R3,R2
01F4 2422 CLR R2
01F5 90400062 LDS R4,adc_value
01F7 90500063 LDS R5,adc_value+1
01F9 2842 OR R4,R2
01FA 2853 OR R5,R3
01FB 92500063 STS adc_value+1,R5
01FD 92400062 STS adc_value,R4
(0186) ADCSR = 0x00;
01FF 2422 CLR R2
0200 B826 OUT 0x06,R2
(0187) ADCSR = 0xC8;
0201 EC88 LDI R24,0xC8
0202 B986 OUT 0x06,R24
0203 9029 LD R2,Y+
0204 BE2F OUT 0x3F,R2
0205 9189 LD R24,Y+
0206 9059 LD R5,Y+
0207 9049 LD R4,Y+
0208 9039 LD R3,Y+
0209 9029 LD R2,Y+
020A 9518 RETI
_ReadADC:
i --> R20
channel --> R16
020B D8BF RCALL push_gset1
(0188)
(0189) }
(0190)
(0191) int ReadADC( unsigned char channel)
(0192) {
(0193) int i;
(0194)
(0195) ADMUX = channel; // Select channel
020C B907 OUT 0x07,R16
(0196)
(0197) ADCSR |= 0x40; // Start conversion
020D 9A36 SBI 0x06,6
(0198)
(0199) while (!(ADCSR & 0x10)); // Check if converstion is ready
020E 9B34 SBIS 0x06,4
020F CFFE RJMP 0x020E
(0200)
(0201) ADCSR |= 0x10; // Clear Conversion ready flag by setting the bit
0210 9A34 SBI 0x06,4
(0202)
(0203) i = ADCL; // Read 8 low bits first (important)
0211 B144 IN R20,0x04
0212 2755 CLR R21
(0204) i += (int)ADCH << 8; // Read 2 high bits and multiply with 256
0213 B025 IN R2,0x05
0214 2433 CLR R3
0215 2C32 MOV R3,R2
0216 2422 CLR R2
0217 0D42 ADD R20,R2
0218 1D53 ADC R21,R3
(0205)
(0206) return i;
0219 018A MOVW R16,R20
021A D8B3 RCALL pop_gset1
021B 9508 RET
(0207) }
(0208)
(0209) //call this routine to initialise all peripherals
(0210) void init_devices(void)
(0211) {
(0212) //stop errant interrupts until set up
(0213) CLI(); //disable all interrupts
_init_devices:
021C 94F8 BCLR 7
(0214) port_init();
021D DEE4 RCALL _port_init
(0215) timer0_init();
021E DEEF RCALL _timer0_init
(0216) timer1_init();
021F DF60 RCALL _timer1_init
(0217) // spi_init();
(0218) // twi_init();
(0219) uart0_init();
0220 D7C3 RCALL _uart0_init
(0220) // adc_init();
(0221)
(0222) MCUCR = 0x00;
0221 2422 CLR R2
0222 BE25 OUT 0x35,R2
(0223) GICR = 0x00;
0223 BE2B OUT 0x3B,R2
(0224) TIMSK = 0x05; //timer interrupt sources
0224 E085 LDI R24,5
0225 BF89 OUT 0x39,R24
(0225) SEI(); //re-enable interrupts
0226 9478 BSET 7
0227 9508 RET
_DisplayHexData:
temptimer4 --> R12
temptimer3 --> R10
temptimer2 --> R22
temptimer1 --> R20
timerL --> R22
timerH --> R12
0228 D89C RCALL push_gset4
0229 2F62 MOV R22,R18
022A 2EC0 MOV R12,R16
022B 9723 SBIW R28,3
(0226) //all peripherals are now initialised
(0227) }
(0228)
(0229)
(0230) void DisplayHexData(unsigned char timerH,unsigned char timerL)
(0231)
(0232) {
(0233) unsigned char temptimer1,temptimer2,temptimer3,temptimer4;
(0234) temptimer1=timerL%16;
022C E110 LDI R17,0x10
022D 2F06 MOV R16,R22
022E D874 RCALL mod8u
022F 2F40 MOV R20,R16
(0235) temptimer2=timerL/16;
0230 2F86 MOV R24,R22
0231 9582 SWAP R24
0232 708F ANDI R24,0xF
0233 2F68 MOV R22,R24
(0236) temptimer3=timerH%16;
0234 E110 LDI R17,0x10
0235 2D0C MOV R16,R12
0236 D86C RCALL mod8u
0237 2EA0 MOV R10,R16
(0237) temptimer4=timerH/16;
0238 2D8C MOV R24,R12
0239 9582 SWAP R24
023A 708F ANDI R24,0xF
023B 2EC8 MOV R12,R24
(0238)
(0239) Display_Data_LED(temptimer1,temptimer2,temptimer3,temptimer4);
023C 82CA STD Y+2,R12
023D 82A8 STD Y+0,R10
023E 2F26 MOV R18,R22
023F 2F04 MOV R16,R20
0240 D029 RCALL _Display_Data_LED
0241 9623 ADIW R28,3
0242 D87C RCALL pop_gset4
0243 9508 RET
_DisplayData:
temptimer4 --> R12
temptimer3 --> R10
temptimer2 --> R22
temptimer1 --> R20
timer --> R20
0244 D880 RCALL push_gset4
0245 01A8 MOVW R20,R16
0246 9723 SBIW R28,3
(0240)
(0241) }
(0242)
(0243) void DisplayData(unsigned int timer)
(0244) {
(0245)
(0246) unsigned char temptimer1,temptimer2,temptimer3,temptimer4;
(0247) temptimer4=timer/1000;
0247 EE28 LDI R18,0xE8
0248 E033 LDI R19,3
0249 018A MOVW R16,R20
024A D83E RCALL div16u
024B 2EC0 MOV R12,R16
(0248) timer=timer%1000;
024C EE28 LDI R18,0xE8
024D E033 LDI R19,3
024E 018A MOVW R16,R20
024F D837 RCALL mod16u
0250 01A8 MOVW R20,R16
(0249) temptimer3=timer/100;
0251 E624 LDI R18,0x64
0252 E030 LDI R19,0
0253 D835 RCALL div16u
0254 2EA0 MOV R10,R16
(0250) timer=timer%100;
0255 E624 LDI R18,0x64
0256 E030 LDI R19,0
0257 018A MOVW R16,R20
0258 D82E RCALL mod16u
0259 01A8 MOVW R20,R16
(0251) temptimer2=timer/10;
025A E02A LDI R18,0xA
025B E030 LDI R19,0
025C D82C RCALL div16u
025D 2F60 MOV R22,R16
(0252) temptimer1=timer%10;
025E E02A LDI R18,0xA
025F E030 LDI R19,0
0260 018A MOVW R16,R20
0261 D825 RCALL mod16u
0262 2F40 MOV R20,R16
(0253) Display_Data_LED(temptimer1,temptimer2,temptimer3,temptimer4);
0263 82CA STD Y+2,R12
0264 82A8 STD Y+0,R10
0265 2F26 MOV R18,R22
0266 D003 RCALL _Display_Data_LED
0267 9623 ADIW R28,3
0268 D856 RCALL pop_gset4
0269 9508 RET
_Display_Data_LED:
displaydata_2 --> R22
displaydata --> R20
Data4 --> Y+6
Data3 --> Y+4
Data2 --> R18
Data1 --> R16
026A D85E RCALL push_gset2
(0254) }
(0255)
(0256) void Display_Data_LED(unsigned char Data1, unsigned char Data2,unsigned char Data3,unsigned char Data4)
(0257)
(0258) {unsigned char displaydata,displaydata_2;
(0259)
(0260) switch(Display_Position)
026B 91400065 LDS R20,Display_Position
026D 2755 CLR R21
026E 3041 CPI R20,1
026F E0E0 LDI R30,0
0270 075E CPC R21,R30
0271 F071 BEQ 0x0280
0272 3042 CPI R20,2
0273 E0E0 LDI R30,0
0274 075E CPC R21,R30
0275 F0E1 BEQ 0x0292
0276 3043 CPI R20,3
0277 E0E0 LDI R30,0
0278 075E CPC R21,R30
0279 F151 BEQ 0x02A4
027A 3044 CPI R20,4
027B E0E0 LDI R30,0
027C 075E CPC R21,R30
027D F409 BNE 0x027F
027E C037 RJMP 0x02B6
027F C047 RJMP 0x02C7
(0261) {
(0262)
(0263) case 1: displaydata=DataTab[Data1];
0280 E286 LDI R24,0x26
0281 E090 LDI R25,0
0282 2FE0 MOV R30,R16
0283 27FF CLR R31
0284 0FE8 ADD R30,R24
0285 1FF9 ADC R31,R25
0286 9144 LPM R20,0(Z)
(0264) displaydata_2=DataTab[Data1]&0xc0;
0287 2FE0 MOV R30,R16
0288 27FF CLR R31
0289 0FE8 ADD R30,R24
028A 1FF9 ADC R31,R25
028B 9164 LPM R22,0(Z)
028C 7C60 ANDI R22,0xC0
(0265) PORTD=0x3B|displaydata_2;
028D 2F86 MOV R24,R22
028E 638B ORI R24,0x3B
028F BB82 OUT 0x12,R24
(0266) PORTB=displaydata;
0290 BB48 OUT 0x18,R20
(0267) break;
0291 C035 RJMP 0x02C7
(0268) case 2:displaydata=DataTab[Data2];
0292 E286 LDI R24,0x26
0293 E090 LDI R25,0
0294 2FE2 MOV R30,R18
0295 27FF CLR R31
0296 0FE8 ADD R30,R24
0297 1FF9 ADC R31,R25
0298 9144 LPM R20,0(Z)
(0269) displaydata_2=DataTab[Data2]&0xc0;
0299 2FE2 MOV R30,R18
029A 27FF CLR R31
029B 0FE8 ADD R30,R24
029C 1FF9 ADC R31,R25
029D 9164 LPM R22,0(Z)
029E 7C60 ANDI R22,0xC0
(0270)
(0271) PORTD=0x37|displaydata_2;
029F 2F86 MOV R24,R22
02A0 6387 ORI R24,0x37
02A1 BB82 OUT 0x12,R24
(0272) PORTB=displaydata;
02A2 BB48 OUT 0x18,R20
(0273) break;
02A3 C023 RJMP 0x02C7
(0274) case 3: displaydata=DataTab[Data3];
02A4 E286 LDI R24,0x26
02A5 E090 LDI R25,0
02A6 81EC LDD R30,Y+4
02A7 27FF CLR R31
02A8 0FE8 ADD R30,R24
02A9 1FF9 ADC R31,R25
02AA 9144 LPM R20,0(Z)
(0275) displaydata_2=DataTab[Data3]&0xc0;
02AB 81EC LDD R30,Y+4
02AC 27FF CLR R31
02AD 0FE8 ADD R30,R24
02AE 1FF9 ADC R31,R25
02AF 9164 LPM R22,0(Z)
02B0 7C60 ANDI R22,0xC0
(0276) PORTD=0x2F|displaydata_2;
02B1 2F86 MOV R24,R22
02B2 628F ORI R24,0x2F
02B3 BB82 OUT 0x12,R24
(0277) PORTB=displaydata;
02B4 BB48 OUT 0x18,R20
(0278) break;
02B5 C011 RJMP 0x02C7
(0279) case 4: displaydata=DataTab[Data4];
02B6 E286 LDI R24,0x26
02B7 E090 LDI R25,0
02B8 81EE LDD R30,Y+6
02B9 27FF CLR R31
02BA 0FE8 ADD R30,R24
02BB 1FF9 ADC R31,R25
02BC 9144 LPM R20,0(Z)
(0280) displaydata_2=DataTab[Data4]&0xc0;
02BD 81EE LDD R30,Y+6
02BE 27FF CLR R31
02BF 0FE8 ADD R30,R24
02C0 1FF9 ADC R31,R25
02C1 9164 LPM R22,0(Z)
02C2 7C60 ANDI R22,0xC0
(0281) PORTD=0x1F|displaydata_2;
02C3 2F86 MOV R24,R22
02C4 618F ORI R24,0x1F
02C5 BB82 OUT 0x12,R24
(0282) PORTB=displaydata;
02C6 BB48 OUT 0x18,R20
(0283) break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -