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

📄 led4.s

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 S
字号:
	.module led4.c
	.area data(ram, con, rel)
_disp::
	.blkb 2
	.area idata
	.byte 192,249
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 164,176
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 153,146
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 130,248
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 128,144
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 192,192
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 192,192
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 192,192
	.area data(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
	.dbsym e disp _disp A[16:16]c
_led_buf::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
	.blkb 1
	.area idata
	.byte 3
	.area data(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
	.dbsym e led_buf _led_buf A[5:5]c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
	.dbfunc e disp_init _disp_init fV
	.even
_disp_init::
	.dbline -1
	.dbline 29
; /*
; 模块说明:
; 
; 	LED数码管中断动态显示程序。
; 	1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
; 	2、动态调度由片内定时器1中断产生,中断周期为5mS。
; 	3、内部1 M晶振,程序采用单任务方式,软件延时。
; 	4、此模块文件为使用文件,可直接用于项目中。
; 	www.iccavr.com 阿发
; 	
; */
; #include "iom128v.h"
; #include <macros.h>
; 
; unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
; 
; /*
; 前4位为显示数值。
; 最后一位为小数点显示位置。
; */
; unsigned char led_buf[] = {0, 0, 0, 0, 3};				/*显示信息*/
; 
; /*------------------------------------------------------------------*-
; 
; 	 Disp_Init()
; 	 显示初始化
; 
; -*------------------------------------------------------------------*/
; void disp_init(void) {
	.dbline 32
; 
; 	/*初始化定时器*/
; 	OCR1A = 625;										/*计数周期为5mS,F=1M*/
	ldi R24,625
	ldi R25,2
	out 0x2b,R25
	out 0x2a,R24
	.dbline 33
; 	TIMSK |= (1 << OCIE1A);								/*比较中断A允许*/
	in R24,0x37
	ori R24,16
	out 0x37,R24
	.dbline 34
; 	TCCR1A = 0x00;
	clr R2
	out 0x2f,R2
	.dbline 35
; 	TCCR1B = (1 << WGM12);								/*定时器工作在CTC计数器模式*/
	ldi R24,8
	out 0x2e,R24
	.dbline 36
; 	TCCR1B |= (1 << CS11);								/*设置定时器的分频值为8分频*/
	in R24,0x2e
	ori R24,2
	out 0x2e,R24
	.dbline 40
; 	
; 	/*SPI接口初始化*/
; 	
; 	DDRB = 0xFF;										/* 设置PB口为输出*/
	ldi R24,255
	out 0x17,R24
	.dbline 41
; 	SPCR = (1<<SPE) | (1<<MSTR)
	ldi R24,83
	out 0xd,R24
	.dbline 45
; 		| (1<<SPR1) | (1<<SPR0);						/* 使能SPI 主机模式,设置时钟速率为fck/128 */
; 	
; 	/*中断使能*/
; 	SEI();
	sei
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 48
	jmp _Int_TCCR1A
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
	.area bss(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
L3:
	.blkb 1
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
	.dbfunc e Int_TCCR1A _Int_TCCR1A fV
	.dbsym s i L3 c
;           temp -> R20
	.even
_Int_TCCR1A::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	xcall push_gset1
	.dbline -1
	.dbline 58
; }
; 
; /*------------------------------------------------------------------*-
;   
;  	Int_TCCR1A()
;  	LED数码管动态显示函数
; 
; 	定时器'T1',A组比较中断产生5mS周期性中断
; 	在中断里刷新显示
;  
; -*------------------------------------------------------------------*/
; #pragma interrupt_handler Int_TCCR1A: 13
; void Int_TCCR1A(void) {
	.dbline 63
; 
; 	unsigned char temp;
; 	static unsigned char i;
; 	
; 	PORTB &= ~(1 << PB0);								/*准备锁存*/
	cbi 0x18,0
	.dbline 64
; 	PORTB |= 0xF0;										/*复位段选择口*/
	in R24,0x18
	ori R24,240
	out 0x18,R24
	.dbline 65
; 	PORTB |= (1 << PB0);								/*锁存数据*/
	sbi 0x18,0
	.dbline 66
; 	if (i == 3) {
	lds R24,L3
	cpi R24,3
	brne L4
	.dbline 66
	.dbline 67
; 		PORTB &= ~(1 << PB6);							/*由于此处显示数值滞后一个周期所以显示位也要修改*/
	cbi 0x18,6
	.dbline 68
; 		}												/*此处逻辑性很强,如不能理解可先跳过,以后熟练来再看*/
L4:
	.dbline 69
; 	if (i == 2) {
	lds R24,L3
	cpi R24,2
	brne L6
	.dbline 69
	.dbline 70
; 		PORTB &= ~(1 << PB5);
	cbi 0x18,5
	.dbline 71
; 		}
L6:
	.dbline 72
; 	if (i == 1) {
	lds R24,L3
	cpi R24,1
	brne L8
	.dbline 72
	.dbline 73
; 		PORTB &= ~(1 << PB4);
	cbi 0x18,4
	.dbline 74
; 		}
L8:
	.dbline 75
; 	if (i == 0) {
	lds R2,L3
	tst R2
	brne L10
	.dbline 75
	.dbline 76
; 		PORTB &= ~(1 << PB7);
	cbi 0x18,7
	.dbline 77
; 		}
L10:
	.dbline 78
; 	temp = led_buf[i] % 16;								/*滤除溢出的数值*/
	ldi R24,<_led_buf
	ldi R25,>_led_buf
	lds R30,L3
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	ldi R17,16
	xcall mod8u
	mov R20,R16
	.dbline 79
; 	temp = disp[temp];									/*取出当前显示信息*/
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R20,z+0
	.dbline 80
; 	if (led_buf[4] == i) {								/*显示小数点*/
	lds R2,L3
	lds R3,_led_buf+4
	cp R3,R2
	brne L12
	.dbline 80
	.dbline 81
; 		SPDR = temp & 0x7F;
	mov R24,R20
	andi R24,127
	out 0xf,R24
	.dbline 82
; 		}
	xjmp L13
L12:
	.dbline 83
; 	else {
	.dbline 84
; 		SPDR = temp;
	out 0xf,R20
	.dbline 85
; 		}
L13:
	.dbline 87
	lds R24,L3
	subi R24,255    ; addi 1
	sts L3,R24
	.dbline 88
	ldi R24,3
	lds R2,L3
	cp R24,R2
	brsh L15
	.dbline 88
	.dbline 89
	clr R2
	sts L3,R2
	.dbline 90
L15:
	.dbline -2
L2:
	xcall pop_gset1
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R17,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym r temp 20 c
	.dbend

⌨️ 快捷键说明

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