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

📄 disp.s

📁 电压计(c语言编写的) 通过led灯显示 电路图说明: 1、R1、R2、D1、D2 组成发光二极管显示
💻 S
字号:
	.module disp.c
	.area data(ram, con, rel)
_disp_table::
	.blkb 2
	.area idata
	.byte 63,6
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 91,'O
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 'f,'m
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 125,7
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 127,'o
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 'w,124
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 57,94
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 'y,'q
	.area data(ram, con, rel)
	.dbfile E:\avrc\disp.c
	.dbsym e disp_table _disp_table A[16:16]c
	.area text(rom, con, rel)
	.dbfile E:\avrc\disp.c
	.dbfunc e main _main fV
;              i -> <dead>
;              j -> R20,R21
	.even
_main::
	.dbline -1
	.dbline 15
; #include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;
; #include <macros.h>
; #include <stdio.h>
; #define uchar unsigned char
; #define uint unsigned int
; void send_byte(uchar x);
; void disp_led(uchar buffer,uchar control);
; void delay_1ms(void); 
; void delay_nms(unsigned int n);
; uchar  disp_table[16] = {
; 	0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
; 	0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
; uint count;
; void main(void)
; {   
	.dbline 18
;     uint i;
; 	int j;
;   	OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率,
	ldi R24,157
	out 0x31,R24
	.dbline 19
;   	DDRB=0x03; //定义B口的PB0、PB1为输出口
	ldi R24,3
	out 0x17,R24
	.dbline 20
;   	DDRC=0x30;
	ldi R24,48
	out 0x14,R24
	.dbline 21
; 	WDR();       //看门狗计数清零
	wdr
	.dbline 22
;     WDTCR=0x0F;  //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S
	ldi R24,15
	out 0x21,R24
	.dbline 23
;     ADCSRA=0X00;
	clr R2
	out 0x6,R2
	.dbline 24
; 	ADCSRA = 0x00; 
	out 0x6,R2
	.dbline 25
;     ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0);
	ldi R24,195
	out 0x7,R24
	.dbline 26
;     ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
	ldi R24,206
	out 0x6,R24
	.dbline 27
; 	SEI();
	sei
	.dbline 29
;   	//PORTB=0B00000001; //PB0口输出高电平,PB1口输出低电平,绿灯亮
;   	delay_nms(5000); //延时5秒
	ldi R16,5000
	ldi R17,19
	rcall _delay_nms
	.dbline 30
;   	PORTB=0B00000010; //PB1口输出高电平,PB0口输出低电平,关闭绿灯,红灯亮
	ldi R24,2
	out 0x18,R24
	.dbline 31
;   	delay_nms(5000); //延时5秒
	ldi R16,5000
	ldi R17,19
	rcall _delay_nms
	.dbline 32
; 	disp_led(4,0);
	clr R18
	ldi R16,4
	rcall _disp_led
	rjmp L3
L2:
	.dbline 34
;   	while(1) 
;      {       
	.dbline 35
; 	         PORTB=0B00000010;
	ldi R24,2
	out 0x18,R24
	.dbline 36
; 	  		 delay_nms(100);
	ldi R16,100
	ldi R17,0
	rcall _delay_nms
	.dbline 37
; 			 j=((25600/1023)*(ADCH*256+ADCL))/1000;
	in R18,0x5
	clr R19
	ldi R16,256
	ldi R17,1
	rcall empy16s
	movw R18,R16
	in R2,0x4
	clr R3
	add R18,R2
	adc R19,R3
	ldi R16,25
	ldi R17,0
	rcall empy16s
	ldi R18,1000
	ldi R19,3
	rcall div16s
	movw R20,R16
	.dbline 38
; 			 count=j;
	sts _count+1,R21
	sts _count,R20
	.dbline 39
; 			 if(j>24)
	ldi R24,24
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brge L5
	.dbline 40
; 			 PORTB=0B00000011; //翻转PB0和PB1口
	ldi R24,3
	out 0x18,R24
L5:
	.dbline 41
	ldi R18,1
	clr R16
	rcall _disp_led
	.dbline 42
L3:
	.dbline 33
	rjmp L2
X0:
	.dbline -2
	.dbline 43
; 			 disp_led(0,1);
;     }
; }
L1:
	.dbline 0 ; func end
	ret
	.dbsym l i 1 i
	.dbsym r j 20 I
	.dbend
	.dbfunc e send_byte _send_byte fV
;              i -> R20
;              x -> R22
	.even
_send_byte::
	rcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 45
; void send_byte(uchar x)
; {
	.dbline 47
; 	uchar i;
;  	for(i=0;i<8;i++)
	clr R20
	rjmp L11
L8:
	.dbline 48
;  	{
	.dbline 49
;  		PORTC=0<<5;
	clr R2
	out 0x15,R2
	.dbline 50
; 		if((x&(1<<(7-i))))
	ldi R17,7
	sub R17,R20
	ldi R16,1
	rcall lsl8
	mov R2,R22
	and R2,R16
	breq L12
	.dbline 51
; 		PORTC=1<<4;
	ldi R24,16
	out 0x15,R24
	rjmp L13
L12:
	.dbline 53
; 		else
; 		PORTC=0<<4;
	clr R2
	out 0x15,R2
L13:
	.dbline 54
	ldi R24,32
	out 0x15,R24
	.dbline 55
L9:
	.dbline 47
	inc R20
L11:
	.dbline 47
	cpi R20,8
	brlo L8
	.dbline -2
	.dbline 56
; 		PORTC=1<<5;
; 	}
; }
L7:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r x 22 c
	.dbend
	.dbfunc e disp_led _disp_led fV
;           temp -> y+0
;      tempcount -> R20,R21
;              i -> R22
;        control -> R20
;         buffer -> R10
	.even
_disp_led::
	rcall push_gset3
	mov R20,R18
	mov R10,R16
	sbiw R28,6
	.dbline -1
	.dbline 58
