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

📄 mega16_ad.lst

📁 AVR16单片机集成10位AD程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
    0113 933F      PUSH	R19
    0114 019C      MOVW	R18,R24
    0115 0181      MOVW	R16,R2
    0116 940E01D0  CALL	mod16s
    0118 01F8      MOVW	R30,R16
    0119 913F      POP	R19
    011A 912F      POP	R18
    011B 0FE6      ADD	R30,R22
    011C 1FF7      ADC	R31,R23
    011D 8100      LDD	R16,0+Z
    011E DF96      RCALL	_One_smg_display
(0071) 	 Delayus(2000);			 //调整显示时间和亮度(时间越长亮度越高,但是太长数码管就闪了)
    011F ED00      LDI	R16,0xD0
    0120 E017      LDI	R17,7
    0121 DF3F      RCALL	_Delayus
    0122 94A3      INC	R10
    0123 2D8A      MOV	R24,R10
    0124 3086      CPI	R24,6
    0125 F2C0      BCS	0x00FE
    0126 9543      INC	R20
    0127 3F40      CPI	R20,0xF0
    0128 F298      BCS	0x00FC
(0072) 	}
(0073)  }
(0074) }    0129 940E021F  CALL	pop_gset3
    012B 9508      RET
_Mega16_ad:
  addata               --> R20
  chl                  --> R20
    012C 940E01FD  CALL	push_gset1
    012E 2F40      MOV	R20,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD\MEGA16_AD.C
