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

📄 test-adc.lst

📁 ATmega16内部ADC的应用:ATmega16内部集成了8路10位逐次逼近型模数转换器
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0142)    
(0143)    return bf;
    0107 9508      RET
_LCDReady:
  bf                   --> R20
    0108 940E02FD  CALL	push_gset1
(0144) }
(0145) void LCDReady(void)
(0146) {
(0147)    unsigned char bf;
(0148)    do
(0149)       {bf = BFRead();
    010A DFEC      RCALL	_BFRead
    010B 2F40      MOV	R20,R16
(0150) 	  //PORTA = bf;       //just for debug
(0151) 	  }
(0152)    while((bf&0x80)==0x80);
    010C 2E24      MOV	R2,R20
    010D 2433      CLR	R3
    010E FC27      SBRC	R2,7
    010F CFFA      RJMP	0x010A
(0153)    DataOut;
    0110 EF8F      LDI	R24,0xFF
    0111 BB87      OUT	0x17,R24
    0112 940E0300  CALL	pop_gset1
    0114 9508      RET
_CharWrite:
  data                 --> R20
    0115 940E02FD  CALL	push_gset1
    0117 2F40      MOV	R20,R16
(0154) }
(0155) void CharWrite(unsigned char data)
(0156) {
(0157)    LCDReady();
    0118 DFEF      RCALL	_LCDReady
(0158)    RS_1;
    0119 9A94      SBI	0x12,4
(0159)    RW_0;
    011A 9895      CBI	0x12,5
(0160)    DataLcd = data;   //
    011B BB48      OUT	0x18,R20
(0161)    delay250ns;
    011C 0000      NOP
    011D 0000      NOP
(0162)    EN_1;
    011E 9A97      SBI	0x12,7
(0163)    delay500ns;
    011F 0000      NOP
    0120 0000      NOP
    0121 0000      NOP
    0122 0000      NOP
(0164)    EN_0;
    0123 9897      CBI	0x12,7
(0165)    delay125ns; 
    0124 0000      NOP
(0166)    RS_0;
    0125 9894      CBI	0x12,4
(0167)    RW_1;
    0126 9A95      SBI	0x12,5
    0127 940E0300  CALL	pop_gset1
    0129 9508      RET
(0168) }
(0169) void LcdInit(void)
(0170) {
(0171)    LCDReady();
_LcdInit:
    012A DFDD      RCALL	_LCDReady
(0172)    FunctionSet();
    012B DFA5      RCALL	_FunctionSet
(0173)    LCDReady();
    012C DFDB      RCALL	_LCDReady
(0174)    DdramSet(0);
    012D 2700      CLR	R16
    012E DFB6      RCALL	_DdramSet
(0175)    LCDReady();
    012F DFD8      RCALL	_LCDReady
(0176)    VisionSet();
    0130 DF8F      RCALL	_VisionSet
(0177)    LCDReady();
    0131 DFD6      RCALL	_LCDReady
(0178)    InputSet();
    0132 DF7D      RCALL	_InputSet
(0179)    LCDReady();
    0133 DFD4      RCALL	_LCDReady
(0180)    ClearLcd();
    0134 DF58      RCALL	_ClearLcd
(0181)    LCDReady();
    0135 DFD2      RCALL	_LCDReady
(0182)    home();
    0136 DF69      RCALL	_home
(0183)    delay_us(10);
    0137 E00A      LDI	R16,0xA
    0138 E010      LDI	R17,0
    0139 940E0197  CALL	_delay_us
    013B 9508      RET
_CharsWrite:
  addr                 --> R22
  s                    --> R20
  addry                --> R12
  addrx                --> R10
    013C 940E02F7  CALL	push_gset4
    013E 2EC2      MOV	R12,R18
    013F 2EA0      MOV	R10,R16
    0140 8548      LDD	R20,Y+8
    0141 8559      LDD	R21,Y+9
(0184) }
(0185) void CharsWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
(0186) {
(0187)    unsigned char addr;
(0188)    if (addry==1)
    0142 2D8C      MOV	R24,R12
    0143 3081      CPI	R24,1
    0144 F411      BNE	0x0147
(0189)    {
(0190)       addr = addrx;
    0145 2D6A      MOV	R22,R10
(0191)    }
    0146 C007      RJMP	0x014E
(0192)    else if (addry==2)
    0147 2D8C      MOV	R24,R12
    0148 3082      CPI	R24,2
    0149 F419      BNE	0x014D
(0193)    {
(0194)       addr = (addrx+0x40);
    014A 2D6A      MOV	R22,R10
    014B 5C60      SUBI	R22,0xC0
(0195)    }
    014C C001      RJMP	0x014E
(0196)    else
(0197)    {
(0198)       addr = 0;
    014D 2766      CLR	R22
(0199)    }
(0200)    DdramSet(0);     //初始化ddram地址
    014E 2700      CLR	R16
    014F DF95      RCALL	_DdramSet
(0201)    LCDReady();
    0150 DFB7      RCALL	_LCDReady
(0202)    DdramSet(addr);  //设定ddram地址
    0151 2F06      MOV	R16,R22
    0152 DF92      RCALL	_DdramSet
(0203)    delay_us(80);
    0153 E500      LDI	R16,0x50
    0154 E010      LDI	R17,0
    0155 940E0197  CALL	_delay_us
    0157 C009      RJMP	0x0161
(0204)    while(*s)
(0205)    {
(0206)      CharWrite(*s);
    0158 01FA      MOVW	R30,R20
    0159 8100      LDD	R16,Z+0
    015A DFBA      RCALL	_CharWrite
(0207) 	 s++;
    015B 5F4F      SUBI	R20,0xFF
    015C 4F5F      SBCI	R21,0xFF
(0208) 	 delay_us(80);   //等待写入操作完成
    015D E500      LDI	R16,0x50
    015E E010      LDI	R17,0
    015F 940E0197  CALL	_delay_us
    0161 01FA      MOVW	R30,R20
    0162 8020      LDD	R2,Z+0
    0163 2022      TST	R2
    0164 F799      BNE	0x0158
    0165 940E02F2  CALL	pop_gset4
    0167 9508      RET
_DataWrite:
  addr                 --> R22
  s                    --> R20
  addry                --> R12
  addrx                --> R10
    0168 940E02F7  CALL	push_gset4
    016A 2EC2      MOV	R12,R18
    016B 2EA0      MOV	R10,R16
    016C 8548      LDD	R20,Y+8
    016D 8559      LDD	R21,Y+9
(0209)    }
(0210) }
(0211) void DataWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
(0212) {
(0213)    unsigned char addr;
(0214)    if (addry==1)
    016E 2D8C      MOV	R24,R12
    016F 3081      CPI	R24,1
    0170 F411      BNE	0x0173
(0215)    {
(0216)       addr = addrx;
    0171 2D6A      MOV	R22,R10
(0217)    }
    0172 C007      RJMP	0x017A
(0218)    else if (addry==2)
    0173 2D8C      MOV	R24,R12
    0174 3082      CPI	R24,2
    0175 F419      BNE	0x0179
(0219)    {
(0220)       addr = (addrx+0x40);
    0176 2D6A      MOV	R22,R10
    0177 5C60      SUBI	R22,0xC0
(0221)    }
    0178 C001      RJMP	0x017A
(0222)    else
(0223)    {
(0224)       addr = 0;
    0179 2766      CLR	R22
(0225)    }
(0226)    DdramSet(0);     //初始化ddram地址
    017A 2700      CLR	R16
    017B DF69      RCALL	_DdramSet
(0227)    LCDReady();
    017C DF8B      RCALL	_LCDReady
(0228)    DdramSet(addr);  //设定ddram地址
    017D 2F06      MOV	R16,R22
    017E DF66      RCALL	_DdramSet
(0229)    delay_us(80);
    017F E500      LDI	R16,0x50
    0180 E010      LDI	R17,0
    0181 940E0197  CALL	_delay_us
    0183 C00A      RJMP	0x018E
(0230)    while(*s!=0XFF)
(0231)    {
(0232)      CharWrite((*s)+0x30);
    0184 01FA      MOVW	R30,R20
    0185 8100      LDD	R16,Z+0
    0186 5D00      SUBI	R16,0xD0
    0187 DF8D      RCALL	_CharWrite
(0233) 	 s++;
    0188 5F4F      SUBI	R20,0xFF
    0189 4F5F      SBCI	R21,0xFF
(0234) 	 delay_us(80);   //等待写入操作完成
    018A E500      LDI	R16,0x50
    018B E010      LDI	R17,0
    018C 940E0197  CALL	_delay_us
    018E 01FA      MOVW	R30,R20
    018F 8180      LDD	R24,Z+0
    0190 3F8F      CPI	R24,0xFF
    0191 F791      BNE	0x0184
    0192 940E02F2  CALL	pop_gset4
    0194 9508      RET
FILE: F:\radio\第十一篇\test-adc\delay.c
(0001) /*时钟为8MHZ*/
(0002) void delay_1us(void)
(0003) {
(0004)    asm("nop");
_delay_1us:
    0195 0000      NOP
    0196 9508      RET
_delay_us:
  itemp                --> R20
  itimes               --> R22
    0197 940E02FB  CALL	push_gset2
    0199 01B8      MOVW	R22,R16
(0005) }
(0006) void delay_us(unsigned int itimes)
(0007) {
(0008)    unsigned int itemp;
(0009)    for (itemp=0;itemp<itimes;itemp++)
    019A 2744      CLR	R20
    019B 2755      CLR	R21
    019C C003      RJMP	0x01A0
(0010)       {
(0011) 	     delay_1us();
    019D DFF7      RCALL	_delay_1us
    019E 5F4F      SUBI	R20,0xFF
    019F 4F5F      SBCI	R21,0xFF
    01A0 1746      CP	R20,R22
    01A1 0757      CPC	R21,R23
    01A2 F3D0      BCS	0x019D
    01A3 940E02EF  CALL	pop_gset2
    01A5 9508      RET
(0012) 	  }
(0013) }
(0014) void delay_1ms(void)
(0015) {
(0016)    unsigned int itemp;
(0017)    for(itemp=1;itemp<1142;itemp++);
_delay_1ms:
  itemp                --> R16
    01A6 E001      LDI	R16,1
    01A7 E010      LDI	R17,0
    01A8 C002      RJMP	0x01AB
    01A9 5F0F      SUBI	R16,0xFF
    01AA 4F1F      SBCI	R17,0xFF
    01AB 3706      CPI	R16,0x76
    01AC E0E4      LDI	R30,4
    01AD 071E      CPC	R17,R30
    01AE F3D0      BCS	0x01A9
    01AF 9508      RET
_delay_ms:
  itemp                --> R20
  itimes               --> R22
    01B0 940E02FB  CALL	push_gset2
    01B2 01B8      MOVW	R22,R16
(0018) }
(0019) void delay_ms(unsigned int itimes)
(0020) {
(0021)    unsigned int itemp;
(0022)    for (itemp=0;itemp<itimes;itemp++)
    01B3 2744      CLR	R20
    01B4 2755      CLR	R21
    01B5 C003      RJMP	0x01B9
(0023)       {
(0024) 	     delay_1ms();
    01B6 DFEF      RCALL	_delay_1ms
    01B7 5F4F      SUBI	R20,0xFF
    01B8 4F5F      SBCI	R21,0xFF
    01B9 1746      CP	R20,R22
    01BA 0757      CPC	R21,R23
    01BB F3D0      BCS	0x01B6
    01BC 940E02EF  CALL	pop_gset2
    01BE 9508      RET
FILE: F:\radio\第十一篇\test-adc\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "lcd.h"
(0004) #include "usart.h"
(0005) #include "delay.h"
(0006) #define vref   256
(0007) volatile unsigned int extint_count=0;
(0008) volatile unsigned char act_flag=0;
(0009) volatile unsigned int adc_result;
(0010) unsigned char adc_show[6];
(0011) /** /
(0012) volatile:数据类型声明,表明该变量在程序执行中可被隐含改变
(0013) 编译器有时会将SRAM中的数据拷贝到通用寄存器中以提高程序的执行效率
(0014) (在通用寄存器中对数据的操作速度比操作SRAM中的数据要快),这样会带来
(0015) 一个问题,如果该SRAM中的数据已经被隐含改变(比如中断),那么编译器仍然
(0016) 读取寄存器中之前的SRAM拷贝值显然与其实际值不同,从而出现错误。
(0017) 本例中extint_count的值在外部中断服务程序中被改变,通过volatile
(0018) 声明通知编译器。
(0019) /**/
(0020) void port_init(void)
(0021) {
(0022)  PORTA = 0xFE;
_port_init:
    01BF EF8E      LDI	R24,0xFE
    01C0 BB8B      OUT	0x1B,R24
(0023)  DDRA  = 0xFE;
    01C1 BB8A      OUT	0x1A,R24
(0024)  PORTB = 0xFF;
    01C2 EF8F      LDI	R24,0xFF
    01C3 BB88      OUT	0x18,R24
(0025)  DDRB  = 0xFF;
    01C4 BB87      OUT	0x17,R24
(0026)  PORTC = 0xFF; 
    01C5 BB85      OUT	0x15,R24
(0027)  DDRC  = 0xFF;
    01C6 BB84      OUT	0x14,R24
(0028)  DDRD  = 0xFB;  //PD2(INT0)引脚设置为输入
    01C7 EF8B      LDI	R24,0xFB
    01C8 BB81      OUT	0x11,R24
(0029)  PORTD = 0xFB;  //关闭内部上拉
    01C9 BB82      OUT	0x12,R24
    01CA 9508      RET
_adc_isr:
  temp                 --> R16
    01CB 922A      ST	R2,-Y
    01CC 923A      ST	R3,-Y
    01CD 930A      ST	R16,-Y
    01CE 931A      ST	R17,-Y
    01CF 93EA      ST	R30,-Y
    01D0 B62F      IN	R2,0x3F
    01D1 922A      ST	R2,-Y
(0030) }
(0031) /*      AD转换程序     */
(0032) #pragma interrupt_handler adc_isr:15
(0033) void adc_isr(void)
(0034) {
(0035)    unsigned int temp=0;
    01D2 2700      CLR	R16
    01D3 2711      CLR	R17
    01D4 C002      RJMP	0x01D7
(0036)    while(temp<6)
(0037)       temp++;                //短延时
    01D5 5F0F      SUBI	R16,0xFF
    01D6 4F1F      SBCI	R17,0xFF
    01D7 3006      CPI	R16,6
    01D8 E0E0      LDI	R30,0
    01D9 071E      CPC	R17,R30
    01DA F3D0      BCS	0x01D5
(0038)    adc_result = ADC;         //读取AD转换值
    01DB B024      IN	R2,0x04
    01DC B035      IN	R3,0x05
    01DD 9230007C  STS	adc_result+1,R3
    01DF 9220007B  STS	adc_result,R2
(0039) 	   
(0040)    ADCSRA |= (1<<ADSC);      //再次启动转换 			 	 		 
    01E1 9A36      SBI	0x06,6
    01E2 9029      LD	R2,Y+
    01E3 BE2F      OUT	0x3F,R2
    01E4 91E9      LD	R30,Y+
    01E5 9119      LD	R17,Y+
    01E6 9109      LD	R16,Y+
    01E7 9039      LD	R3,Y+
    01E8 9029      LD	R2,Y+
    01E9 9518      RETI
_data_con:
  i                    --> R10
  temp                 --> R12
    01EA 940E02F7  CALL	push_gset4
(0041) } 
(0042) void data_con(void)
(0043) {
(0044)    unsigned int temp;
(0045)    unsigned char i;
(0046)    temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
    01EC 9020007B  LDS	R2,adc_result
    01EE 9030007C  LDS	R3,adc_result+1
    01F0 2444      CLR	R4
    01F1 2455      CLR	R5
    01F2 E040      LDI	R20,0
    01F3 E051      LDI	R21,1
    01F4 E060      LDI	R22,0
    01F5 E070      LDI	R23,0
    01F6 925A      ST	R5,-Y

⌨️ 快捷键说明

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