; void disp_led(uchar buffer,uchar control)
; {
	.dbline 61
; 	uchar i,temp[6];
; 	uint tempcount;
; 	switch(control)
	clr R21
	cpi R20,0
	cpc R20,R21
	breq L18
X1:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L23
	rjmp L15
X2:
	.dbline 62
; 	{
L18:
	.dbline 64
; 		case 0:		//test
; 		{
	.dbline 65
; 			for(i=0;i<11;i++)
	clr R22
	rjmp L22
L19:
	.dbline 66
	ldi R18,10
	ldi R19,0
	mov R16,R10
	clr R17
	rcall mod16s
	movw R30,R16
	ldi R24,<_disp_table
	ldi R25,>_disp_table
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _send_byte
L20:
	.dbline 65
	inc R22
L22:
	.dbline 65
	cpi R22,11
	brlo L19
	.dbline 67
; 			send_byte(disp_table[buffer%10]);//显示数字
; 			break;
	rjmp L16
L23:
	.dbline 70
; 		}
; 		case 1:		//display count
; 		{
	.dbline 71
; 			tempcount=count;
	lds R20,_count
	lds R21,_count+1
	.dbline 72
; 			for(i=0;i<6;i++)
	clr R22
	rjmp L27
L24:
	.dbline 73
	.dbline 74
	ldi R18,10
	ldi R19,0
	movw R16,R20
	rcall mod16u
	movw R24,R28
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 75
	ldi R18,10
	ldi R19,0
	movw R16,R20
	rcall div16u
	movw R20,R16
	.dbline 76
L25:
	.dbline 72
	inc R22
L27:
	.dbline 72
	cpi R22,6
	brlo L24
	.dbline 77
; 			{
; 				temp[i]=tempcount%10;
; 				tempcount/=10;
; 			}
; 			send_byte(disp_table[buffer/10]);
	ldi R18,10
	ldi R19,0
	mov R16,R10
	clr R17
	rcall div16s
	movw R30,R16
	ldi R24,<_disp_table
	ldi R25,>_disp_table
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _send_byte
	.dbline 78
; 			send_byte(disp_table[buffer%10]);
	ldi R18,10
	ldi R19,0
	mov R16,R10
	clr R17
	rcall mod16s
	movw R30,R16
	ldi R24,<_disp_table
	ldi R25,>_disp_table
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _send_byte
	.dbline 79
; 			send_byte(0x00);
	clr R16
	rcall _send_byte
	.dbline 80
; 			send_byte(0x00);
	clr R16
	rcall _send_byte
	.dbline 81
; 			send_byte(0x00);
	clr R16
	rcall _send_byte
	.dbline 82
; 			for(i=0;i<6;i++)
	clr R22
	rjmp L31
L28:
	.dbline 83
	mov R2,R22
	clr R3
	ldi R30,5
	ldi R31,0
	sub R30,R2
	sbc R31,R3
	movw R24,R28
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_disp_table
	ldi R25,>_disp_table
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _send_byte
L29:
	.dbline 82
	inc R22
L31:
	.dbline 82
	cpi R22,6
	brlo L28
	.dbline 84
; 			send_byte(disp_table[temp[5-i]]);
; 			break;
L15:
L16:
	.dbline 87
; 		}
; 	}
; 	PORTC=1<<4;
	ldi R24,16
	out 0x15,R24
	.dbline -2
	.dbline 88
; }
L14:
	adiw R28,6
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l temp 0 A[6:6]c
	.dbsym r tempcount 20 i
	.dbsym r i 22 c
	.dbsym r control 20 c
	.dbsym r buffer 10 c
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 90
; void delay_1ms(void)//1ms延时函数
; {
	.dbline 92
;   unsigned int i;
;   for (i=0;i<150;i++)
	clr R16
	clr R17
	rjmp L36
L33:
	.dbline 93
	.dbline 94
	wdr
	.dbline 95
L34:
	.dbline 92
	subi R16,255  ; offset = 1
	sbci R17,255
L36:
	.dbline 92
	cpi R16,150
	ldi R30,0
	cpc R17,R30
	brlo L33
	.dbline -2
	.dbline 96
;   {
;   WDR(); 
;   } 
; }
L32:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nms::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 98
; void delay_nms(unsigned int n)//延时n毫秒
; {
	.dbline 100
;   unsigned int i;
;   for (i=0;i<n;i++)//执行n次1毫秒延时
	clr R20
	clr R21
	rjmp L41
L38:
	.dbline 101
	rcall _delay_1ms
L39:
	.dbline 100
	subi R20,255  ; offset = 1
	sbci R21,255
L41:
	.dbline 100
	cp R20,R22
	cpc R21,R23
	brlo L38
	.dbline 102
;   delay_1ms(); 
;   WDR(); 
	wdr
	.dbline -2
	.dbline 103
; }
L37:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.area vector(rom, abs)
	.org 28
	rjmp _adc_isr
	.area text(rom, con, rel)
	.dbfile E:\avrc\disp.c
	.dbfunc e adc_isr _adc_isr fV
	.even
_adc_isr::
	st -y,R24
	in R24,0x3f
	st -y,R24
	.dbline -1
	.dbline 107
; //ADC完成中断
; #pragma interrupt_handler adc_isr:iv_ADC     
; void adc_isr(void)
; {
	.dbline 108
;  ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0);
	ldi R24,195
	out 0x7,R24
	.dbline 109
;  ADCSRA|=(1<<ADSC);//启动AD转换
	sbi 0x6,6
	.dbline -2
	.dbline 110
; }
L42:
	ld R24,y+
	out 0x3f,R24
	ld R24,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\avrc\disp.c
_count::
	.blkb 2
	.dbsym e count _count i

⌨️ 快捷键说明

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