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

📄 celonled.asm

📁 用avr 48v做的超级省电的交通指示灯源程序,已经大批量生产很稳定.
💻 ASM
字号:
;******************************************************** 
.include "C:\Documents and Settings\qiuqcc\My Documents\AVRTEST\m48def.inc" ;引用器件I/O配置文件 
.def PWMEND    = r0 ;
.def PWMBUF    = r1 ;
.def STATUSBUF = r2 ;
.def GLFLAG 	 = r3 ;
.equ	NEWPWM_F		=  0;新添加的PWM模式下
.def BEEPCOUNT = r8  ;
.def BUZZBUF   = r10 ;
.def BUZZFLG   = r11 ;

.def RTMP1   = r16 ;临时变量 
.def RTMP2   = r17 ;临时变量 
.def RTMP3   = r18 ;临时变量 
.def RTMP4   = r19 ;临时变量 
.def LEDMODE1   = r20 ;临时变量 
.def LEDMODE2   = r21 ;临时变量 
.def INRTMP1 = r22 ;临时变量(中断中使用)
.def INRTMP2 = r23 ;临时变量(中断中使用)


.def CONFLAG	 = r24 ;
.equ	ST8mSF	= 0		;
.equ	ST05SF	= 1		;
.equ	PWM_EN	= 3		;在PWM模式下
.equ  KOFLAG  = 4   ;
.equ  AUTOPWMUP = 5   ;
.equ	timeflagF		= 6		; 
.equ	IOFLAGF		= 7		; 







;寄存器的定义
.equ    LONGTIME    =		0X0160
.equ    KEYREF      =		0X0161
.equ    KFIRSTF     =   5           ;
.equ    ADCData_H   =		0X0163
.equ    ADCData_L   =	  0X0164
.equ    EEPROM_DNum =		0X0165
.equ    COLOCRTIME	=		0X0166
.equ    DECBATTF    =   0X0167
.equ    TCCBAK      =   0X0168
.equ    RVTIMEBUF   =   0X0169
.equ    RVDAT       =   0X016A
.equ    LEDFLASHTIME=   0X016B
.equ    POLLING_CT  =   0X016C
.equ    FLASHBUFF   =   0X016D
.equ    TIMEBUFF01  =   0X016E
.equ    TIMEBUFF02  =   0X016F
.equ    TIMEBUFF03  =   0X0170
.equ    TIMEBUFF04  =   0X0171
.equ    TIME8BAKBUF1=   0X0172
.equ    TXDATLBUF   =   0X0173
.equ    TIMERTMP1   =   0X0174
.equ    TIMEBUFF05  =   0X0175

.equ    LEDA    =		0X00   ;
.equ    LEDB    =		0X01   ;
.equ    LEDC    =		0X02   ;
.equ    LEDD    =		0X03   ;
;=================================================
;中断向量区定义
.org $000
        rjmp RESET 			; 复位处理
.org $010
        rjmp TIM0_OVF 	; 定时器0 溢出处理

;程序开始 
.org $01A 
reset:
        LDI     R16,LOW(ramend)
        OUT     SPL,R16
        RCALL   INITIAL
        RCALL 	INITT        
        LDI			LEDMODE1,1
        LDI			LEDMODE2,1
        SEI 														;全局中断允许
LOOP:
        SBRC		CONFLAG,ST8mSF
        RJMP		RLROUT1
HAH1:
        SBRS  	CONFLAG,ST05SF
        RJMP  	HAH2
        RJMP  	RLROUTW
HAH2:
        RJMP  	LOOP
RLROUT1:
				CBR	  CONFLAG,0X01;ST8mSF  
				RJMP		HAH1
;*************************************************************************
RLROUTW:
				CBR	   CONFLAG,0X02;ST05SF
				
				SEC
				SBRS	 LEDMODE1,0
				CLC
				ROR		 LEDMODE1
				
				CBR		 LEDMODE2,0X10
				SBRC	 LEDMODE2,0
				SBR		 LEDMODE2,0X10
				ROR		 LEDMODE2
				
				;RCALL	 LEDON
				
LEDON:
				CLR		 RTMP1
				OUT		 PORTB,RTMP1
				OUT		 PORTC,RTMP1
				OUT		 PORTD,RTMP1
				SBRC	 LEDMODE1,7
				SBI		 PORTC,6
				SBRC	 LEDMODE1,6
				SBI		 PORTD,0
				SBRC	 LEDMODE1,5
				SBI		 PORTD,1
				SBRC	 LEDMODE1,4
				SBI		 PORTD,2
				SBRC	 LEDMODE1,3
				SBI		 PORTD,3
				SBRC	 LEDMODE1,2
				SBI		 PORTD,4
				SBRC	 LEDMODE1,1
				SBI		 PORTB,6
				SBRC	 LEDMODE1,0
				SBI		 PORTB,7
				SBRC	 LEDMODE2,3
				SBI		 PORTD,5
				SBRC	 LEDMODE2,2
				SBI		 PORTD,6
				SBRC	 LEDMODE2,1
				SBI		 PORTD,7
				SBRC	 LEDMODE2,0
				SBI		 PORTB,0
				RJMP		HAH2
;==================================================
;程序初始化.
INITIAL:
        LDI   R28,0X00
        CLR   R27            ; 清除X寄存器高字节
        LDI   R26,0X00       ; 将X寄存器低字节设置成$00
LOPIO:
        ST    X+,R28          ; (执行后X值加1)
        CPI   R26,0X1A          ; 
        BRNE  LOPIO
        CLR   RTMP1
        LDI   XH,0X00
        LDI   XL,0X60
INITIAL001:
        ST    X+,RTMP1
        CPI   XL,0X80
        BRSH  INITIA_OVER 
        RJMP  INITIAL001
INITIA_OVER:
        ret

;************************************************************************* */
;=======================================
DEL10MS:
        CLR   RTMP1
        LDI   RTMP2,0XF6
DEL10MS01:
        INC   RTMP1
        BRNE  DEL10MS01
        INC   RTMP2
        BRNE  DEL10MS01
        RET
;************************************************************************* 
INITT:
LDI	RTMP1,0XFF
OUT DDRC,RTMP1 			 ;设置PORTC为输出
LDI	RTMP1,0XFF
OUT DDRD,RTMP1 			 ;设置PORTD为输出
LDI	RTMP1,0XFF
OUT DDRB,RTMP1 			 ;设置PORTB为输出
LDI	RTMP1,0X00
OUT PORTB,RTMP1
OUT PORTC,RTMP1
OUT PORTD,RTMP1
LDI RTMP1, 0X00			 ;PUD=0 使能上拉有效
OUT MCUCR, RTMP1

;LDI	RTMP1,0X30			 ;置一
;OUT PORTB,RTMP1 		 ;若PORTxn 为"1“,上拉电阻使能

CLI                  ;禁止全局中断

LDI RTMP1,0X00 			 ;定时器0初始化.
OUT TCNT0,RTMP1
LDI RTMP1,0X01 			 ;没有分频
OUT TCCR0B,RTMP1 
LDI	RTMP1,0X01
STS	TIMSK0,RTMP1		 ;中断0溢出使能
RET

;===========================================
;中断
TIM0_OVF:
	IN    INRTMP1,SREG
	PUSH  INRTMP1
	LDI 	INRTMP1,0X88 			 ;定时器0时间设定.
	OUT 	TCNT0,INRTMP1
;一次的时间是100us.一整段长度是3.3毫秒  160毫秒变换一次
TCC_INT:
	
;8毫秒和500毫秒的产生
;==========================================================
TCC_INT01:
	LDS		INRTMP1,TIMEBUFF01
	INC		INRTMP1
	STS		TIMEBUFF01,INRTMP1
	CPI		INRTMP1,80
	BRLO	TCC_INT02							;小于跳转
	CLR		INRTMP1
	STS		TIMEBUFF01,INRTMP1
	SBR	  CONFLAG,0X01					;ST8mSF  
	LDS		INRTMP1,TIMEBUFF02
	INC		INRTMP1
	STS		TIMEBUFF02,INRTMP1
	CPI		INRTMP1,64
	BRLO	TCC_INT02							;小于跳转
	CLR		INRTMP1
	STS		TIMEBUFF02,INRTMP1
	SBR	  CONFLAG,0X02					;ST05SF
TCC_INT02:
	POP   INRTMP1
	OUT   SREG,INRTMP1
	RETI

⌨️ 快捷键说明

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