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

📄 test-adc.lst

📁 ATmega16内部ADC的应用:ATmega16内部集成了8路10位逐次逼近型模数转换器
💻 LST
📖 第 1 页 / 共 3 页
字号:
    01F7 924A      ST	R4,-Y
    01F8 923A      ST	R3,-Y
    01F9 922A      ST	R2,-Y
    01FA 018A      MOVW	R16,R20
    01FB 019B      MOVW	R18,R22
    01FC 940E02BF  CALL	empy32u
    01FE E08A      LDI	R24,0xA
    01FF E090      LDI	R25,0
    0200 938A      ST	R24,-Y
    0201 940E0339  CALL	lsr32
    0203 0168      MOVW	R12,R16
(0047)    for(i=0;i<3;i++)
    0204 24AA      CLR	R10
    0205 C019      RJMP	0x021F
(0048)    {
(0049) 	  adc_show[3-i]=temp%10+0x30;  //转换电压值用来在LCD上显示
    0206 2C2A      MOV	R2,R10
    0207 2433      CLR	R3
    0208 E0E3      LDI	R30,3
    0209 E0F0      LDI	R31,0
    020A 19E2      SUB	R30,R2
    020B 09F3      SBC	R31,R3
    020C E785      LDI	R24,0x75
    020D E090      LDI	R25,0
    020E 0FE8      ADD	R30,R24
    020F 1FF9      ADC	R31,R25
    0210 E02A      LDI	R18,0xA
    0211 E030      LDI	R19,0
    0212 0186      MOVW	R16,R12
    0213 940E02A3  CALL	mod16u
    0215 01C8      MOVW	R24,R16
    0216 96C0      ADIW	R24,0x30
    0217 8380      STD	Z+0,R24
(0050) 	  temp=temp/10;
    0218 E02A      LDI	R18,0xA
    0219 E030      LDI	R19,0
    021A 0186      MOVW	R16,R12
    021B 940E02A5  CALL	div16u
    021D 0168      MOVW	R12,R16
    021E 94A3      INC	R10
    021F 2D8A      MOV	R24,R10
    0220 3083      CPI	R24,3
    0221 F320      BCS	0x0206
(0051)    }
(0052) 	adc_show[0]=adc_show[1];
    0222 90200076  LDS	R2,adc_show+1
    0224 92200075  STS	adc_show,R2
(0053) 	adc_show[1]='.';	
    0226 E28E      LDI	R24,0x2E
    0227 93800076  STS	adc_show+1,R24
(0054) 	adc_show[4]='V';	
    0229 E586      LDI	R24,0x56
    022A 93800079  STS	0x79,R24
(0055) 	adc_show[5]=0;	              //数组结束标记
    022C 2422      CLR	R2
    022D 9220007A  STS	0x7A,R2
    022F 940E02F2  CALL	pop_gset4
    0231 9508      RET
_int0_isr:
    0232 938A      ST	R24,-Y
    0233 939A      ST	R25,-Y
    0234 B78F      IN	R24,0x3F
    0235 938A      ST	R24,-Y