(0001) /*******************************************
(0002)   文件:MEGA16_AD.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:驱动MEGA16片上自带的AD转换器
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #include <stdio.h>			//标准输入输出头文件
(0012) #include <AVR_PQ1A.h>		//包含自定义常量头文件
(0013) #include "SMG.C"		//包含数码管显示函数
(0014) 
(0015) /*******************************************
(0016) 函数名称: Mega16_ad
(0017) 功    能: 对指定的通道进行模数转换
(0018) 参    数: chl--指定的通道(本开发板只用了通道0)
(0019) 返回值  : addata--10位数据输出
(0020) /********************************************/
(0021) uint Mega16_ad(uchar chl)
(0022) {
(0023)  uint addata;  
(0024)  DDRA&=~(BIT(PA0)|BIT(PA1));	 //转换口设置为输入、无上拉
    012F B38A      IN	R24,P1A
    0130 7F8C      ANDI	R24,0xFC
    0131 BB8A      OUT	P1A,R24
(0025)  PORTA&=~(BIT(PA0)|BIT(PA1));	
    0132 B38B      IN	R24,P1B
    0133 7F8C      ANDI	R24,0xFC
    0134 BB8B      OUT	P1B,R24
(0026)  ADMUX=0;	 //采用外部参考电压,输出数据右对齐
    0135 2422      CLR	R2
    0136 B827      OUT	P07,R2
(0027)  ADMUX|=chl; //设置指定的通道
    0137 B027      IN	R2,P07
    0138 2A24      OR	R2,R20
    0139 B827      OUT	P07,R2
(0028)  ADCSR=0x80; //采用单次转换,查询模式,2分频
    013A E880      LDI	R24,0x80
    013B B986      OUT	P06,R24
(0029)  ADCSR|=BIT(ADSC);	//启动转换
    013C 9A36      SBI	P06,6
(0030)  while(!(ADCSR&(BIT(ADIF)))); //等待转换结束
    013D 9B34      SBIS	P06,4
    013E CFFE      RJMP	0x013D
(0031)  addata=ADCL;
    013F B144      IN	R20,P04
    0140 2755      CLR	R21
(0032)  addata+=ADCH*256;
    0141 B125      IN	R18,P05
    0142 2733      CLR	R19
    0143 E000      LDI	R16,0
    0144 E011      LDI	R17,1
    0145 940E01ED  CALL	empy16s
    0147 0F40      ADD	R20,R16
    0148 1F51      ADC	R21,R17
(0033)  return addata;
    0149 2F04      MOV	R16,R20
    014A 2F15      MOV	R17,R21
    014B 940E0200  CALL	pop_gset1
    014D 9508      RET
_Num_BCD:
  rept                 --> R20
  chr                  --> Y+0
  i                    --> R22
  num                  --> R10
    014E 940E0218  CALL	push_gset3
    0150 2EA0      MOV	R10,R16
    0151 9723      SBIW	R28,3
(0034) }
(0035) /*******************************************
(0036) 函数名称: Num_BCD
(0037) 功    能: 将一个字节的整数转换成三位BCD码
(0038) 参    数: num--需要转换的整数
(0039) 返回值  : chr--三位BCD码数组指针
(0040) /********************************************/
(0041) uchar* Num_BCD(uchar num)
(0042) {
(0043)  uchar i,chr[3];	  
(0044)  uchar *rept;
(0045)  rept=&(chr[0]);	  //返回指针指向BCD码数组
    0152 01AE      MOVW	R20,R28
(0046)  for(i=0;i<3;i++)
    0153 2766      CLR	R22
    0154 C014      RJMP	0x0169
(0047)  {
(0048)   chr[2-i]=num%10;	  //对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
    0155 2E26      MOV	R2,R22
    0156 2433      CLR	R3
    0157 E0E2      LDI	R30,2
    0158 E0F0      LDI	R31,0
    0159 19E2      SUB	R30,R2
    015A 09F3      SBC	R31,R3
    015B 01CE      MOVW	R24,R28
    015C 0FE8      ADD	R30,R24
    015D 1FF9      ADC	R31,R25
    015E E01A      LDI	R17,0xA
    015F 2D0A      MOV	R16,R10
    0160 940E01A0  CALL	mod8u
    0162 8300      STD	R16,0+Z
(0049)   num/=10;			  //除以10,为取出下一位做准备
    0163 E01A      LDI	R17,0xA
    0164 2D0A      MOV	R16,R10
    0165 940E01A2  CALL	div8u
    0167 2EA0      MOV	R10,R16
    0168 9563      INC	R22
    0169 3063      CPI	R22,3
    016A F350      BCS	0x0155
(0050)  }
(0051)  return rept;		  //返回指针
    016B 2F04      MOV	R16,R20
    016C 2F15      MOV	R17,R21
    016D 9623      ADIW	R28,3
    016E 940E021F  CALL	pop_gset3
    0170 9508      RET
_main:
  adpt                 --> R20
  ad0                  --> Y+0
  i                    --> R22
    0171 9723      SBIW	R28,3
(0052) }
(0053) /*******************************************
(0054) 函数名称: main
(0055) 功    能: 驱动MEGA16的AD,并在数码管上显示采集值
(0056) 参    数: 无
(0057) 返回值  : 无
(0058) /********************************************/
(0059) void main(void)
(0060) {	 
(0061) 	 uchar *adpt;						//定义一个接受返回指针的指针变量
(0062) 	 uchar i,ad0[3];					  
(0063) 	 Board_init( );	  					//初始化开发板
    0172 DF1C      RCALL	_Board_init
    0173 C029      RJMP	0x019D
(0064) 	 while(1)
(0065) 	 {
(0066) 	  adpt=Num_BCD(Mega16_ad(0)/4);		//启动AD转换通道0,同时将数值转换成BCD码
    0174 2700      CLR	R16
    0175 DFB6      RCALL	_Mega16_ad
    0176 9516      LSR	R17
    0177 9507      ROR	R16
    0178 9516      LSR	R17
    0179 9507      ROR	R16
    017A DFD3      RCALL	_Num_BCD
    017B 01A8      MOVW	R20,R16
(0067) 	  for(i=0;i<3;i++)					//将转换后的BCD码存入显示数组
    017C 2766      CLR	R22
    017D C00C      RJMP	0x018A
(0068) 	  {
(0069) 	   ad0[i]=*(adpt+i);
    017E 2FE6      MOV	R30,R22
    017F 27FF      CLR	R31
    0180 0FE4      ADD	R30,R20
    0181 1FF5      ADC	R31,R21
    0182 8020      LDD	R2,0+Z
    0183 01CE      MOVW	R24,R28
    0184 2FE6      MOV	R30,R22
    0185 27FF      CLR	R31
    0186 0FE8      ADD	R30,R24
    0187 1FF9      ADC	R31,R25
    0188 8220      STD	R2,0+Z
    0189 9563      INC	R22
    018A 3063      CPI	R22,3
    018B F390      BCS	0x017E
(0070) 	  }
(0071) 	  for(i=0;i<3;i++)					//显示转换的数值
    018C 2766      CLR	R22
    018D C00D      RJMP	0x019B
(0072) 	  {
(0073) 	   One_smg_display(ad0[i],i+1);
    018E 2F26      MOV	R18,R22
    018F 5F2F      SUBI	R18,0xFF
    0190 01CE      MOVW	R24,R28
    0191 2FE6      MOV	R30,R22
    0192 27FF      CLR	R31
    0193 0FE8      ADD	R30,R24
    0194 1FF9      ADC	R31,R25
    0195 8100      LDD	R16,0+Z
    0196 DF1E      RCALL	_One_smg_display
(0074) 	   Delayms(2);	      
    0197 E002      LDI	R16,2
    0198 E010      LDI	R17,0
    0199 DEDF      RCALL	_Delayms
    019A 9563      INC	R22
    019B 3063      CPI	R22,3
    019C F388      BCS	0x018E
    019D CFD6      RJMP	0x0174
(0075) 	  }
(0076) 	 }
(0077) }FILE: <library>
    019E 9623      ADIW	R28,3
    019F 9508      RET
mod8u:
    01A0 9468      BSET	6
    01A1 C001      RJMP	xdiv8u
div8u:
    01A2 94E8      BCLR	6
xdiv8u:
    01A3 932A      ST	R18,-Y
    01A4 92FA      ST	R15,-Y
    01A5 24FF      CLR	R15
    01A6 E028      LDI	R18,0x8
    01A7 0F00      LSL	R16
    01A8 1CFF      ROL	R15
    01A9 16F1      CP	R15,R17
    01AA F010      BCS	0x01AD
    01AB 1AF1      SUB	R15,R17
    01AC 9503      INC	R16
    01AD 952A      DEC	R18
    01AE F7C1      BNE	0x01A7
    01AF F40E      BRTC	0x01B1
    01B0 2D0F      MOV	R16,R15
    01B1 90F9      LD	R15,Y+
    01B2 9129      LD	R18,Y+
    01B3 9508      RET
mod16u:
    01B4 9468      BSET	6
    01B5 C001      RJMP	xdiv16u
div16u:
    01B6 94E8      BCLR	6
xdiv16u:
    01B7 92EA      ST	R14,-Y
    01B8 92FA      ST	R15,-Y
    01B9 938A      ST	R24,-Y
    01BA 24EE      CLR	R14
    01BB 24FF      CLR	R15
    01BC E180      LDI	R24,0x10
    01BD 0F00      LSL	R16
    01BE 1F11      ROL	R17
    01BF 1CEE      ROL	R14
    01C0 1CFF      ROL	R15
    01C1 16E2      CP	R14,R18
    01C2 06F3      CPC	R15,R19
    01C3 F018      BCS	0x01C7
    01C4 1AE2      SUB	R14,R18
    01C5 0AF3      SBC	R15,R19
    01C6 9503      INC	R16
    01C7 958A      DEC	R24
    01C8 F7A1      BNE	0x01BD
    01C9 F416      BRTC	0x01CC
    01CA 2D0E      MOV	R16,R14
    01CB 2D1F      MOV	R17,R15
    01CC 9189      LD	R24,Y+
    01CD 90F9      LD	R15,Y+
    01CE 90E9      LD	R14,Y+
    01CF 9508      RET
mod16s:
    01D0 9468      BSET	6
    01D1 C001      RJMP	0x01D3
div16s:
    01D2 94E8      BCLR	6
    01D3 92DA      ST	R13,-Y
    01D4 2ED1      MOV	R13,R17
    01D5 26D3      EOR	R13,R19
    01D6 FF17      SBRS	R17,7
    01D7 C004      RJMP	0x01DC
    01D8 9510      COM	R17
    01D9 9500      COM	R16
    01DA 5F0F      SUBI	R16,0xFF
    01DB 4F1F      SBCI	R17,0xFF
    01DC FF37      SBRS	R19,7
    01DD C004      RJMP	0x01E2
    01DE 9530      COM	R19
    01DF 9520      COM	R18
    01E0 5F2F      SUBI	R18,0xFF
    01E1 4F3F      SBCI	R19,0xFF
    01E2 940E01B7  CALL	xdiv16u
    01E4 F036      BRTS	0x01EB
    01E5 FED7      SBRS	R13,7
    01E6 C004      RJMP	0x01EB
    01E7 9510      COM	R17
    01E8 9500      COM	R16
    01E9 5F0F      SUBI	R16,0xFF
    01EA 4F1F      SBCI	R17,0xFF
    01EB 90D9      LD	R13,Y+
    01EC 9508      RET
empy16s:
    01ED 920A      ST	R0,-Y
    01EE 921A      ST	R1,-Y
    01EF 938A      ST	R24,-Y
    01F0 939A      ST	R25,-Y
    01F1 9F02      MUL	R16,R18
    01F2 01C0      MOVW	R24,R0
    01F3 9F12      MUL	R17,R18
    01F4 0D90      ADD	R25,R0
    01F5 9F03      MUL	R16,R19
    01F6 0D90      ADD	R25,R0
    01F7 018C      MOVW	R16,R24
    01F8 9199      LD	R25,Y+
    01F9 9189      LD	R24,Y+
    01FA 9019      LD	R1,Y+
    01FB 9009      LD	R0,Y+
    01FC 9508      RET
push_gset1:
    01FD 935A      ST	R21,-Y
    01FE 934A      ST	R20,-Y
    01FF 9508      RET
pop_gset1:
    0200 E0E1      LDI	R30,1
pop:
    0201 9149      LD	R20,Y+
    0202 9159      LD	R21,Y+
    0203 FDE0      SBRC	R30,0
    0204 9508      RET
    0205 9169      LD	R22,Y+
    0206 9179      LD	R23,Y+
    0207 FDE1      SBRC	R30,1
    0208 9508      RET
    0209 90A9      LD	R10,Y+
    020A 90B9      LD	R11,Y+
    020B FDE2      SBRC	R30,2
    020C 9508      RET
    020D 90C9      LD	R12,Y+
    020E 90D9      LD	R13,Y+
    020F FDE3      SBRC	R30,3
    0210 9508      RET
    0211 90E9      LD	R14,Y+
    0212 90F9      LD	R15,Y+
    0213 9508      RET
push_gset2:
    0214 937A      ST	R23,-Y
    0215 936A      ST	R22,-Y
    0216 940C01FD  JMP	push_gset1
push_gset3:
    0218 92BA      ST	R11,-Y
    0219 92AA      ST	R10,-Y
    021A 940C0214  JMP	push_gset2
pop_gset2:
    021C E0E2      LDI	R30,2
    021D 940C0201  JMP	pop
pop_gset3:
    021F E0E4      LDI	R30,4
    0220 940C0201  JMP	pop
lsl8:
    0222 2311      TST	R17
    0223 F019      BEQ	0x0227
    0224 0F00      LSL	R16
    0225 951A      DEC	R17
    0226 CFFB      RJMP	lsl8
    0227 9508      RET

⌨️ 快捷键说明

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