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

📄 008.lst

📁 AVR单片机的AD操作
💻 LST
字号:
__start:
__text_start:
    0035 E5CF      LDI	R28,0x5F
    0036 E0D4      LDI	R29,4
    0037 BFCD      OUT	0x3D,R28
    0038 BFDE      OUT	0x3E,R29
    0039 51C0      SUBI	R28,0x10
    003A 40D0      SBCI	R29,0
    003B EA0A      LDI	R16,0xAA
    003C 8308      STD	Y+0,R16
    003D 2400      CLR	R0
    003E E7E5      LDI	R30,0x75
    003F E0F0      LDI	R31,0
    0040 E010      LDI	R17,0
    0041 37E6      CPI	R30,0x76
    0042 07F1      CPC	R31,R17
    0043 F011      BEQ	0x0046
    0044 9201      ST	R0,Z+
    0045 CFFB      RJMP	0x0041
    0046 8300      STD	Z+0,R16
    0047 E5E4      LDI	R30,0x54
    0048 E0F0      LDI	R31,0
    0049 E6A0      LDI	R26,0x60
    004A E0B0      LDI	R27,0
    004B E010      LDI	R17,0
    004C 36E9      CPI	R30,0x69
    004D 07F1      CPC	R31,R17
    004E F021      BEQ	0x0053
    004F 95C8      LPM
    0050 9631      ADIW	R30,1
    0051 920D      ST	R0,X+
    0052 CFF9      RJMP	0x004C
    0053 940E0065  CALL	_main