(0056) }
(0057) 
(0058) #pragma interrupt_handler int0_isr:2
(0059) void int0_isr(void)
(0060) {
(0061)    extint_count++;
    0236 91800060  LDS	R24,extint_count
    0238 91900061  LDS	R25,extint_count+1
    023A 9601      ADIW	R24,1
    023B 93900061  STS	extint_count+1,R25
    023D 93800060  STS	extint_count,R24
(0062)    if (act_flag!=1)
    023F 91800062  LDS	R24,act_flag
    0241 3081      CPI	R24,1
    0242 F019      BEQ	0x0246
(0063)    {
(0064)       act_flag = 1;
    0243 E081      LDI	R24,1
    0244 93800062  STS	act_flag,R24
(0065)    }
    0246 9189      LD	R24,Y+
    0247 BF8F      OUT	0x3F,R24
    0248 9199      LD	R25,Y+
    0249 9189      LD	R24,Y+
    024A 9518      RETI
(0066) }
(0067) void adc_init(void)
(0068) {
(0069)    ADMUX = (1<<REFS1)|
_adc_init:
    024B EC80      LDI	R24,0xC0
    024C B987      OUT	0x07,R24
(0070)            (1<<REFS0)|    //选择内部2.56v作为参考电压
(0071)            0x00;          //使用ad转换0通道
(0072) 		                  //ADLAR = 0,转换结果选择右对齐
(0073)    ADCSRA = (1<<ADEN)|     //ADC使能
    024D ED8E      LDI	R24,0xDE
    024E B986      OUT	0x06,R24
    024F 9508      RET
(0074)             (1<<ADSC)|     //开始一次ad转换
(0075) 		    (1<<ADIF)|     //写1,将ADIF位清0
(0076) 		    (1<<ADIE)|     //允许ADC中断
(0077) 		    0x06;          //时钟分频系数为64
(0078) }
(0079) //call this routine to initialize all peripherals
(0080) void init_devices(void)
(0081) {
(0082)  CLI();         //关闭全局中断
_init_devices:
    0250 94F8      BCLR	7
(0083)  port_init();   //CPU端口初始化
    0251 DF6D      RCALL	_port_init
(0084)  /**/
(0085)  MCUCR = 0x02;  //INT0引脚上的下降沿触发中断
    0252 E082      LDI	R24,2
    0253 BF85      OUT	0x35,R24
(0086)  GICR  = 0x40;  //外部中断0请求使能
    0254 E480      LDI	R24,0x40
    0255 BF8B      OUT	0x3B,R24
(0087)  /**/
(0088)  /** /
(0089)   MCUCR = 0x00;  //INT0引脚上的低电平触发中断
(0090)   GICR  = 0x40;  //外部中断0请求使能
(0091)  /**/
(0092)  /** /
(0093)   MCUCR = 0x01;  //INT0引脚上的上升沿和下降沿都触发中断
(0094)   GICR  = 0x40;  //外部中断0请求使能
(0095)  /**/
(0096)  /** /
(0097)   MCUCR = 0x03;  //INT0引脚上的上升沿触发中断
(0098)   GICR  = 0x40;  //外部中断0请求使能
(0099)  /**/
(0100)  adc_init();
    0256 DFF4      RCALL	_adc_init
(0101)  SEI(); //打开全局中断
    0257 9478      BSET	7
    0258 9508      RET
_main:
  temp                 --> Y+3
  temp_show            --> Y+2
  i                    --> R20
    0259 9727      SBIW	R28,7
(0102)  
(0103) }
(0104) void main(void)
(0105) {
(0106)    char temp_show[5];  //定义数组用作在液晶屏上进行显示
(0107)    unsigned char i;
(0108)    unsigned int temp;
(0109)    for(i=0;i<5;i++)
    025A 2744      CLR	R20
    025B C009      RJMP	0x0265
(0110)    {
(0111)       temp_show[i] = 0;
    025C 01CE      MOVW	R24,R28
    025D 9602      ADIW	R24,2
    025E 2FE4      MOV	R30,R20
    025F 27FF      CLR	R31
    0260 0FE8      ADD	R30,R24
    0261 1FF9      ADC	R31,R25
    0262 2422      CLR	R2
    0263 8220      STD	Z+0,R2
    0264 9543      INC	R20
    0265 3045      CPI	R20,5
    0266 F3A8      BCS	0x025C
(0112)    }
(0113)    temp_show[4] = 0xff;  //显示结束标志
    0267 EF8F      LDI	R24,0xFF
    0268 838E      STD	Y+6,R24
(0114)    /**/
(0115)    init_devices();
    0269 DFE6      RCALL	_init_devices
(0116)    LCDReady();
    026A 940E0108  CALL	_LCDReady
(0117)    LcdInit();          //LCD初始化
    026C 940E012A  CALL	_LcdInit
(0118)    CharsWrite(0,1,"AD0 VOLTAGE:");  //在LCD的第一行显示"AD0 VOLTAGE:"
    026E E688      LDI	R24,0x68
    026F E090      LDI	R25,0
    0270 8399      STD	Y+1,R25
    0271 8388      STD	Y+0,R24
    0272 E021      LDI	R18,1
    0273 2700      CLR	R16
    0274 940E013C  CALL	_CharsWrite
(0119)    CharsWrite(0,2,"0.0V");            //在第二行显示“0.0V”
    0276 E683      LDI	R24,0x63
    0277 E090      LDI	R25,0
    0278 8399      STD	Y+1,R25
    0279 8388      STD	Y+0,R24
    027A E022      LDI	R18,2
    027B 2700      CLR	R16
    027C 940E013C  CALL	_CharsWrite
(0120)    uart_init();        //串口初始化
    027E 940E0084  CALL	_uart_init
(0121)    delay_ms(1000);
    0280 EE08      LDI	R16,0xE8
    0281 E013      LDI	R17,3
    0282 940E01B0  CALL	_delay_ms
    0284 C01B      RJMP	0x02A0
(0122)    /**/
(0123)    while(1)
(0124)    {
(0125)       ClearLcd();     //清屏LCD
    0285 940E008D  CALL	_ClearLcd
(0126) 	  delay_us(80);   //等待清屏操作完成
    0287 E500      LDI	R16,0x50
    0288 E010      LDI	R17,0
    0289 940E0197  CALL	_delay_us
(0127) 	  CharsWrite(0,1,"AD0 VOLTAGE:");  //在LCD的第一行显示"AD0 VOLTAGE:"
    028B E688      LDI	R24,0x68
    028C E090      LDI	R25,0
    028D 8399      STD	Y+1,R25
    028E 8388      STD	Y+0,R24
    028F E021      LDI	R18,1
    0290 2700      CLR	R16
    0291 940E013C  CALL	_CharsWrite
(0128) 	  data_con();                      //将ad转换值转换为电压值
    0293 DF56      RCALL	_data_con
(0129) 	  CharsWrite(0,2,adc_show);        //在LCD上显示转换电压值
    0294 E785      LDI	R24,0x75
    0295 E090      LDI	R25,0
    0296 8399      STD	Y+1,R25
    0297 8388      STD	Y+0,R24
    0298 E022      LDI	R18,2
    0299 2700      CLR	R16
    029A 940E013C  CALL	_CharsWrite
(0130) 	  delay_ms(300);
FILE: <library>
    029C E20C      LDI	R16,0x2C
    029D E011      LDI	R17,1
    029E 940E01B0  CALL	_delay_ms
    02A0 CFE4      RJMP	0x0285
    02A1 9627      ADIW	R28,7
    02A2 9508      RET
mod16u:
    02A3 9468      BSET	6
    02A4 C001      RJMP	xdiv16u
div16u:
    02A5 94E8      BCLR	6
xdiv16u:
    02A6 92EA      ST	R14,-Y
    02A7 92FA      ST	R15,-Y
    02A8 938A      ST	R24,-Y
    02A9 24EE      CLR	R14
    02AA 24FF      CLR	R15
    02AB E180      LDI	R24,0x10
    02AC 0F00      LSL	R16
    02AD 1F11      ROL	R17
    02AE 1CEE      ROL	R14
    02AF 1CFF      ROL	R15
    02B0 16E2      CP	R14,R18
    02B1 06F3      CPC	R15,R19
    02B2 F018      BCS	0x02B6
    02B3 1AE2      SUB	R14,R18
    02B4 0AF3      SBC	R15,R19
    02B5 9503      INC	R16
    02B6 958A      DEC	R24
    02B7 F7A1      BNE	0x02AC
    02B8 F416      BRTC	0x02BB
    02B9 2D0E      MOV	R16,R14
    02BA 2D1F      MOV	R17,R15
    02BB 9189      LD	R24,Y+
    02BC 90F9      LD	R15,Y+
    02BD 90E9      LD	R14,Y+
    02BE 9508      RET
empy32u:
empy32s:
    02BF 940E0314  CALL	long_prolog
    02C1 927F      PUSH	R7
    02C2 940E032D  CALL	tstzero1
    02C4 F139      BEQ	0x02EC
    02C5 2477      CLR	R7
    02C6 940E0333  CALL	tstzero2
    02C8 F419      BNE	0x02CC
    02C9 018C      MOVW	R16,R24
    02CA 019D      MOVW	R18,R26
    02CB C020      RJMP	0x02EC
    02CC 9F08      MUL	R16,R24
    02CD 2CB0      MOV	R11,R0
    02CE 2CA1      MOV	R10,R1
    02CF 9F28      MUL	R18,R24
    02D0 2C90      MOV	R9,R0
    02D1 2C81      MOV	R8,R1
    02D2 9F18      MUL	R17,R24
    02D3 0CA0      ADD	R10,R0
    02D4 1C91      ADC	R9,R1
    02D5 1C87      ADC	R8,R7
    02D6 9F09      MUL	R16,R25
    02D7 0CA0      ADD	R10,R0
    02D8 1C91      ADC	R9,R1
    02D9 1C87      ADC	R8,R7
    02DA 9F19      MUL	R17,R25
    02DB 0C90      ADD	R9,R0
    02DC 1C81      ADC	R8,R1
    02DD 9F0A      MUL	R16,R26
    02DE 0C90      ADD	R9,R0
    02DF 1C81      ADC	R8,R1
    02E0 9F38      MUL	R19,R24
    02E1 0C80      ADD	R8,R0
    02E2 9F29      MUL	R18,R25
    02E3 0C80      ADD	R8,R0
    02E4 9F1A      MUL	R17,R26
    02E5 0C80      ADD	R8,R0
    02E6 9F0B      MUL	R16,R27
    02E7 0C80      ADD	R8,R0
    02E8 2D0B      MOV	R16,R11
    02E9 2D1A      MOV	R17,R10
    02EA 2D29      MOV	R18,R9
    02EB 2D38      MOV	R19,R8
    02EC 907F      POP	R7
    02ED 940C0322  JMP	long_epilog
pop_gset2:
    02EF E0E2      LDI	R30,2
    02F0 940C0301  JMP	pop
pop_gset4:
    02F2 E0E8      LDI	R30,0x8
    02F3 940C0301  JMP	pop
push_gset5:
    02F5 92FA      ST	R15,-Y
    02F6 92EA      ST	R14,-Y
push_gset4:
    02F7 92DA      ST	R13,-Y
    02F8 92CA      ST	R12,-Y
push_gset3:
    02F9 92BA      ST	R11,-Y
    02FA 92AA      ST	R10,-Y
push_gset2:
    02FB 937A      ST	R23,-Y
    02FC 936A      ST	R22,-Y
push_gset1:
    02FD 935A      ST	R21,-Y
    02FE 934A      ST	R20,-Y
    02FF 9508      RET
pop_gset1:
    0300 E0E1      LDI	R30,1
pop:
    0301 9149      LD	R20,Y+
    0302 9159      LD	R21,Y+
    0303 FDE0      SBRC	R30,0
    0304 9508      RET
    0305 9169      LD	R22,Y+
    0306 9179      LD	R23,Y+
    0307 FDE1      SBRC	R30,1
    0308 9508      RET
    0309 90A9      LD	R10,Y+
    030A 90B9      LD	R11,Y+
    030B FDE2      SBRC	R30,2
    030C 9508      RET
    030D 90C9      LD	R12,Y+
    030E 90D9      LD	R13,Y+
    030F FDE3      SBRC	R30,3
    0310 9508      RET
    0311 90E9      LD	R14,Y+
    0312 90F9      LD	R15,Y+
    0313 9508      RET
long_prolog:
    0314 928A      ST	R8,-Y
    0315 929A      ST	R9,-Y
    0316 92AA      ST	R10,-Y
    0317 92BA      ST	R11,-Y
    0318 93EA      ST	R30,-Y
    0319 938A      ST	R24,-Y
    031A 939A      ST	R25,-Y
    031B 93AA      ST	R26,-Y
    031C 93BA      ST	R27,-Y
    031D 8589      LDD	R24,Y+9
    031E 859A      LDD	R25,Y+10
    031F 85AB      LDD	R26,Y+11
    0320 85BC      LDD	R27,Y+12
    0321 9508      RET
long_epilog:
    0322 91B9      LD	R27,Y+
    0323 91A9      LD	R26,Y+
    0324 9199      LD	R25,Y+
    0325 9189      LD	R24,Y+
    0326 91E9      LD	R30,Y+
    0327 90B9      LD	R11,Y+
    0328 90A9      LD	R10,Y+
    0329 9099      LD	R9,Y+
    032A 9089      LD	R8,Y+
    032B 9624      ADIW	R28,4
    032C 9508      RET
tstzero1:
    032D 27EE      CLR	R30
    032E 2BE0      OR	R30,R16
    032F 2BE1      OR	R30,R17
    0330 2BE2      OR	R30,R18
    0331 2BE3      OR	R30,R19
    0332 9508      RET
tstzero2:
    0333 27EE      CLR	R30
    0334 2BE8      OR	R30,R24
    0335 2BE9      OR	R30,R25
    0336 2BEA      OR	R30,R26
    0337 2BEB      OR	R30,R27
    0338 9508      RET
lsr32:
    0339 920F      PUSH	R0
    033A 9009      LD	R0,Y+
    033B 2000      TST	R0
    033C F031      BEQ	0x0343
    033D 9536      LSR	R19
    033E 9527      ROR	R18
    033F 9517      ROR	R17
    0340 9507      ROR	R16
    0341 940A      DEC	R0
    0342 CFF8      RJMP	0x033B
    0343 900F      POP	R0
    0344 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -