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

📄 main.lst

📁 单片机中的ADC模块
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    0067 EFCF      LDI	R28,0xFF
    0068 E1D0      LDI	R29,0x10
    0069 BFCD      OUT	0x3D,R28
    006A BFDE      OUT	0x3E,R29
    006B 51C0      SUBI	R28,0x10
    006C 40D0      SBCI	R29,0
    006D EA0A      LDI	R16,0xAA
    006E 8308      STD	Y+0,R16
    006F 2400      CLR	R0
    0070 E0E0      LDI	R30,0
    0071 E0F1      LDI	R31,1
    0072 E011      LDI	R17,1
    0073 30E7      CPI	R30,7
    0074 07F1      CPC	R31,R17
    0075 F011      BEQ	0x0078
    0076 9201      ST	R0,Z+
    0077 CFFB      RJMP	0x0073
    0078 8300      STD	Z+0,R16
    0079 ECEE      LDI	R30,0xCE
    007A E0F0      LDI	R31,0
    007B E0A0      LDI	R26,0
    007C E0B1      LDI	R27,1
    007D E010      LDI	R17,0
    007E 3CEE      CPI	R30,0xCE
    007F 07F1      CPC	R31,R17
    0080 F021      BEQ	0x0085
    0081 95C8      LPM
    0082 9631      ADIW	R30,1
    0083 920D      ST	R0,X+
    0084 CFF9      RJMP	0x007E
    0085 940E0088  CALL	_main
_exit:
    0087 CFFF      RJMP	_exit
FILE: F:\芯生光盘资料\范例代码\ADC\main.c
(0001) //ICC-AVR application builder : 2007-8-13 15:05:41
(0002) // Target : M128
(0003) // Crystal: 7.3728Mhz
(0004) 
(0005) #include <iom128v.h>
(0006) #include <macros.h>
(0007) #include "port.h"
(0008) #include "adc.h"
(0009) #include "led.h"
(0010) 
(0011) 
(0012) /*call this routine to initialize all peripherals */
(0013) void main(void)
(0014) { 
(0015)   UNS8 i;
(0016)  //stop errant interrupts until set up
(0017)   CLI(); //disable all interrupts
_main:
  i                    --> Y+1
    0088 94F8      BCLR	7
(0018)   
(0019)   port_init();
    0089 940E009D  CALL	_port_init
(0020)   led_init(); //7段数码管显示
    008B 940E00C8  CALL	_led_init
(0021)   
(0022)   MCUCR = 0x00;//IO
    008D 2422      CLR	R2
    008E BE25      OUT	0x35,R2
(0023)  
(0024)   adc_init();
    008F 940E089C  CALL	_adc_init
(0025)  
(0026)  /*
(0027)  Set_Bit(PORTE,7);
(0028)  transmit_byte(0xaa);
(0029)  delay(10000);
(0030)  Clr_Bit(PORTE,7);
(0031)  */
(0032)  
(0033)  SEI(); //re-enable interrupts
    0091 9478      BSET	7
(0034)  //all peripherals are now initialized
(0035) 
(0036) 	 
(0037) for(;;)
(0038)   {  
(0039)    system_protect();
    0092 940E08C2  CALL	_system_protect
(0040)    display(adc0_value,0); //普通模式,显示countdata的值,countdata将在timer3定时一秒溢出时改变
    0094 2722      CLR	R18
    0095 91000105  LDS	R16,adc0_value
    0097 91100106  LDS	R17,adc0_value+1
    0099 940E00EE  CALL	_display
    009B CFF6      RJMP	0x0092
    009C 9508      RET
FILE: F:\芯生光盘资料\范例代码\ADC\port\port.c
(0001) #include <iom128v.h>
(0002) 
(0003) 
(0004) void port_init(void)//修改
(0005) {
(0006)  PORTA = 0x00;
_port_init:
    009D 2422      CLR	R2
    009E BA2B      OUT	0x1B,R2
(0007)  DDRA  = 0x00;
    009F BA2A      OUT	0x1A,R2
(0008)  PORTB = 0x00;
    00A0 BA28      OUT	0x18,R2
(0009)  DDRB  = 0x00;
    00A1 BA27      OUT	0x17,R2
(0010)  PORTC = 0x00;//m103 output only
    00A2 BA25      OUT	0x15,R2
(0011)  DDRC  = 0x00;
    00A3 BA24      OUT	0x14,R2
(0012)  PORTD = 0x00;
    00A4 BA22      OUT	0x12,R2
(0013)  DDRD  = 0x00;
    00A5 BA21      OUT	0x11,R2
(0014)  PORTE = 0x00;
    00A6 B823      OUT	0x03,R2
(0015)  DDRE  = 0x00;
    00A7 B822      OUT	0x02,R2
(0016)  PORTF = 0x00;//ADC1
    00A8 92200062  STS	0x62,R2
(0017)  DDRF  = 0x00;
    00AA 92200061  STS	0x61,R2
(0018)  PORTG = 0x00;
    00AC 92200065  STS	0x65,R2
(0019)  DDRG  = 0x00;
    00AE 92200064  STS	0x64,R2
    00B0 9508      RET
FILE: F:\芯生光盘资料\范例代码\ADC\4led\led.c
(0001) /**********************************
(0002) ** file_name led.c             **
(0003) ** describe  七段数码管函数        **
(0004) ** auther    芯生  **
(0005) ** Time      2007-12-14          **
(0006) ***********************************/
(0007) 
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "stdtypes.h"
(0011) #include "led.h"
(0012) 
(0013) //共阳极,LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
(0014) const led_data[16]={
(0015)       0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
(0016) 	    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
(0017) 	  };
(0018) 
(0019) /***********************
(0020) **8M时为 1000.25us
(0021) **4M时为 999.5us
(0022) **xtal 为晶振频率,单位为Mhz
(0023) ************************/
(0024) void delay_1ms(void)
(0025) {
(0026)  unsigned int i;
(0027)  for(i=200;i>0;i--)
_delay_1ms:
  i                    --> R16
    00B1 EC08      LDI	R16,0xC8
    00B2 E010      LDI	R17,0
    00B3 C002      RJMP	0x00B6
    00B4 5001      SUBI	R16,1
    00B5 4010      SBCI	R17,0
    00B6 3000      CPI	R16,0
    00B7 0701      CPC	R16,R17
    00B8 F7D9      BNE	0x00B4
    00B9 9508      RET
_delay_ms:
  i                    --> R20
  n                    --> R22
    00BA 940E0926  CALL	push_gset2
    00BC 01B8      MOVW	R22,R16
(0028)   ;
(0029) }
(0030) /***********************
(0031) **毫秒级延时
(0032) ************************/
(0033) void delay_ms(unsigned int n)
(0034) {
(0035)  unsigned int i;
(0036)  for(i=n;i>0;i--)
    00BD 01AB      MOVW	R20,R22
    00BE C003      RJMP	0x00C2
(0037)  delay_1ms();
    00BF DFF1      RCALL	_delay_1ms
    00C0 5041      SUBI	R20,1
    00C1 4050      SBCI	R21,0
    00C2 3040      CPI	R20,0
    00C3 0745      CPC	R20,R21
    00C4 F7D1      BNE	0x00BF
    00C5 940E091A  CALL	pop_gset2
    00C7 9508      RET
(0038) }
(0039) 	  	  
(0040) /***********************
(0041) ** 初始化对应端口为输出 
(0042) ** ABCD 和 abcdefg dpi 共12个IO口
(0043) ** 默认为 PD(4567) 和 PA(012345678)                                                                                                                                                                                                                                                                    
(0044) ***********************/
(0045) void led_init(void)
(0046) {
(0047)  led_ddr = 0xFF; //abcdefg dpi               各位设为输出
_led_init:
    00C8 EF8F      LDI	R24,0xFF
    00C9 BB8A      OUT	0x1A,R24
(0048)  led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
    00CA B381      IN	R24,0x11
    00CB 6F80      ORI	R24,0xF0
    00CC BB81      OUT	0x11,R24
(0049)  
(0050)  //初始化全灭
(0051)  led_port = 0xFF;
    00CD EF8F      LDI	R24,0xFF
    00CE BB8B      OUT	0x1B,R24
(0052)  led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
    00CF B382      IN	R24,0x12
    00D0 6F80      ORI	R24,0xF0
    00D1 BB82      OUT	0x12,R24
    00D2 9508      RET
_display_one:
  data                 --> R20
  count                --> R22
    00D3 940E0926  CALL	push_gset2
    00D5 2F42      MOV	R20,R18
    00D6 2F60      MOV	R22,R16
(0053) }
(0054) 
(0055) /***********************
(0056) ** 显示一位
(0057) ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
(0058) ************************/
(0059) void display_one(UNS8 count, UNS8 data)
(0060) {
(0061) 
(0062)  led_contrl_port &= ~(1<<count); //选中对应要显示的位,从右至左,4567
    00D7 E001      LDI	R16,1
    00D8 2F16      MOV	R17,R22
    00D9 940E095C  CALL	lsl8
    00DB 2E20      MOV	R2,R16
    00DC 9420      COM	R2
    00DD B232      IN	R3,0x12
    00DE 2032      AND	R3,R2
    00DF BA32      OUT	0x12,R3
(0063)  led_port = led_data[data];    //显示的数
    00E0 E082      LDI	R24,2
    00E1 9F84      MUL	R24,R20
    00E2 01F0      MOVW	R30,R0
    00E3 E88C      LDI	R24,0x8C
    00E4 E090      LDI	R25,0
    00E5 0FE8      ADD	R30,R24
    00E6 1FF9      ADC	R31,R25
    00E7 9005      LPM	R0,Z+
    00E8 9014      LPM	R1,0(Z)
    00E9 01F0      MOVW	R30,R0
    00EA BBEB      OUT	0x1B,R30
    00EB 940E091A  CALL	pop_gset2
    00ED 9508      RET
_display:
  temp                 --> R20
  mode                 --> R10
  data                 --> R22
    00EE 940E0924  CALL	push_gset3
    00F0 2EA2      MOV	R10,R18
    00F1 01B8      MOVW	R22,R16
(0064)  
(0065)  //如果对位进行了调整,就不在是4567,而是对应的值
(0066) }
(0067) 
(0068) /***********************
(0069) ** 显示四位整数
(0070) ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
(0071) ** 说明:可以小于四位数,mode=1时 自动补零
(0072) ************************/
(0073) void display(UNS16 data,UNS8 mode)
(0074) {
(0075) UNS8 temp;
(0076)  //千位
(0077)  if(data>=1000)
    00F2 3E68      CPI	R22,0xE8
    00F3 E0E3      LDI	R30,3
    00F4 077E      CPC	R23,R30
    00F5 F070      BCS	0x0104
(0078)  {//补零
(0079)    temp=data/1000;
    00F6 EE28      LDI	R18,0xE8
    00F7 E033      LDI	R19,3
    00F8 018B      MOVW	R16,R22
    00F9 940E0900  CALL	div16u
    00FB 2F40      MOV	R20,R16
(0080)    display_one(7,temp);
    00FC 2F24      MOV	R18,R20
    00FD E007      LDI	R16,7
    00FE DFD4      RCALL	_display_one
(0081)    delay_ms(6);  //6ms 是个经验值,刚好无闪烁,并且亮度较高
    00FF E006      LDI	R16,6
    0100 E010      LDI	R17,0
    0101 DFB8      RCALL	_delay_ms
(0082)    led_contrl_port |= (1<<7);
    0102 9A97      SBI	0x12,7
(0083)  
(0084)  }
    0103 C00A      RJMP	0x010E
(0085)  else
(0086)   {  if(mode==1)
    0104 2D8A      MOV	R24,R10
    0105 3081      CPI	R24,1
    0106 F439      BNE	0x010E
(0087)     {
(0088)     display_one(7,0);
    0107 2722      CLR	R18
    0108 E007      LDI	R16,7
    0109 DFC9      RCALL	_display_one
(0089)     delay_ms(6);
    010A E006      LDI	R16,6
    010B E010      LDI	R17,0
    010C DFAD      RCALL	_delay_ms
(0090)     led_contrl_port |= (1<<7);
    010D 9A97      SBI	0x12,7
(0091) 	}
(0092)   } 
(0093)  
(0094)  //百位
(0095)  if(data>=100)
    010E 3664      CPI	R22,0x64
    010F E0E0      LDI	R30,0
    0110 077E      CPC	R23,R30
    0111 F090      BCS	0x0124
(0096)  {
(0097)   temp=(data%1000)/100;
    0112 EE28      LDI	R18,0xE8
    0113 E033      LDI	R19,3
    0114 018B      MOVW	R16,R22
    0115 940E08FE  CALL	mod16u
    0117 E624      LDI	R18,0x64
    0118 E030      LDI	R19,0
    0119 940E0900  CALL	div16u
    011B 2F40      MOV	R20,R16
(0098)   display_one(6,temp);
    011C 2F24      MOV	R18,R20
    011D E006      LDI	R16,6
    011E DFB4      RCALL	_display_one
(0099)   delay_ms(6);
    011F E006      LDI	R16,6
    0120 E010      LDI	R17,0
    0121 DF98      RCALL	_delay_ms
(0100)   led_contrl_port |= (1<<6);
    0122 9A96      SBI	0x12,6
(0101)  }
    0123 C00A      RJMP	0x012E
(0102)  else
(0103)  {
(0104)   if(mode==1)
    0124 2D8A      MOV	R24,R10
    0125 3081      CPI	R24,1
    0126 F439      BNE	0x012E
(0105)   {
(0106)   display_one(6,0);
    0127 2722      CLR	R18
    0128 E006      LDI	R16,6
    0129 DFA9      RCALL	_display_one
(0107)   delay_ms(6);
    012A E006      LDI	R16,6
    012B E010      LDI	R17,0
    012C DF8D      RCALL	_delay_ms
(0108)   led_contrl_port |= (1<<6);
    012D 9A96      SBI	0x12,6
(0109)   }
(0110)  }
(0111)  //十位
(0112)  if(data>=10)
    012E 306A      CPI	R22,0xA
    012F E0E0      LDI	R30,0
    0130 077E      CPC	R23,R30
    0131 F090      BCS	0x0144
(0113)  {
(0114)   temp=(data%100)/10;
    0132 E624      LDI	R18,0x64
    0133 E030      LDI	R19,0
    0134 018B      MOVW	R16,R22
    0135 940E08FE  CALL	mod16u
    0137 E02A      LDI	R18,0xA
    0138 E030      LDI	R19,0
    0139 940E0900  CALL	div16u
    013B 2F40      MOV	R20,R16
(0115)   display_one(5,temp);
    013C 2F24      MOV	R18,R20
    013D E005      LDI	R16,5
    013E DF94      RCALL	_display_one
(0116)   delay_ms(6);
    013F E006      LDI	R16,6
    0140 E010      LDI	R17,0
    0141 DF78      RCALL	_delay_ms
(0117)   led_contrl_port |= (1<<5);
    0142 9A95      SBI	0x12,5
(0118)  }
    0143 C00A      RJMP	0x014E
(0119)  else
(0120)  {
(0121)   if(mode==1)
    0144 2D8A      MOV	R24,R10
    0145 3081      CPI	R24,1
    0146 F439      BNE	0x014E
(0122)   {
(0123)   display_one(5,0);
    0147 2722      CLR	R18
    0148 E005      LDI	R16,5
    0149 DF89      RCALL	_display_one
(0124)   delay_ms(6);
    014A E006      LDI	R16,6
    014B E010      LDI	R17,0
    014C DF6D      RCALL	_delay_ms
(0125)   led_contrl_port |= (1<<5);
    014D 9A95      SBI	0x12,5
(0126)   }
(0127)  }
(0128)  //个位
(0129)   temp=data%10;
    014E E02A      LDI	R18,0xA
    014F E030      LDI	R19,0
    0150 018B      MOVW	R16,R22
    0151 940E08FE  CALL	mod16u
    0153 2F40      MOV	R20,R16

⌨️ 快捷键说明

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