⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8demo.lst

📁 AVR系列被广泛应用的单片机MEGA8开发(原理图)及例程
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -