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

📄 main.s

📁 AVR单片机六路ADC采集与七段数码管显示采集值
💻 S
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.dbfunc e Delay_MS _Delay_MS fV
;              i -> R20
;          iTime -> R16,R17
	.even
_Delay_MS::
	st -y,R20
	.dbline -1
	.dbline 7
; //#IFDEF F_CPU
; #define F_CPU 8000000
; //#ENDIF
; 
; //延时,对应主频为8MHz
; void Delay_MS(unsigned int iTime) 
; {   unsigned char i; 
	rjmp L3
L2:
	.dbline 9
;     while(iTime>0) 
;     { 
	.dbline 10
;         for (i=1;i<187;i++) 
	ldi R20,1
	rjmp L8
L5:
	.dbline 11
;             asm("nop"); 
	nop
L6:
	.dbline 10
	inc R20
L8:
	.dbline 10
	cpi R20,187
	brlo L5
X0:
	.dbline 13
; 
;         iTime--; 
	subi R16,1
	sbci R17,0
	.dbline 14
;     } 
L3:
	.dbline 8
	cpi R16,0
	cpc R16,R17
	brne L2
X1:
	.dbline -2
L1:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r i 20 c
	.dbsym r iTime 16 i
	.dbend
	.dbfunc e Delay_US _Delay_US fV
;              j -> R10,R11
;              i -> R20,R21
;          iTime -> R16,R17
	.even
_Delay_US::
	rcall push_xgset300C
	.dbline -1
	.dbline 19
; } 
; 
; //主频8MHz
; void Delay_US(unsigned int iTime) 
; {
	.dbline 21
;     unsigned int i,j;
; 	j = iTime * 8;
	movw R10,R16
	lsl R10
	rol R11
	lsl R10
	rol R11
	lsl R10
	rol R11
	.dbline 22
; 	for(i=0;i<j;i++);
	clr R20
	clr R21
	rjmp L13
L10:
	.dbline 22
L11:
	.dbline 22
	subi R20,255  ; offset = 1
	sbci R21,255
L13:
	.dbline 22
	cp R20,R10
	cpc R21,R11
	brlo L10
X2:
	.dbline -2
L9:
	.dbline 0 ; func end
	rjmp pop_xgset300C
	.dbsym r j 10 i
	.dbsym r i 20 i
	.dbsym r iTime 16 i
	.dbend
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
_SEG7::
	.blkb 2
	.area idata
	.byte 192,249
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.blkb 2
	.area idata
	.byte 164,176
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.blkb 2
	.area idata
	.byte 153,146
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.blkb 2
	.area idata
	.byte 130,248
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.blkb 2
	.area idata
	.byte 128,144
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.blkb 2
	.area idata
	.byte 136,131
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.blkb 2
	.area idata
	.byte 198,161
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.blkb 2
	.area idata
	.byte 134,142
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\delay.h
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.dbsym e SEG7 _SEG7 A[16:16]c
_PADV::
	.blkb 1
	.area idata
	.byte 255
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.blkb 15
	.area idata
	.word 0,0,0,0,0
	.byte 0,0,0,0,0
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.dbsym e PADV _PADV A[16:16]c
_CADV::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.blkb 15
	.area idata
	.word 0,0,0,0,0
	.byte 0,0,0,0,0
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.dbsym e CADV _CADV A[16:16]c
_ScaleCHindex::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.dbsym e ScaleCHindex _ScaleCHindex c
	.area vector(rom, abs)
	.org 18
	rjmp _OnTimer0
	.area data(ram, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.area text(rom, con, rel)
	.dbfile f:\MYDOCU~1\AVR\test\main.c
	.dbfunc e OnTimer0 _OnTimer0 fV
;            adv -> R20
	.even
_OnTimer0::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 22
; #include <iom8v.h>
; #include <macros.h>
; 
; #define F_CPU	   8000000	//主频
; #include "delay.h"
; 
; #define MAXCH      16		//总通道数
; #define MAXSCALECH 6		//比例通道数
; 
; //数码管显示值
; unsigned char SEG7[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
; 
; //通道值
; unsigned char PADV[MAXCH] = {-1};
; unsigned char CADV[MAXCH] = {0};
; 
; unsigned char ScaleCHindex  = 0;
; 
; //以下定义中断处理程序
; #pragma interrupt_handler OnTimer0:iv_TIMER0_OVF
; void OnTimer0(void)
; {   unsigned char adv;
	.dbline 23
;     ADMUX = 0x20 + ScaleCHindex;	  //左对齐,只取高位
	lds R24,_ScaleCHindex
	subi R24,224    ; addi 32
	out 0x7,R24
	.dbline 25
; 
; 	ADCSRA|=(1<<ADSC);	  	  //启动ADC
	sbi 0x6,6
	.dbline 26
; 	Delay_US(60);			  //第一次结果抛弃
	ldi R16,60
	ldi R17,0
	rcall _Delay_US
	.dbline 27
; 	ADCSRA|=(1<<ADSC);	  	  //启动ADC
	sbi 0x6,6
	.dbline 28
; 	Delay_US(60);
	ldi R16,60
	ldi R17,0
	rcall _Delay_US
	.dbline 29
; 	adv = ADCH;
	in R20,0x5
	.dbline 31
; 
; 	if(adv == 0xFF)			adv = 0xFE;
	cpi R20,255
	brne L15
X3:
	.dbline 31
	ldi R20,254
	rjmp L16
L15:
	.dbline 32
; 	else if(ADCH == 0x00)	adv = 0x01;
	in R2,0x5
	tst R2
	brne L17
X4:
	.dbline 32
	ldi R20,1
L17:
L16:
	.dbline 34
; 		
; 	CADV[ScaleCHindex] = adv;
	ldi R24,<_CADV
	ldi R25,>_CADV
	lds R30,_ScaleCHindex
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R20
	.dbline 36
; 
; 	ScaleCHindex++;
	lds R24,_ScaleCHindex
	subi R24,255    ; addi 1
	sts _ScaleCHindex,R24
	.dbline 37
; 	if(ScaleCHindex >= MAXSCALECH) ScaleCHindex = 0;
	cpi R24,6
	brlo L19
X5:
	.dbline 37
	clr R2
	sts _ScaleCHindex,R2
L19:
	.dbline 40
; 	
; 	//去抖
; 	adv = PIND;
	in R20,0x10
	.dbline 41
; 	Delay_US(50);
	ldi R16,50
	ldi R17,0
	rcall _Delay_US
	.dbline 42
; 	if(adv != PIND) return; 
	in R2,0x10
	cp R20,R2
	breq L21
X6:
	.dbline 42
	rjmp L14
L21:
	.dbline 44
; 	
; 	CADV[MAXSCALECH]   = (PIND & 0x10) ? 0xFF : 0x00;  
	sbis 0x10,4
	rjmp L24
X7:
	ldi R20,255
	ldi R21,0
	rjmp L25
L24:
	clr R20
	clr R21
L25:
	sts _CADV+6,R20
	.dbline 45
; 	CADV[MAXSCALECH+1] = (PIND & 0x20) ? 0xFF : 0x00;
	sbis 0x10,5
	rjmp L27
X8:
	ldi R20,255
	ldi R21,0
	rjmp L28
L27:
	clr R20
	clr R21
L28:
	sts _CADV+7,R20
	.dbline 46
; 	CADV[MAXSCALECH+2] = (PIND & 0x40) ? 0xFF : 0x00;
	sbis 0x10,6
	rjmp L30
X9:
	ldi R20,255
	ldi R21,0
	rjmp L31
L30:
	clr R20
	clr R21
L31:
	sts _CADV+8,R20
	.dbline 47
; 	CADV[MAXSCALECH+3] = (PIND & 0x80) ? 0xFF : 0x00;
	sbis 0x10,7
	rjmp L33
X10:
	ldi R20,255
	ldi R21,0
	rjmp L34
L33:
	clr R20
	clr R21
L34:
	sts _CADV+9,R20
	.dbline -2
L14:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R9,y+
	ld R8,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	reti
	.dbsym r adv 20 c
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fI
	.even
_main::
	.dbline 0 ; func end
	ret
	.dbend
; 
;     //TCNT0 = 0xFF;
; }
; 
; //初始化
; void init_devices(void)
; {
;     //内部RC校准
; 	//OSCCAL = 0x7D;
; 	unsigned int baud = 9600;
; 	
;     CLI();
;     
;     //端口初始化
; 	PORTB = 0xFF;
; 	DDRB  = 0xFF;
; 	
; 	//比例通道
; 	PORTC = 0x00;
; 	DDRC  = 0x00;
; 	
; 	//开关通道
; 	PORTD = 0xF0;
; 	DDRD  = 0x0F;
;     
;     //定时器初始化
;     TCCR0 = 0x00; //禁止计时
;     TCNT0 = 0x0F; //定时器时长
;     TCCR0 = 0x05; //启动定时器 CLK/1024
;     
;     //ADC初始化
;     ADCSR = 0x00; //禁止转换
;     ADMUX = 0x20; //多路复用选择寄存器 E0 内部参考源,左对齐(只需高八位),通道0
; 		  		  // REFS1 RESF0(参考源) ADLAR(左对齐) 保留 MUX3 MUX2 MUX1 MUX0
;     ACSR  = 0x80; //模拟比较器控制与状态寄存器
;     ADCSR = 0x83; //10001011  83 禁止中断,使用查询方式 
; 		  		  //ADEN(AD允许) ADSC(AD开始) ADFR(连续) ADIF(中断标志) ADIE(中断允许) ADPS(预分频,三位)
; 	
;     //UART初始化
; 	UBRRH = (unsigned char)(baud>>8);
; 	UBRRL = (unsigned char)(baud);
; 	UCSRB = (1<<TXEN);
; 	UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ8);
; 	
;     //控制寄存器
;     MCUCR = 0x00;
;     GICR  = 0x00;
;     TIMSK = 0x01; //充许Timer0中断
;     
;     SEI();
; }
; 
; main()
; {	  
; 	int i = 0,j = 0;
;     	
;     init_devices();
; 	
; 	while(1)
; 	{	
; 		for(j=0;j<MAXCH;j++)
;     		if(PADV[j] != CADV[j])
; 			{   i = j;
; 			    PADV[j] = CADV[j];
; 			}
; 		
; 		//显示低位
;    		PORTD = 0x01;
;    		PORTB = SEG7[CADV[i] & 0x0F];
; 		Delay_MS(20);
;    		
; 		//显示高位
;        	PORTD = 0x02;
;    		PORTB = SEG7[CADV[i] >> 4];
;        	Delay_MS(20);
; 
; 		//通道值
;    		PORTD = 0x08;
;    		PORTB = SEG7[i];
;        	Delay_MS(20);
; 	}
; }

⌨️ 快捷键说明

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