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

📄 test.lst

📁 AVR单片机六路ADC采集与七段数码管显示采集值
💻 LST
字号:
__start:
__text_start:
      2C E5CF      LDI	R28,0x5F
      2D E0D4      LDI	R29,4
      2E BFCD      OUT	0x3D,R28
      2F BFDE      OUT	0x3E,R29
      30 51CE      SUBI	R28,0x1E
      31 40D0      SBCI	R29,0
      32 EA0A      LDI	R16,0xAA
      33 8308      STD	Y+0,R16
      34 2400      CLR	R0
      35 E9E1      LDI	R30,0x91
      36 E0F0      LDI	R31,0
      37 E010      LDI	R17,0
      38 39E1      CPI	R30,0x91
      39 07F1      CPC	R31,R17
      3A F011      BEQ	0x003D
      3B 9201      ST	R0,Z+
      3C CFFB      RJMP	0x0038
      3D 8300      STD	Z+0,R16
      3E E2E6      LDI	R30,0x26
      3F E0F0      LDI	R31,0
      40 E6A0      LDI	R26,0x60
      41 E0B0      LDI	R27,0
      42 E010      LDI	R17,0
      43 E000      LDI	R16,0
      44 BF0B      OUT	0x3B,R16
      45 35E7      CPI	R30,0x57
      46 07F1      CPC	R31,R17
      47 F021      BEQ	0x004C
      48 95C8      LPM
      49 9631      ADIW	R30,1
      4A 920D      ST	R0,X+
      4B CFF9      RJMP	0x0045
      4C D0C4      RCALL	_main
_exit:
      4D CFFF      RJMP	_exit
_Delay_MS:
  i                    --> R20
  iTime                --> R16
      4E 934A      ST	R20,-Y
FILE: f:\MYDOCU~1\AVR\test\delay.h
(0001) //#IFDEF F_CPU
(0002) #define F_CPU 8000000
(0003) //#ENDIF
(0004) 
(0005) //延时,对应主频为8MHz
(0006) void Delay_MS(unsigned int iTime) 
(0007) {   unsigned char i; 
      4F C008      RJMP	0x0058
(0008)     while(iTime>0) 
(0009)     { 
(0010)         for (i=1;i<187;i++) 
      50 E041      LDI	R20,1
      51 C002      RJMP	0x0054
(0011)             asm("nop"); 
      52 0000      NOP
      53 9543      INC	R20
      54 3B4B      CPI	R20,0xBB
      55 F3E0      BCS	0x0052
(0012) 
(0013)         iTime--; 
      56 5001      SUBI	R16,1
      57 4010      SBCI	R17,0
      58 3000      CPI	R16,0
      59 0701      CPC	R16,R17
      5A F7A9      BNE	0x0050
      5B 9149      LD	R20,Y+
      5C 9508      RET
_Delay_US:
  j                    --> R10
  i                    --> R20
  iTime                --> R16
      5D D118      RCALL	push_xgset300C
(0014)     } 
(0015) } 
(0016) 
(0017) //主频8MHz
(0018) void Delay_US(unsigned int iTime) 
(0019) {
(0020)     unsigned int i,j;
(0021) 	j = iTime * 8;
      5E 0158      MOVW	R10,R16
      5F 0CAA      LSL	R10
      60 1CBB      ROL	R11
      61 0CAA      LSL	R10
      62 1CBB      ROL	R11
      63 0CAA      LSL	R10
      64 1CBB      ROL	R11
(0022) 	for(i=0;i<j;i++);
      65 2744      CLR	R20
      66 2755      CLR	R21
      67 C002      RJMP	0x006A
      68 5F4F      SUBI	R20,0xFF
      69 4F5F      SBCI	R21,0xFF
      6A 154A      CP	R20,R10
      6B 055B      CPC	R21,R11
      6C F3D8      BCS	0x0068
      6D C10D      RJMP	pop_xgset300C
_OnTimer0:
  adv                  --> R20
      6E 920A      ST	R0,-Y
      6F 921A      ST	R1,-Y
      70 922A      ST	R2,-Y
      71 923A      ST	R3,-Y
      72 924A      ST	R4,-Y
      73 925A      ST	R5,-Y
      74 926A      ST	R6,-Y
      75 927A      ST	R7,-Y
      76 928A      ST	R8,-Y
      77 929A      ST	R9,-Y
      78 930A      ST	R16,-Y
      79 931A      ST	R17,-Y
      7A 932A      ST	R18,-Y
      7B 933A      ST	R19,-Y
      7C 938A      ST	R24,-Y
      7D 939A      ST	R25,-Y
      7E 93AA      ST	R26,-Y
      7F 93BA      ST	R27,-Y
      80 93EA      ST	R30,-Y
      81 93FA      ST	R31,-Y
      82 B60F      IN	R0,0x3F
      83 920A      ST	R0,-Y
      84 934A      ST	R20,-Y
      85 935A      ST	R21,-Y
FILE: f:\MYDOCU~1\AVR\test\main.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define F_CPU	   8000000	//主频
(0005) #include "delay.h"
(0006) 
(0007) #define MAXCH      16		//总通道数
(0008) #define MAXSCALECH 6		//比例通道数
(0009) 
(0010) //数码管显示值
(0011) unsigned char SEG7[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0012) 
(0013) //通道值
(0014) unsigned char PADV[MAXCH] = {-1};
(0015) unsigned char CADV[MAXCH] = {0};
(0016) 
(0017) unsigned char ScaleCHindex  = 0;
(0018) 
(0019) //以下定义中断处理程序
(0020) #pragma interrupt_handler OnTimer0:iv_TIMER0_OVF
(0021) void OnTimer0(void)
(0022) {   unsigned char adv;
(0023)     ADMUX = 0x20 + ScaleCHindex;	  //左对齐,只取高位
      86 9180 0090 LDS	R24,ScaleCHindex
      88 5E80      SUBI	R24,0xE0
      89 B987      OUT	0x07,R24
(0024) 
(0025) 	ADCSRA|=(1<<ADSC);	  	  //启动ADC
      8A 9A36      SBI	0x06,6
(0026) 	Delay_US(100);			  //第一次结果抛弃
      8B E604      LDI	R16,0x64
      8C E010      LDI	R17,0
      8D DFCF      RCALL	_Delay_US
(0027) 	ADCSRA|=(1<<ADSC);	  	  //启动ADC
      8E 9A36      SBI	0x06,6
(0028) 	Delay_US(100);
      8F E604      LDI	R16,0x64
      90 E010      LDI	R17,0
      91 DFCB      RCALL	_Delay_US
(0029) 	adv = ADCH;
      92 B145      IN	R20,0x05
(0030) 
(0031) 	if(adv == 0xFF)			adv = 0xFE;
      93 3F4F      CPI	R20,0xFF
      94 F411      BNE	0x0097
      95 EF4E      LDI	R20,0xFE
      96 C004      RJMP	0x009B
(0032) 	else if(ADCH == 0x00)	adv = 0x01;
      97 B025      IN	R2,0x05
      98 2022      TST	R2
      99 F409      BNE	0x009B
      9A E041      LDI	R20,1
(0033) 		
(0034) 	CADV[ScaleCHindex] = adv;
      9B E880      LDI	R24,0x80
      9C E090      LDI	R25,0
      9D 91E0 0090 LDS	R30,ScaleCHindex
      9F 27FF      CLR	R31
      A0 0FE8      ADD	R30,R24
      A1 1FF9      ADC	R31,R25
      A2 8340      STD	Z+0,R20
(0035) 
(0036) 	ScaleCHindex++;
      A3 9180 0090 LDS	R24,ScaleCHindex
      A5 5F8F      SUBI	R24,0xFF
      A6 9380 0090 STS	ScaleCHindex,R24
(0037) 	if(ScaleCHindex >= MAXSCALECH) ScaleCHindex = 0;
      A8 3086      CPI	R24,6
      A9 F018      BCS	0x00AD
      AA 2422      CLR	R2
      AB 9220 0090 STS	ScaleCHindex,R2
(0038) 	
(0039) 	//去抖
(0040) 	adv = PIND;
      AD B340      IN	R20,0x10
(0041) 	Delay_US(50);
      AE E302      LDI	R16,0x32
      AF E010      LDI	R17,0
      B0 DFAC      RCALL	_Delay_US
(0042) 	if(adv != PIND) return; 
      B1 B220      IN	R2,0x10
      B2 1542      CP	R20,R2
      B3 F009      BEQ	0x00B5
      B4 C024      RJMP	0x00D9
(0043) 	
(0044) 	CADV[MAXSCALECH] = (PIND & 0x10) ? 0xFF : 0x00;  
      B5 9B84      SBIS	0x10,4
      B6 C003      RJMP	0x00BA
      B7 EF4F      LDI	R20,0xFF
      B8 E050      LDI	R21,0
      B9 C002      RJMP	0x00BC
      BA 2744      CLR	R20
      BB 2755      CLR	R21
      BC 9340 0086 STS	0x0086,R20
(0045) 	CADV[MAXSCALECH+1] = (PIND & 0x20) ? 0xFF : 0x00;
      BE 9B85      SBIS	0x10,5
      BF C003      RJMP	0x00C3
      C0 EF4F      LDI	R20,0xFF
      C1 E050      LDI	R21,0
      C2 C002      RJMP	0x00C5
      C3 2744      CLR	R20
      C4 2755      CLR	R21
      C5 9340 0087 STS	0x0087,R20
(0046) 	CADV[MAXSCALECH+2] = (PIND & 0x40) ? 0xFF : 0x00;
      C7 9B86      SBIS	0x10,6
      C8 C003      RJMP	0x00CC
      C9 EF4F      LDI	R20,0xFF
      CA E050      LDI	R21,0
      CB C002      RJMP	0x00CE
      CC 2744      CLR	R20
      CD 2755      CLR	R21
      CE 9340 0088 STS	0x0088,R20
(0047) 	CADV[MAXSCALECH+3] = (PIND & 0x80) ? 0xFF : 0x00;
      D0 9B87      SBIS	0x10,7
      D1 C003      RJMP	0x00D5
      D2 EF4F      LDI	R20,0xFF
      D3 E050      LDI	R21,0
      D4 C002      RJMP	0x00D7
      D5 2744      CLR	R20
      D6 2755      CLR	R21
      D7 9340 0089 STS	0x0089,R20
      D9 9159      LD	R21,Y+
      DA 9149      LD	R20,Y+
      DB 9009      LD	R0,Y+
      DC BE0F      OUT	0x3F,R0
      DD 91F9      LD	R31,Y+
      DE 91E9      LD	R30,Y+
      DF 91B9      LD	R27,Y+
      E0 91A9      LD	R26,Y+
      E1 9199      LD	R25,Y+
      E2 9189      LD	R24,Y+
      E3 9139      LD	R19,Y+
      E4 9129      LD	R18,Y+
      E5 9119      LD	R17,Y+
      E6 9109      LD	R16,Y+
      E7 9099      LD	R9,Y+
      E8 9089      LD	R8,Y+
      E9 9079      LD	R7,Y+
      EA 9069      LD	R6,Y+
      EB 9059      LD	R5,Y+
      EC 9049      LD	R4,Y+
      ED 9039      LD	R3,Y+
      EE 9029      LD	R2,Y+
      EF 9019      LD	R1,Y+
      F0 9009      LD	R0,Y+
      F1 9518      RETI
(0048) 
(0049)     //TCNT0 = 0xFF;
(0050) }
(0051) 
(0052) #pragma interrupt_handler OnADC:iv_ADC
(0053) void OnADC(void)
(0054) {
_OnADC:
      F2 9518      RETI
(0055) 
(0056) }
(0057) 
(0058) //初始化
(0059) void init_devices(void)
(0060) {
(0061) 
(0062)     //内部RC校准
(0063) 	OSCCAL = 0x7D;
_init_devices:
      F3 E78D      LDI	R24,0x7D
      F4 BF81      OUT	0x31,R24
(0064) 	
(0065)     CLI();
      F5 94F8      BCLR	7
(0066)     
(0067)     //端口初始化
(0068) 	PORTB = 0xFF;
      F6 EF8F      LDI	R24,0xFF
      F7 BB88      OUT	0x18,R24
(0069) 	DDRB  = 0xFF;
      F8 BB87      OUT	0x17,R24
(0070) 	
(0071) 	PORTC = 0x00;
      F9 2422      CLR	R2
      FA BA25      OUT	0x15,R2
(0072) 	DDRC  = 0x00;
      FB BA24      OUT	0x14,R2
(0073) 	
(0074) 	PORTD = 0xF0;
      FC EF80      LDI	R24,0xF0
      FD BB82      OUT	0x12,R24
(0075) 	DDRD  = 0x0F;
      FE E08F      LDI	R24,0xF
      FF BB81      OUT	0x11,R24
(0076)     
(0077)     //定时器初始化
(0078)     TCCR0 = 0x00; //禁止计时
     100 BE23      OUT	0x33,R2
(0079)     TCNT0 = 0x0F; //定时器时长
     101 BF82      OUT	0x32,R24
(0080)     TCCR0 = 0x05; //启动定时器 CLK/1024
     102 E085      LDI	R24,5
     103 BF83      OUT	0x33,R24
(0081)     
(0082)     //ADC初始化
(0083)     ADCSR = 0x00; //禁止转换
     104 B826      OUT	0x06,R2
(0084)     ADMUX = 0x20; //多路复用选择寄存器 E0 内部参考源,左对齐(只需高八位),通道0
     105 E280      LDI	R24,0x20
     106 B987      OUT	0x07,R24
(0085) 		  		  // REFS1 RESF0(参考源) ADLAR(左对齐) 保留 MUX3 MUX2 MUX1 MUX0
(0086)     ACSR  = 0x80; //模拟比较器控制与状态寄存器
     107 E880      LDI	R24,0x80
     108 B988      OUT	0x08,R24
(0087)     ADCSR = 0x83; //10001011  83 禁止中断,使用查询方式 
     109 E883      LDI	R24,0x83
     10A B986      OUT	0x06,R24
(0088) 		  		  //ADEN(AD允许) ADSC(AD开始) ADFR(连续) ADIF(中断标志) ADIE(中断允许) ADPS(预分频,三位)
(0089) 	
(0090)     
(0091)     //控制寄存器
(0092)     MCUCR = 0x00;
     10B BE25      OUT	0x35,R2
(0093)     GICR  = 0x00;
     10C BE2B      OUT	0x3B,R2
(0094)     TIMSK = 0x01; //充许Timer0中断
     10D E081      LDI	R24,1
     10E BF89      OUT	0x39,R24
(0095)     
(0096)     SEI();
     10F 9478      BSET	7
     110 9508      RET
(0097) }
(0098) 
(0099) main()
(0100) {	  
(0101) 	int i = 0,j = 0;
_main:
  i                    --> R10
  j                    --> R20
     111 24AA      CLR	R10
     112 24BB      CLR	R11
     113 2744      CLR	R20
     114 2755      CLR	R21
(0102)     	
(0103)     init_devices();
     115 DFDD      RCALL	_init_devices
     116 C05D      RJMP	0x0174
(0104) 	
(0105) 	while(1)
(0106) 	{	
(0107) 		for(j=0;j<MAXCH;j++)
     117 2744      CLR	R20
     118 2755      CLR	R21
(0108)     		if(PADV[j] != CADV[j])
     119 E880      LDI	R24,0x80
     11A E090      LDI	R25,0
     11B 01FA      MOVW	R30,R20
     11C 0FE8      ADD	R30,R24
     11D 1FF9      ADC	R31,R25
     11E 8020      LDD	R2,Z+0
     11F E780      LDI	R24,0x70
     120 E090      LDI	R25,0
     121 01FA      MOVW	R30,R20
     122 0FE8      ADD	R30,R24
     123 1FF9      ADC	R31,R25
     124 8030      LDD	R3,Z+0
     125 1432      CP	R3,R2
     126 F069      BEQ	0x0134
(0109) 			{   i = j;
     127 015A      MOVW	R10,R20
(0110) 			    PADV[j] = CADV[j];
     128 E880      LDI	R24,0x80
     129 E090      LDI	R25,0
     12A 01FA      MOVW	R30,R20
     12B 0FE8      ADD	R30,R24
     12C 1FF9      ADC	R31,R25
     12D 8020      LDD	R2,Z+0
     12E E780      LDI	R24,0x70
     12F E090      LDI	R25,0
     130 01FA      MOVW	R30,R20
     131 0FE8      ADD	R30,R24
     132 1FF9      ADC	R31,R25
     133 8220      STD	Z+0,R2
     134 5F4F      SUBI	R20,0xFF
     135 4F5F      SBCI	R21,0xFF
     136 3140      CPI	R20,0x10
     137 E0E0      LDI	R30,0
     138 075E      CPC	R21,R30
     139 F2FC      BLT	0x0119
(0111) 			}
(0112) 		
(0113) 		//显示低位
(0114)    		PORTD = 0x01;
     13A E081      LDI	R24,1
     13B BB82      OUT	0x12,R24
(0115)    		PORTB = SEG7[CADV[i] & 0x0F];
     13C E880      LDI	R24,0x80
     13D E090      LDI	R25,0
     13E 01F5      MOVW	R30,R10
     13F 0FE8      ADD	R30,R24
     140 1FF9      ADC	R31,R25
     141 81E0      LDD	R30,Z+0
     142 27FF      CLR	R31
     143 70EF      ANDI	R30,0xF
     144 70F0      ANDI	R31,0
     145 E680      LDI	R24,0x60
     146 E090      LDI	R25,0
     147 0FE8      ADD	R30,R24
     148 1FF9      ADC	R31,R25
     149 8020      LDD	R2,Z+0
     14A BA28      OUT	0x18,R2
(0116) 		Delay_MS(20);
     14B E104      LDI	R16,0x14
     14C E010      LDI	R17,0
     14D DF00      RCALL	_Delay_MS
(0117)    		
(0118) 		//显示高位
(0119)        	PORTD = 0x02;
     14E E082      LDI	R24,2
     14F BB82      OUT	0x12,R24
(0120)    		PORTB = SEG7[CADV[i] >> 4];
     150 E880      LDI	R24,0x80
     151 E090      LDI	R25,0
     152 01F5      MOVW	R30,R10
     153 0FE8      ADD	R30,R24
     154 1FF9      ADC	R31,R25
     155 81E0      LDD	R30,Z+0
     156 27FF      CLR	R31
     157 95F5      ASR	R31
     158 95E7      ROR	R30
     159 95F5      ASR	R31
     15A 95E7      ROR	R30
     15B 95F5      ASR	R31
     15C 95E7      ROR	R30
     15D 95F5      ASR	R31
     15E 95E7      ROR	R30
     15F E680      LDI	R24,0x60
     160 E090      LDI	R25,0
     161 0FE8      ADD	R30,R24
     162 1FF9      ADC	R31,R25
     163 8020      LDD	R2,Z+0
     164 BA28      OUT	0x18,R2
(0121)        	Delay_MS(20);
     165 E104      LDI	R16,0x14
     166 E010      LDI	R17,0
     167 DEE6      RCALL	_Delay_MS
(0122) 
(0123) 		//通道值
(0124)    		PORTD = 0x08;
     168 E088      LDI	R24,0x8
     169 BB82      OUT	0x12,R24
(0125)    		PORTB = SEG7[i];
     16A E680      LDI	R24,0x60
     16B E090      LDI	R25,0
     16C 01F5      MOVW	R30,R10
     16D 0FE8      ADD	R30,R24
     16E 1FF9      ADC	R31,R25
     16F 8020      LDD	R2,Z+0
     170 BA28      OUT	0x18,R2
(0126)        	Delay_MS(20);
FILE: <library>
     171 E104      LDI	R16,0x14
     172 E010      LDI	R17,0
     173 DEDA      RCALL	_Delay_MS
     174 CFA2      RJMP	0x0117
     175 9508      RET
push_xgset300C:
     176 935A      ST	R21,-Y
     177 934A      ST	R20,-Y
     178 92BA      ST	R11,-Y
     179 92AA      ST	R10,-Y
     17A 9508      RET
pop_xgset300C:
     17B 90A9      LD	R10,Y+
     17C 90B9      LD	R11,Y+
     17D 9149      LD	R20,Y+
     17E 9159      LD	R21,Y+
     17F 9508      RET

⌨️ 快捷键说明

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