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

📄 adc.lst

📁 较新的adc+lcd1602代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
_LCD_write_data:
  fuhao                --> R22
  data                 --> Y,+0
  i                    --> R20
  dat                  --> R20
  Y                    --> R12
  X                    --> R10
     150 940E 02D4 CALL	push_xgsetF03C
     152 2EC2      MOV	R12,R18
     153 2EA0      MOV	R10,R16
     154 9725      SBIW	R28,5
     155 854D      LDD	R20,Y+13
     156 855E      LDD	R21,Y+14
(0129)  }
(0130) }
(0131) 
(0132) /*-------------------------------------------------------------
(0133) 函数: 写数字
(0134) 参数:列---X=0~15,行---Y=0~1 写地址
(0135)       dat为所要写的数字
(0136) ---------------------------------------------------------------*/
(0137) void LCD_write_data(unsigned char X,unsigned char Y,int dat)
(0138) {
(0139)  unsigned char fuhao;
(0140)  unsigned char data[5];
(0141)  unsigned char i;
(0142)   
(0143)  if(dat<0)
     157 3040      CPI	R20,0
     158 E0E0      LDI	R30,0
     159 075E      CPC	R21,R30
     15A F43C      BGE	0x0162
(0144)  {
(0145)   fuhao='-';
     15B E26D      LDI	R22,0x2D
(0146)   dat=0-dat;
     15C 2422      CLR	R2
     15D 2433      CLR	R3
     15E 1A24      SUB	R2,R20
     15F 0A35      SBC	R3,R21
     160 01A1      MOVW	R20,R2
(0147)  }
     161 C001      RJMP	0x0163
(0148)  else
(0149)   fuhao=' ';
     162 E260      LDI	R22,0x20
(0150)  data[0]=fuhao;
     163 8368      STD	Y+0,R22
(0151)  data[1]=dat/1000+0x30; dat%=1000;
     164 EE28      LDI	R18,0xE8
     165 E033      LDI	R19,3
     166 018A      MOVW	R16,R20
     167 940E 026E CALL	div16s
     169 01C8      MOVW	R24,R16
     16A 96C0      ADIW	R24,0x30
     16B 8389      STD	Y+1,R24
     16C EE28      LDI	R18,0xE8
     16D E033      LDI	R19,3
     16E 018A      MOVW	R16,R20
     16F 940E 026A CALL	mod16s
     171 01A8      MOVW	R20,R16
(0152)  data[2]=dat/100+0x30;  dat%=100;
     172 E624      LDI	R18,0x64
     173 E030      LDI	R19,0
     174 940E 026E CALL	div16s
     176 01C8      MOVW	R24,R16
     177 96C0      ADIW	R24,0x30
     178 838A      STD	Y+2,R24
     179 E624      LDI	R18,0x64
     17A E030      LDI	R19,0
     17B 018A      MOVW	R16,R20
     17C 940E 026A CALL	mod16s
     17E 01A8      MOVW	R20,R16
(0153)  data[3]=dat/10+0x30; 
     17F E02A      LDI	R18,0xA
     180 E030      LDI	R19,0
     181 940E 026E CALL	div16s
     183 01C8      MOVW	R24,R16
     184 96C0      ADIW	R24,0x30
     185 838B      STD	Y+3,R24
(0154)  data[4]=dat%10+0x30; 
     186 E02A      LDI	R18,0xA
     187 E030      LDI	R19,0
     188 018A      MOVW	R16,R20
     189 940E 026A CALL	mod16s
     18B 01C8      MOVW	R24,R16
     18C 96C0      ADIW	R24,0x30
     18D 838C      STD	Y+4,R24
(0155)  
(0156)  LCD_set_xy(X,Y);
     18E 2D2C      MOV	R18,R12
     18F 2D0A      MOV	R16,R10
     190 DF21      RCALL	_LCD_set_xy
(0157)  for(i=0;i<5;i++)
     191 2744      CLR	R20
     192 C00B      RJMP	0x019E
(0158)   LCD_write_char(0,data[i]);
     193 01CE      MOVW	R24,R28
     194 2FE4      MOV	R30,R20
     195 27FF      CLR	R31
     196 0FE8      ADD	R30,R24
     197 1FF9      ADC	R31,R25
     198 8120      LDD	R18,Z+0
     199 2733      CLR	R19
     19A 2700      CLR	R16
     19B 2711      CLR	R17
     19C DF2D      RCALL	_LCD_write_char
     19D 9543      INC	R20
     19E 3045      CPI	R20,5
     19F F398      BCS	0x0193
     1A0 9625      ADIW	R28,5
     1A1 940C 02DD JMP	pop_xgsetF03C
_LCD_write_adc:
  data                 --> Y,+0
  i                    --> R20
  dat                  --> R14
  Y                    --> R12
  X                    --> R10
     1A3 940E 02AF CALL	push_xgset30FC
     1A5 2EC2      MOV	R12,R18
     1A6 2EA0      MOV	R10,R16
     1A7 9725      SBIW	R28,5
     1A8 84ED      LDD	R14,Y+13
     1A9 84FE      LDD	R15,Y+14
(0159) }
(0160) 
(0161) /*-------------------------------------------------------------
(0162) 函数: 写数字
(0163) 参数:列---X=0~15,行---Y=0~1 写地址
(0164)       dat为所要写的数字
(0165) ---------------------------------------------------------------*/
(0166) void LCD_write_adc(unsigned char X,unsigned char Y,int dat)
(0167) {
(0168)  unsigned char data[5];
(0169)  unsigned char i;
(0170) 
(0171)  dat*=4.928; 
     1AA E504      LDI	R16,0x54
     1AB E010      LDI	R17,0
     1AC 940E 02EF CALL	lpm32
     1AE 0118      MOVW	R2,R16
     1AF 0129      MOVW	R4,R18
     1B0 0187      MOVW	R16,R14
     1B1 940E 0331 CALL	int2fp
     1B3 933A      ST	R19,-Y
     1B4 932A      ST	R18,-Y
     1B5 931A      ST	R17,-Y
     1B6 930A      ST	R16,-Y
     1B7 0181      MOVW	R16,R2
     1B8 0192      MOVW	R18,R4
     1B9 940E 0427 CALL	fpmule2
     1BB 940E 0303 CALL	fpint
     1BD 0178      MOVW	R14,R16
(0172)  data[0]=dat/1000+0x30; dat%=1000;
     1BE EE28      LDI	R18,0xE8
     1BF E033      LDI	R19,3
     1C0 940E 026E CALL	div16s
     1C2 01C8      MOVW	R24,R16
     1C3 96C0      ADIW	R24,0x30
     1C4 8388      STD	Y+0,R24
     1C5 EE28      LDI	R18,0xE8
     1C6 E033      LDI	R19,3
     1C7 0187      MOVW	R16,R14
     1C8 940E 026A CALL	mod16s
     1CA 0178      MOVW	R14,R16
(0173)  data[1]='.';
     1CB E28E      LDI	R24,0x2E
     1CC 8389      STD	Y+1,R24
(0174)  data[2]=dat/100+0x30;  dat%=100;
     1CD E624      LDI	R18,0x64
     1CE E030      LDI	R19,0
     1CF 940E 026E CALL	div16s
     1D1 01C8      MOVW	R24,R16
     1D2 96C0      ADIW	R24,0x30
     1D3 838A      STD	Y+2,R24
     1D4 E624      LDI	R18,0x64
     1D5 E030      LDI	R19,0
     1D6 0187      MOVW	R16,R14
     1D7 940E 026A CALL	mod16s
     1D9 0178      MOVW	R14,R16
(0175)  data[3]=dat/10+0x30;   
     1DA E02A      LDI	R18,0xA
     1DB E030      LDI	R19,0
     1DC 940E 026E CALL	div16s
     1DE 01C8      MOVW	R24,R16
     1DF 96C0      ADIW	R24,0x30
     1E0 838B      STD	Y+3,R24
(0176)  data[4]=dat%10+0x30; 
     1E1 E02A      LDI	R18,0xA
     1E2 E030      LDI	R19,0
     1E3 0187      MOVW	R16,R14
     1E4 940E 026A CALL	mod16s
     1E6 01C8      MOVW	R24,R16
     1E7 96C0      ADIW	R24,0x30
     1E8 838C      STD	Y+4,R24
(0177)  
(0178)  LCD_set_xy(X,Y);
     1E9 2D2C      MOV	R18,R12
     1EA 2D0A      MOV	R16,R10
     1EB DEC6      RCALL	_LCD_set_xy
(0179)  for(i=0;i<5;i++)
     1EC 2744      CLR	R20
     1ED C00B      RJMP	0x01F9
(0180)   LCD_write_char(0,data[i]);
     1EE 01CE      MOVW	R24,R28
     1EF 2FE4      MOV	R30,R20
     1F0 27FF      CLR	R31
     1F1 0FE8      ADD	R30,R24
     1F2 1FF9      ADC	R31,R25
     1F3 8120      LDD	R18,Z+0
     1F4 2733      CLR	R19
     1F5 2700      CLR	R16
     1F6 2711      CLR	R17
     1F7 DED2      RCALL	_LCD_write_char
     1F8 9543      INC	R20
     1F9 3045      CPI	R20,5
     1FA F398      BCS	0x01EE
     1FB 9625      ADIW	R28,5
     1FC 940C 02A4 JMP	pop_xgset30FC
FILE: D:\iccavr\mega16\11\10bit_adc\adc.h
(0001) 
(0002) /******************************************************
(0003) **                  ADC转换初始化                    **
(0004) ******************************************************/
(0005) void adc_init(unsigned char adc_channel) 
(0006) { 
(0007)   PORTA&=~(BIT(PA0)|BIT(PA1));
_adc_init:
  adc_channel          --> R16
     1FE B38B      IN	R24,0x1B
     1FF 7F8C      ANDI	R24,0xFC
     200 BB8B      OUT	0x1B,R24
(0008)   DDRA&=~(BIT(PA0)|BIT(PA1));
     201 B38A      IN	R24,0x1A
     202 7F8C      ANDI	R24,0xFC
     203 BB8A      OUT	0x1A,R24
(0009)   ACSR=0x80; 
     204 E880      LDI	R24,0x80
     205 B988      OUT	0x08,R24
(0010)   ADMUX=(0<<REFS1)|(1<<REFS0)|adc_channel; 
     206 2F80      MOV	R24,R16
     207 6480      ORI	R24,0x40
     208 B987      OUT	0x07,R24
(0011)   ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0); 
     209 E880      LDI	R24,0x80
     20A B986      OUT	0x06,R24
     20B 9508      RET
_GetAdcValue:
  i                    --> R20
  adc_value            --> R10
  temp                 --> R12
  adc_channel          --> R12
     20C 940E 02C6 CALL	push_xgset303C
     20E 2EC0      MOV	R12,R16
(0012) }
(0013) 
(0014) /******************************************************
(0015) **             取通道adc_channel的ADC值              **
(0016) ******************************************************/
(0017) unsigned int GetAdcValue(unsigned char adc_channel) 
(0018) { 
(0019)  unsigned int adc_value=0; //定义全局变量来存储ADC值
     20F 24AA      CLR	R10
     210 24BB      CLR	R11
(0020)  unsigned int temp; 
(0021)  unsigned char i; 
(0022) 
(0023)  adc_init(adc_channel); 
     211 2D0C      MOV	R16,R12
     212 DFEB      RCALL	_adc_init
(0024)  delay_nms(30); 
     213 E10E      LDI	R16,0x1E
     214 E010      LDI	R17,0
     215 DE6E      RCALL	_delay_nms
(0025)  
(0026)  for(i=0;i<19;i++) 
     216 2744      CLR	R20
     217 C010      RJMP	0x0228
(0027)  { 
(0028)   ADCSRA|=(1<<ADSC); 
     218 9A36      SBI	0x06,6
(0029)   while((ADCSRA&0x10)==0); 
     219 9B34      SBIS	0x06,4
     21A CFFE      RJMP	0x0219
(0030)   temp=ADCL; 
     21B B0C4      IN	R12,0x04
     21C 24DD      CLR	R13
(0031)   temp|=(int)ADCH<<8; 
     21D B025      IN	R2,0x05
     21E 2433      CLR	R3
     21F 2C32      MOV	R3,R2
     220 2422      CLR	R2
     221 28C2      OR	R12,R2
     222 28D3      OR	R13,R3
(0032)   adc_value=adc_value+temp; 
     223 0CAC      ADD	R10,R12
     224 1CBD      ADC	R11,R13
(0033)   ADCSR|=(0<<ADSC);
     225 B026      IN	R2,0x06
     226 B826      OUT	0x06,R2
     227 9543      INC	R20
     228 3143      CPI	R20,0x13
     229 F370      BCS	0x0218
(0034)  } 
(0035) 
(0036)  adc_value=adc_value/19;
     22A E123      LDI	R18,0x13
     22B E030      LDI	R19,0
     22C 0185      MOVW	R16,R10
     22D 940E 028A CALL	div16u
     22F 0158      MOVW	R10,R16
(0037)  return adc_value; 
     230 940C 02CD JMP	pop_xgset303C
FILE: D:\iccavr\mega16\11\10bit_adc\test.c
(0001) //ICC-AVR application builder : 2008-11-4 12:53:50
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) #include "delay.h"
(0009) #include "lcd1602.h"
(0010) #include "adc.h"
(0011) //call this routine to initialize all peripherals
(0012) void init_devices(void)
(0013) {
(0014)  //stop errant interrupts until set up
(0015)  CLI(); //disable all interrupts
_init_devices:
     232 94F8      BCLR	7
(0016)  LCD_init();
     233 DE5F      RCALL	_LCD_init
(0017)  PORTD|=BIT(PD7);
     234 9A97      SBI	0x12,7
(0018)  DDRD|=BIT(PD7);
     235 9A8F      SBI	0x11,7
(0019)  
(0020)  MCUCR = 0x00;
     236 2422      CLR	R2
     237 BE25      OUT	0x35,R2
(0021)  GICR  = 0x00;
     238 BE2B      OUT	0x3B,R2
(0022)  TIMSK = 0x00; //timer interrupt sources
     239 BE29      OUT	0x39,R2
(0023)  SEI(); //re-enable interrupts
     23A 9478      BSET	7
     23B 9508      RET
_main:
  adc1                 --> R10
  adc0                 --> R10
     23C 9722      SBIW	R28,2
(0024)  //all peripherals are now initialized
(0025) }
(0026) 
(0027) //
(0028) void main(void)
(0029) {
(0030)  unsigned int adc0,adc1;
(0031)  init_devices();
     23D DFF4      RCALL	_init_devices
(0032)  //insert your functional code here...
(0033)  LCD_write_string(0,0,"10_Bit ADC Test!");
     23E E882      LDI	R24,0x82
     23F E090      LDI	R25,0
     240 8399      STD	Y+1,R25
     241 8388      STD	Y+0,R24
     242 2722      CLR	R18
     243 2700      CLR	R16
     244 DEF3      RCALL	_LCD_write_string
(0034)  delay_nms(2000);
     245 ED00      LDI	R16,0xD0
     246 E017      LDI	R17,7
     247 DE3C      RCALL	_delay_nms
(0035)  LCD_write_string(0,0," ADC0:      V   ");
     248 E781      LDI	R24,0x71
     249 E090      LDI	R25,0
     24A 8399      STD	Y+1,R25
     24B 8388      STD	Y+0,R24
     24C 2722      CLR	R18
     24D 2700      CLR	R16
     24E DEE9      RCALL	_LCD_write_string
(0036)  LCD_write_string(0,1," ADC1:      V   ");
     24F E680      LDI	R24,0x60
     250 E090      LDI	R25,0
     251 8399      STD	Y+1,R25
     252 8388      STD	Y+0,R24
     253 E021      LDI	R18,1
     254 2700      CLR	R16
     255 DEE2      RCALL	_LCD_write_string
     256 C010      RJMP	0x0267
(0037)  while(1)
(0038)  {
(0039)   adc0=GetAdcValue(0);
     257 2700      CLR	R16
     258 DFB3      RCALL	_GetAdcValue
     259 0158      MOVW	R10,R16
(0040)   LCD_write_adc(7,0,adc0);
     25A 82B9      STD	Y+1,R11
     25B 82A8      STD	Y+0,R10
     25C 2722      CLR	R18
     25D E007      LDI	R16,7
     25E DF44      RCALL	_LCD_write_adc
(0041)   
(0042)   adc1=GetAdcValue(1);
     25F E001      LDI	R16,1
     260 DFAB      RCALL	_GetAdcValue
     261 0158      MOVW	R10,R16
(0043)   LCD_write_adc(7,1,adc1);
FILE: <library>
     262 82B9      STD	Y+1,R11
     263 82A8      STD	Y+0,R10
     264 E021      LDI	R18,1
     265 E007      LDI	R16,7
     266 DF3C      RCALL	_LCD_write_adc
     267 CFEF      RJMP	0x0257
     268 9622      ADIW	R28,2
     269 9508      RET
mod16s:
     26A 9468      BSET	6
     26B 92DA      ST	R13,-Y
     26C 2ED1      MOV	R13,R17
     26D C004      RJMP	0x0272
div16s:
     26E 94E8      BCLR	6
     26F 92DA      ST	R13,-Y
     270 2ED1      MOV	R13,R17
     271 26D3      EOR	R13,R19
     272 FF17      SBRS	R17,7
     273 C004      RJMP	0x0278
     274 9510      COM	R17
     275 9500      COM	R16
     276 5F0F      SUBI	R16,0xFF
     277 4F1F      SBCI	R17,0xFF
     278 FF37      SBRS	R19,7
     279 C004      RJMP	0x027E
     27A 9530      COM	R19
     27B 9520      COM	R18
     27C 5F2F      SUBI	R18,0xFF
     27D 4F3F      SBCI	R19,0xFF
     27E 940E 028B CALL	xdiv16u
     280 FED7      SBRS	R13,7
     281 C004      RJMP	0x0286
     282 9510      COM	R17
     283 9500      COM	R16
     284 5F0F      SUBI	R16,0xFF
     285 4F1F      SBCI	R17,0xFF
     286 90D9      LD	R13,Y+
     287 9508      RET

⌨️ 快捷键说明

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