_exit:
    0055 CFFF      RJMP	_exit
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    0056 940E0127  CALL	push_gset2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\008-AD-LED\main.c
(0001) /*
(0002) 实验八:
(0003) 	AD转换实验。
(0004) 	1、AD转换实验。程序进行周期AD转换,在并转换值显示在数码管上。
(0005) 	2、使用内部1 M晶振。
(0006) 	3、进行此实验需要插上:JP1的所有8个短路块、JP9(A/D)。
(0007) 	4、此实验采用项目化管理,主要文件有ADC、DISP、主程序。
(0008) 
(0009) 	AVR  mega16学习板
(0010) 	www.iccavr.com
(0011) 	2006-04-05
(0012) */
(0013) 
(0014) #include "iom16v.h"
(0015) #include <macros.h>
(0016) 
(0017) extern unsigned char get_ad(void);/*AD采样函数*/
(0018) extern void Disp_Init(void);/*显示初始化*/
(0019) extern unsigned char led_buf[];/*显示缓存*/
(0020) 
(0021) /*延时函数,频率1MHz,单位mS*/
(0022) void delay_ms(unsigned char i) {
(0023) 
(0024) 	unsigned char a, b;
(0025) 	for (a = 1; a < i; a++) {
    0058 E041      LDI	R20,1
    0059 C006      RJMP	0x0060
(0026) 		for (b = 1; b; b++) {
    005A E061      LDI	R22,1
    005B C001      RJMP	0x005D
    005C 9563      INC	R22
    005D 2366      TST	R22
    005E F7E9      BNE	0x005C
    005F 9543      INC	R20
    0060 1740      CP	R20,R16
    0061 F3C0      BCS	0x005A
    0062 940E011E  CALL	pop_gset2
    0064 9508      RET
(0027) 			;
(0028) 			}
(0029) 		}
(0030) }
(0031) 
(0032) void main(void) {
(0033) 
(0034) 	unsigned char i;
(0035) 	DDRA = 0x00;				/*方向输入*/
_main:
  i                    --> R20
    0065 2422      CLR	R2
    0066 BA2A      OUT	0x1A,R2
(0036) 	PORTA = 0x7F;				/*打开上拉*/
    0067 E78F      LDI	R24,0x7F
    0068 BB8B      OUT	0x1B,R24
(0037) 	DDRB = 0xFF;				/*方向输出*/
    0069 EF8F      LDI	R24,0xFF
    006A BB87      OUT	0x17,R24
(0038) 	PORTB = 0xFF;				/*电平设置*/
    006B BB88      OUT	0x18,R24
(0039) 	DDRC = 0x00;
    006C BA24      OUT	0x14,R2
(0040) 	PORTC = 0xFF;
    006D BB85      OUT	0x15,R24
(0041) 	DDRD = 0x00;
    006E BA21      OUT	0x11,R2
(0042) 	PORTD = 0xFF;
    006F BB82      OUT	0x12,R24
(0043) 
(0044) 	delay_ms(200);				/*加入延时*/
    0070 EC08      LDI	R16,0xC8
    0071 DFE4      RCALL	_delay_ms
(0045) 	Disp_Init();				/*电平设置*/
    0072 940E0093  CALL	_Disp_Init
    0074 C01C      RJMP	0x0091
(0046) 	while (1) {
(0047) 		delay_ms(100);			/*周期控制*/
    0075 E604      LDI	R16,0x64
    0076 DFDF      RCALL	_delay_ms
(0048) 		i = get_ad();			/*获取电压*/
    0077 940E00FC  CALL	_get_ad
    0079 2F40      MOV	R20,R16
(0049) 		led_buf[3] = 0;			/*数值转换*/
    007A 2422      CLR	R2
    007B 92200073  STS	led_buf+3,R2
(0050) 		led_buf[2] = i / 100;
    007D E614      LDI	R17,0x64
    007E 940E0108  CALL	div8u
    0080 93000072  STS	led_buf+2,R16
(0051) 		led_buf[1] = (i % 100) / 10;
    0082 E614      LDI	R17,0x64
    0083 2F04      MOV	R16,R20
    0084 940E0106  CALL	mod8u
    0086 E01A      LDI	R17,0xA
    0087 940E0108  CALL	div8u
    0089 93000071  STS	led_buf+1,R16
(0052) 		led_buf[0] = (i % 10);
    008B E01A      LDI	R17,0xA
    008C 2F04      MOV	R16,R20
    008D 940E0106  CALL	mod8u
    008F 93000070  STS	led_buf,R16
    0091 CFE3      RJMP	0x0075
    0092 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~2\icc\008-AD-LED\disp_2.c
(0001) /*
(0002) 模块说明:
(0003) 
(0004) 	LED数码管中断动态显示程序。
(0005) 	1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0006) 	2、动态调度由片内定时器1中断产生,中断周期为5mS。
(0007) 	3、内部1 M晶振,程序采用单任务方式,软件延时。
(0008) 	4、此模块文件为实用文件,可直接用于项目中。
(0009) 	www.iccavr.com
(0010) */
(0011) #include "iom16v.h"
(0012) #include <macros.h>
(0013) 
(0014) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
(0015) 
(0016) unsigned char led_buf[] = {1, 2, 3, 4, 0};			/*显示信息*/
(0017) 
(0018) /*------------------------------------------------------------------*-
(0019) 
(0020) 	 Disp_Init()
(0021) 	 显示初始化
(0022) 
(0023) -*------------------------------------------------------------------*/
(0024) void Disp_Init(void) {
(0025) 
(0026) 	/*初始化定时器*/
(0027) 	OCR1A = 625;						/*计数周期为5mS,F=1M*/
_Disp_Init:
    0093 E781      LDI	R24,0x71
    0094 E092      LDI	R25,2
    0095 BD9B      OUT	0x2B,R25
    0096 BD8A      OUT	0x2A,R24
(0028) 	TIMSK |= (1 << OCIE1A);				/*比较中断A允许*/
    0097 B789      IN	R24,0x39
    0098 6180      ORI	R24,0x10
    0099 BF89      OUT	0x39,R24
(0029) 	SREG = 0x80;
    009A E880      LDI	R24,0x80
    009B BF8F      OUT	0x3F,R24
(0030) 	TCCR1A = 0x00;
    009C 2422      CLR	R2
    009D BC2F      OUT	0x2F,R2
(0031) 	TCCR1B = 0x08;						/*定时器工作在CTC计数器模式*/
    009E E088      LDI	R24,0x8
    009F BD8E      OUT	0x2E,R24
(0032) 	TCCR1B |= 0x02;						/*设置定时器的分频值为8分频*/
    00A0 B58E      IN	R24,0x2E
    00A1 6082      ORI	R24,2
    00A2 BD8E      OUT	0x2E,R24
(0033) 	
(0034) 	/*SPI接口初始化*/
(0035) 	DDRB |= (1<<PB5) | (1<<PB7);		/* 设置MOSI 和SCK 为输出,其他为输入 */
    00A3 B387      IN	R24,0x17
    00A4 6A80      ORI	R24,0xA0
    00A5 BB87      OUT	0x17,R24
(0036) 	SPCR = (1<<SPE) | (1<<MSTR)
    00A6 E583      LDI	R24,0x53
    00A7 B98D      OUT	0x0D,R24
(0037) 		| (1<<SPR1) | (1<<SPR0);		/* 使能SPI 主机模式,时钟为fck/128 */
(0038) 	
(0039) 	/*中断使能*/
(0040) 	SEI();
    00A8 9478      BSET	7
    00A9 9508      RET
_Int_TCCR1A:
  temp                 --> R20
    00AA 922A      ST	R2,-Y
    00AB 930A      ST	R16,-Y
    00AC 931A      ST	R17,-Y
    00AD 938A      ST	R24,-Y
    00AE 939A      ST	R25,-Y
    00AF 93EA      ST	R30,-Y
    00B0 93FA      ST	R31,-Y
    00B1 B62F      IN	R2,0x3F
    00B2 922A      ST	R2,-Y
    00B3 940E0129  CALL	push_gset1
(0041) }
(0042) 
(0043) /*------------------------------------------------------------------*-
(0044)   
(0045)  	Int_TCCR1A()
(0046)  	LED数码管动态显示函数
(0047) 
(0048) 	定时器'T1',A组比较中断产生5mS周期性中断
(0049) 	在中断里刷新显示
(0050)  
(0051) -*------------------------------------------------------------------*/
(0052) #pragma interrupt_handler Int_TCCR1A: 7
(0053) void Int_TCCR1A(void) {
(0054) 
(0055) 	unsigned char temp;
(0056) 	static unsigned char i;
(0057) 
(0058) 	PORTB &= ~(1 << 4);					/*准备锁存*/
    00B5 98C4      CBI	0x18,4
(0059) 	PORTB |= 0x0F;
    00B6 B388      IN	R24,0x18
    00B7 608F      ORI	R24,0xF
    00B8 BB88      OUT	0x18,R24
(0060) 	PORTB |= (1 << 4);					/*锁存数据*/
    00B9 9AC4      SBI	0x18,4
(0061) 	if (i == 3) {
    00BA 91800075  LDS	R24,i
    00BC 3083      CPI	R24,3
    00BD F409      BNE	0x00BF
(0062) 		PORTB &= ~(1 << 2);
    00BE 98C2      CBI	0x18,2
(0063) 		}
(0064) 	if (i == 2) {
    00BF 91800075  LDS	R24,i
    00C1 3082      CPI	R24,2
    00C2 F409      BNE	0x00C4
(0065) 		PORTB &= ~(1 << 1);
    00C3 98C1      CBI	0x18,1
(0066) 		}
(0067) 	if (i == 1) {
    00C4 91800075  LDS	R24,i
    00C6 3081      CPI	R24,1
    00C7 F409      BNE	0x00C9
(0068) 		PORTB &= ~(1 << 0);
    00C8 98C0      CBI	0x18,0
(0069) 		}
(0070) 	if (i == 0) {
    00C9 90200075  LDS	R2,i
    00CB 2022      TST	R2
    00CC F409      BNE	0x00CE
(0071) 		PORTB &= ~(1 << 3);
    00CD 98C3      CBI	0x18,3
(0072) 		}
(0073) 	
(0074) 	temp = led_buf[i] % 16;		/**/
    00CE E780      LDI	R24,0x70
    00CF E090      LDI	R25,0
    00D0 91E00075  LDS	R30,i
    00D2 27FF      CLR	R31
    00D3 0FE8      ADD	R30,R24
    00D4 1FF9      ADC	R31,R25
    00D5 8100      LDD	R16,Z+0
    00D6 E110      LDI	R17,0x10
    00D7 940E0106  CALL	mod8u
    00D9 2F40      MOV	R20,R16
(0075) 	temp = disp[temp];			/**/
    00DA E680      LDI	R24,0x60
    00DB E090      LDI	R25,0
    00DC 2FE4      MOV	R30,R20
    00DD 27FF      CLR	R31
    00DE 0FE8      ADD	R30,R24
    00DF 1FF9      ADC	R31,R25
    00E0 8140      LDD	R20,Z+0
(0076) 	SPDR = temp;
    00E1 B94F      OUT	0x0F,R20
(0077) 
(0078) 	if (i > 3) {
    00E2 E083      LDI	R24,3
    00E3 90200075  LDS	R2,i
    00E5 1582      CP	R24,R2
    00E6 F420      BCC	0x00EB
(0079) 		i = 0;
    00E7 2422      CLR	R2
    00E8 92200075  STS	i,R2
(0080) 		}
    00EA C005      RJMP	0x00F0
(0081) 	else {
(0082) 		i ++;
    00EB 91800075  LDS	R24,i
    00ED 5F8F      SUBI	R24,0xFF
    00EE 93800075  STS	i,R24
(0083) 		}
    00F0 940E012C  CALL	pop_gset1
    00F2 9029      LD	R2,Y+
    00F3 BE2F      OUT	0x3F,R2
    00F4 91F9      LD	R31,Y+
    00F5 91E9      LD	R30,Y+
    00F6 9199      LD	R25,Y+
    00F7 9189      LD	R24,Y+
    00F8 9119      LD	R17,Y+
    00F9 9109      LD	R16,Y+
    00FA 9029      LD	R2,Y+
    00FB 9518      RETI
FILE: E:\ICCAVR\project\AVRMEG~2\icc\008-AD-LED\adc.c
(0001) #include "iom16v.h"
(0002) 
(0003) /*ADC采样函数,采样第7通道信号,采样分辨率256*/
(0004) unsigned char get_ad(void) {
(0005) 
(0006) 	unsigned char i;
(0007) 	
(0008) 	ADMUX = 0x67;			/*基准AVCC、左对齐、通道7*/
_get_ad:
  i                    --> R16
    00FC E687      LDI	R24,0x67
    00FD B987      OUT	0x07,R24
(0009) 	ADCSRA = 0xC2;			/*使能、开启、4分频*/
    00FE EC82      LDI	R24,0xC2
    00FF B986      OUT	0x06,R24
(0010) 	while(!(ADCSRA & (1 << ADIF)));	/*等待*/
    0100 9B34      SBIS	0x06,4
    0101 CFFE      RJMP	0x0100
(0011) 	i = ADCH;
    0102 B105      IN	R16,0x05
(0012) 	ADCSRA &= ~(1 << ADIF);		/*清标志*/
    0103 9834      CBI	0x06,4
(0013) 	ADCSRA &= ~(1 << ADEN);		/*关闭转换*/
    0104 9837      CBI	0x06,7
(0014) 
(0015) 	return i;
FILE: <library>
    0105 9508      RET
mod8u:
    0106 9468      BSET	6
    0107 C001      RJMP	xdiv8u
div8u:
    0108 94E8      BCLR	6
xdiv8u:
    0109 932A      ST	R18,-Y
    010A 92FA      ST	R15,-Y
    010B 92EA      ST	R14,-Y
    010C 24FF      CLR	R15
    010D 24EE      CLR	R14
    010E E120      LDI	R18,0x10
    010F 0F00      LSL	R16
    0110 1CFF      ROL	R15
    0111 1CEE      ROL	R14
    0112 16E1      CP	R14,R17
    0113 F010      BCS	0x0116
    0114 1AE1      SUB	R14,R17
    0115 9503      INC	R16
    0116 952A      DEC	R18
    0117 F7B9      BNE	0x010F
    0118 F40E      BRTC	0x011A
    0119 2D0E      MOV	R16,R14
    011A 90E9      LD	R14,Y+
    011B 90F9      LD	R15,Y+
    011C 9129      LD	R18,Y+
    011D 9508      RET
pop_gset2:
    011E E0E2      LDI	R30,2
    011F 940C012D  JMP	pop
push_gset5:
    0121 92FA      ST	R15,-Y
    0122 92EA      ST	R14,-Y
push_gset4:
    0123 92DA      ST	R13,-Y
    0124 92CA      ST	R12,-Y
push_gset3:
    0125 92BA      ST	R11,-Y
    0126 92AA      ST	R10,-Y
push_gset2:
    0127 937A      ST	R23,-Y
    0128 936A      ST	R22,-Y
push_gset1:
    0129 935A      ST	R21,-Y
    012A 934A      ST	R20,-Y
    012B 9508      RET
pop_gset1:
    012C E0E1      LDI	R30,1
pop:
    012D 9149      LD	R20,Y+
    012E 9159      LD	R21,Y+
    012F FDE0      SBRC	R30,0
    0130 9508      RET
    0131 9169      LD	R22,Y+
    0132 9179      LD	R23,Y+
    0133 FDE1      SBRC	R30,1
    0134 9508      RET
    0135 90A9      LD	R10,Y+
    0136 90B9      LD	R11,Y+
    0137 FDE2      SBRC	R30,2
    0138 9508      RET
    0139 90C9      LD	R12,Y+
    013A 90D9      LD	R13,Y+
    013B FDE3      SBRC	R30,3
    013C 9508      RET
    013D 90E9      LD	R14,Y+
    013E 90F9      LD	R15,Y+
    013F 9508      RET

⌨️ 快捷键说明

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