
;;**** APPLICATION NOTE AVR ICE200 *******************************************
;* Title: FOR ADJUST TEST PCB.
;* Version: 1.0
;* Last Updated:
;* MCU: AT90S8515
;* AUTHOR: 东哥单片机学习网( www.picavr.com )
;* DESCRIPTION: 基于AT90S8515的LED闪光与电子钟显示程序
;****************************************************************************
;****************************
; CONTANCE NUMBER DEFINATION
;****************************
.EQU FCLK =4000 ;SYSTEM CLOCK FREQ.=4MHz
;*************************
;PORT A PINS;
;*************************
.EQU A0 =0 ;
.EQU A1 =1 ;
.EQU A2 =2 ;
.EQU A3 =3 ;
.EQU A4 =4 ;
.EQU A5 =5 ;
.EQU A6 =6 ;
.EQU A7 =7 ;
;*************************
;Port B pins; KEY CONTROL
;*************************
.EQU START =7 ;START KEY
.EQU RS =1 ;LCD MODULE’S RS PIN
.EQU RW =2 ;LCD MODULE’S RW PIN
.EQU ELCD =3 ;LCD MODULE’S E PIN
;*************************
;Port C pins;
;*************************
.EQU APIN =0 ;
.EQU BPIN =1 ;
.EQU STROBE =4 ;
.EQU BUSY =5 ;
.EQU OVRNG =6 ;
.EQU D5 =7 ;
;*************************
;Port D pins;
;*************************
.EQU CP1 =0 ;
.EQU DA1 =1 ;
.EQU D7 =7 ;
.EQU D6 =6 ;
;*************************
;SREG(状态寄存器)
;*************************
.EQU C =0 ;
;.EQU Z =1 ;
.EQU N =2 ;
.EQU V =3 ;
.EQU S =4 ;
.EQU H =5 ;
.EQU T =6 ;
.EQU I =7 ;
;*************************
.INCLUDE "8515DEF.INC"
;*********************************************
; DEFINE VARIAVLE
; R0: USED BY "LPM" INSTRUCTION
; R26--R31=X/Y/Z: LOOK AS COMMON REGISTER
;*********************************************
.DEF FLAG =R19;
.DEF ADH =R20;
.DEF ADM =R21;
.DEF ADL =R22;
.DEF DLREG =R23;USED IN DELAY SUBROUTE
.DEF COMRL =R24;COMMON REGISTER,LOW BYTE, ABLE TO USE "ADIW"
.DEF COMRH =R25;COMMON REGISTER,HIGH BYTE
;--------------------------------------
.DSEG
.ORG 0X60
CNTER: .BYTE 1 ;
TEMP: .BYTE 7 ;
MIN: .BYTE 1 ;
SECC: .BYTE 1 ;
COUNT: .BYTE 1 ;
COUNT_BUF: .BYTE 1 ;
;*******************************
; DEFINE BIT FLAG
;*******************************
.EQU DISPB =0 ;
.EQU B_Y =1 ;
.EQU B_TOU =2 ;
;*****************************************************
; EEPROM segment
; DEFAULT ANGLE: SEL1=2--9, SEL2=10--18, SEL3=20--29
;*****************************************************
.ESEG
.ORG 0X05
DATA1: .DW 0XAA55
;****Source code**********************************************
.CSEG ;CODE segment
.ORG 0X000
RJMP RESET ;Reset handler(外部复位,上电复位及看门狗溢出复位)
RJMP INTT0 ;INT0 HANDLER(外部中断请求0)
RETI ;INT1 HANDLER(外部中断请求1)
RETI ;TIMER1 CAPTURE(定时/计数器1捕捉事件)
RETI ;T1 COMPAROR A(定时/计数器1比较A匹配)
RETI ;T1 COMPAROR B(定时/计数器1比较B匹配)
RETI ;T1 OVERFLOW(定时/计数器1溢出)
RJMP TIMER0 ;T0 OVERFLOW(定时/计数器0溢出)
RETI ;SPI HANDLER(SPI串行传送完成)
RETI ;UART.RX COMPLETE HANDLER(UART接收完成)
RETI ;UART.UDRE HANDLER(UART数据寄存器空)
RETI ;UART.TX COMPLETE HANDLER(UART发送完成)
RETI ;ANALOG COMPAROR HANDLER(模拟比较器)
;*** Reset handler *******************************************
RESET: LDI XL, HIGH(RAMEND) ; SET SP VALUE
OUT SPH, XL ;
LDI XL, LOW(RAMEND) ;
OUT SPL, XL ;
;---------------------------------------------
INITIO: CLR XL ;
OUT SREG, XL ;(状态寄存器),禁止总中断开放位
LDI XL, 0B01000000 ;开放INT0外部中断,禁止INT1外部中断
OUT GIMSK, XL ;(通用中断屏蔽寄存器GIMSK)
LDI XL, 0B00000010 ;INT0下降沿产生中断
OUT MCUCR, XL ;(通用控制寄存器MCU)
LDI XL, 0B00001111 ;开放WDT WDE置1开放看门狗,溢出时间为1.9S
OUT WDTCR, XL ;
CLR XL ; SET SPI CONTROL
OUT SPIE, XL ;()
OUT SPSR, XL ;(SPI控制寄存器)
OUT UCR, XL ;(UART控制寄存器) SET UART CONTROL
LDI XL, 0B10000000 ; SET ANALOG COMPAROR CONTROL
OUT ACSR, XL ;(模拟比较器控制和状态寄存器ACSR)
;--------------------------------------------
LDI XL, 0B11111111 ;PORTA IS OUTPUT-PORT
OUT DDRA, XL ;
OUT PORTA, XL ;
;-------------------------------------------
LDI XL, 0B00011111 ;PC7--PC4: INPUT,Hi-Z, PC3--PC0:OUTPUT
OUT DDRC, XL ;
LDI XL, 0B11111111 ;
OUT PORTC, XL ;
;-------------------------------------------
LDI XL, $FE ;PORTB0 IS INPUT-PORT
OUT DDRB, XL ;PORTB0 Hi-Z
CLR XL ;
OUT PORTB, XL ;
;-------------------------------------------
LDI XL, 0B11111011 ;PD2=输入,PD0-PD1,PD3-PD7=输出
OUT DDRD, XL ;
LDI XL, $FF ;PORTD=FFH
OUT PORTD, XL ;
;--------------------------------------------
LDI XL, 0B00000000 ;DISABLE T1 INTERRUPT,ENABLE T0 INTERRUPT
OUT TIMSK, XL ;(定时/计数器中断屏蔽寄存器TIMSK)
LDI XL, 0X02 ;T0 INPUT FREQ=FCLK 产生中断的时间={1/(4M/8)} ;*100=200uS TCNT0初值为06
OUT TCCR0, XL ;(定时器0控制寄存器)
CLR XL ;
OUT TCCR1A,XL ;(定时器1控制寄存器A)
LDI XL, 0B10000101 ;T1 INPUT FREQ=FCLK/1024
OUT TCCR1B,XL ;(定时器1控制寄存器B)
;-------------------------------------------
;
INITRAM: CLR XL ;INITILIZE RAM,60H--25FH
CLR YH ;ALL CLEAR 0
LDI YL, 0X60 ;
INITRAM1: WDR ;RESET WATCHDOG
ST Y+, XL ;
CPI YH, HIGH(RAMEND) ;清0程序
BRNE INITRAM1 ;
CPI YL, LOW(RAMEND) ;
BRNE INITRAM1 ;
;-------------------------------------------
; SEI ;开放总中断
;------------------------------------------
LDI XL,156 ;200uS
OUT TCNT0,XL ;
CLR R16 ;
CLR FLAG ;
LDI R18,$FF ;
;---------------------------------------
;**************************************
;**************************************
; MAIN PROGRAM PROCESS
;**************************************
MAIN:
WDR
RCALL KEY ;
; RCALL DISPLAY ;
RCALL LEDDISP ;
RJMP MAIN ;
;***************************************
;***************************************
DISP:
SBI PORTD,D7 ;
RCALL WAITE_164 ;
CBI PORTD,D7 ;
RCALL DEL2 ;
SBI PORTD,D7 ;
RET ;
;***************************************
WAITE_164:
LDI R16,$08 ;
MOV R17,R18 ;
WLOOP:
CBI PORTD,CP1 ;
ROL R17 ;
BRCS W_1 ;
CBI PORTD,DA1 ;
RJMP W_0 ;
W_1: SBI PORTD,DA1 ;
W_0: SBI PORTD,CP1 ;
DEC R16 ;
BRNE WLOOP ;
RET ;
;*****************************************
;INT0中断子程序
;----------------------------------------
INTT0:
PUSH XL ;
IN XL,SREG
PUSH XL ;
;----------------------------------------
CLI ;关放总中断
; LDI XL, 0B00000000 ;DISABLE T1 INTERRUPT,ENABLE T0 INTERRUPT
; OUT TIMSK, XL ;(定时/计数器中断屏蔽寄存器TIMSK)
;---------------------------------------
CLR XL ;
OUT GIFR,XL ;清INTF0中断标志位
OUT TIFR,XL ;清TMR0中断标志位
LDI XL,156 ;200uS
OUT TCNT0,XL ;
CBI PORTC,0 ;
;----------------------------------------
CPI R18,70 ;
BRSH INT0END ;
; BRCC INT0END ;
CBI PORTC,3 ;
CPI R18,60 ;
BRLO INT0END ;
; BRCS INT0END ;
CBI PORTC,2 ;
;----------------------------------------
INT0END:
SEI ;开放总中断
; LDI XL, 0B00000010 ;DISABLE T1 INTERRUPT,ENABLE T0 INTERRUPT
; OUT TIMSK, XL ;(定时/计数器中断屏蔽寄存器TIMSK)
CLR R18 ;
POP XL ;
OUT SREG,XL ;
POP XL ;
RETI ;
;*****************************************
;*****************************************
;TMR0中断入口程序
;*****************************************
TIMER0:
PUSH XL ;
IN XL,SREG
PUSH XL ;
;---------------------------------
; LDI XL,156 ;200uS
; OUT TCNT0,XL ;
INC R18 ;
; INC ADL ;
; CPI ADL,50 ;
; BRNE TMREND ;
; CLR ADL ;
;----------------------------------
; INC ADM ;
; CPI ADM,100 ;
; BRNE TMREND ;
; CLR ADM ;
;---------------------------------
; LDI XL,$01 ;
; EOR FLAG,XL ;
; OUT PORTC,FLAG ;
;***********************************
;---------------------------------
TMREND:
POP XL ;
OUT SREG,XL ;
POP XL ;
RETI ;
;*************************************
;****************************************
; KEY PROCESS
;OUTPUT: C, =0:NO KEY INPUT
; =1: START INPUT
;USED REGISTER: XL,XH
;****************************************
KEY: WDR ;RESET WATCH-DOG TIMER
IN XL,PINC ;
ANDI XL,0B11100000 ;
MOV R2,XL ;
LDI XL,0B11100000 ;
CP R2,XL ;
BREQ KEYEND ;
RCALL DEL ;
IN XL,PINC ;
ANDI XL,0B11100000 ;
MOV R2,XL ;
LDI XL,0B11100000 ;
CP R2,XL ;
BREQ KEYEND ;
;--------------------------------------------
CBI PORTC,0 ;
SBIC PINC, 7 ;
RJMP KEY11 ;
WAITREL1: WDR ;RESET WATCH-DOG TIMER
RCALL DISP ;
SBIS PINC, 7 ;
RJMP WAITREL1 ;
;------------------------------------------
LDI XL,0B00000001 ;
EOR R18,XL ;
RJMP KEYEND ;
;******************************************
KEY11:
SBIC PINC, 6 ;
RJMP KEY12 ;
WAITREL2: WDR ;RESET WATCH-DOG TIMER
RCALL DISP ;
SBIS PINC, 6 ;
RJMP WAITREL2 ;
;-----------------------------------------
LDI XL,0B00000010 ;
EOR R18,XL ;
;******************************************
KEYEND:
RET
;******************************************
KEY12:
SBIC PINC, 5 ;
RJMP KEYEND ;
WAITREL3: WDR ;RESET WATCH-DOG TIMER
RCALL DISP ;
SBIS PINC, 5 ;
RJMP WAITREL3 ;
;-------------------------------------------
LDI XL,0B00000100 ;
EOR R18,XL ;
RJMP KEYEND ;
;******************************************
;******************************************
; DELAY A MOMENT, MIN=0.25ms, MAX=64ms
; INPUT: DLREG
; USED REGISTER: DLREG
;******************************************
DELAY: PUSH XL ;
PUSH XH ;
IN XL, TCNT1L ; T1 COUNTER’S f=FCLK/1024
DELAY1: WDR ; RESET WDT
IN XH, TCNT1L ;
SUB XH, XL ;
CP XH, DLREG ;
BRLO DELAY1 ;
POP XH ;
POP XL ;
RET ;
;******************************************
DEL:
; LDI R19,$03 ;
LDI XL,40 ;
LDI XH,10 ;
DEL1: DEC XL ;
BRNE DEL1 ;
DEC XH ;
BRNE DEL1 ;
; WDR ;
; DEC R19 ;
; BRNE DEL1 ;
RET ;
;******************************************
DEL2:
LDI XL,10 ;
LDI XH,10 ;
DEL3: DEC XL ;
BRNE DEL3 ;
DEC XH ;
BRNE DEL3 ;
RET ;
;******************************************
; DELAY , MIN=4ms, MAX=1Sec
; INPUT: DLREG
; USED REGISTER: DLREG
;******************************************
DL64MS: PUSH XL
PUSH XH
IN XL, TCNT1L
IN XL, TCNT1H ; T1 COUNTER’S f=FCLK/64
DL64MS1: WDR ; RESET WDT
IN XH, TCNT1L
IN XH, TCNT1H
SUB XH, XL
CP XH, DLREG
BRLO DL64MS1
POP XH
POP XL
RET
;*********************************************
; DECIL-->HEX
; INPUT: XL
; OUTPUT: YL=XL.(b7b6b5b4)*10 + XL.(b3b2b1b0)
; USED REGISTER: XL,XH,YL,YH
;*********************************************
DECHEX: MOV YL, XL ;XL.(b7b6b5b4)-->YL.(b3b2b1b0)
ANDI XL, $0F ;
ANDI YL, $F0 ;
SWAP YL ;
LSL YL ;YL*2
MOV XH, YL ;YL-->XH
LSL YL ;YL*4
LSL YL ;
ADD YL, XH ;
ADC YL, XL ;
RET ;
;*********************************************
; HEX-->DECIL
; INPUT: XL
; OUTPUT: YL=(((((((b7*2+b6)+b5)*2+...)*2+b0
; USED REGISTER: XL,YL,YH,ZL,ZH
;*********************************************
HEXDEC: CLR YL
LDI ZL, 6
LDI ZH, 8
HEXDEC1: CLC
ROL XL
ROL YL
SBRC YL, 4
ADD YL, ZL
MOV YH, YL
ANDI YH, $0F
CPI YH, $0A
BRLO HEXDEC2
ADD YL, ZL
HEXDEC2: DEC ZH
BRNE HEXDEC1
RET
;*********************************************
;**********************************************
; WHEN OPERATING LCD MODULE, WAIT FOR A MOMENT
; USED REGISTER:
;**********************************************
WAIT: PUSH XL
CLR XL
WAIT1: INC XL
CPI XL, 0X0A
BRLO WAIT1
POP XL
RET ;
;*************************************
;*************************************
LEDDISP:
LDI R16,$FF ;
LDI R17,$08 ;
CLC ;
LEDLOOP:
WDR
ROR R16 ;
OUT PORTA,R16 ;
LDI DLREG,$08 ;
RCALL DL64MS ;
DEC R17 ;
BRNE LEDLOOP ;
CBI PORTC,0 ;
SBI PORTC,1 ;
LDI XL,$FF ;
OUT PORTA,XL ;
LDI DLREG,$08 ;
RCALL DL64MS ;
;-----------------------------------------
LDI R16,$FF ;
LDI R17,$08 ;
CLC ;
LEDLOOP1:
WDR
ROL R16 ;
OUT PORTA,R16 ;
LDI DLREG,8 ;
RCALL DL64MS ;
DEC R17 ;
BRNE LEDLOOP1 ;
CBI PORTC,1 ;
SBI PORTC,0 ;
LDI XL,$FF ;
OUT PORTA,XL ;
RJMP LEDDISP ;
;***************************************
;***************************************
DISPLAY:
CBI PORTC,0 ;
MOV XL,ADL ;
ANDI XL,$0F ;
LDI ZL,LOW(2*TABLE) ;
LDI ZH,HIGH(2*TABLE) ;
ADD ZL,XL
LPM ;
MOV XL,R0 ;
OUT PORTA,XL ;
SBRC FLAG,DISPB ;
RJMP DISPDOT1 ;
CBI PORTA,7 ;
RJMP DISPNEXT1 ;
DISPDOT1:
SBI PORTA,7 ;
DISPNEXT1:
RCALL DELAY ;
SBI PORTC,0 ;
;----------------------------------------
CBI PORTC,1 ;
MOV XL,ADL ;
SWAP XL ;
ANDI XL,$0F ;
LDI ZL,LOW(2*TABLE) ;
LDI ZH,HIGH(2*TABLE) ;
ADD ZL,XL
LPM ;
MOV XL,R0 ;
OUT PORTA,XL ;
SBRC FLAG,DISPB ;
RJMP DISPDOT2 ;
CBI PORTA,7 ;
RJMP DISPNEXT2 ;
DISPDOT2:
SBI PORTA,7 ;
DISPNEXT2:
RCALL DELAY ;
SBI PORTC,1 ;
;----------------------------------------
CBI PORTC,2 ;
MOV XL,ADH ;
ANDI XL,$0F ;
LDI ZL,LOW(2*TABLE) ;
LDI ZH,HIGH(2*TABLE) ;
ADD ZL,XL
LPM ;
MOV XL,R0 ;
OUT PORTA,XL ;
RCALL DELAY ;
SBI PORTC,2 ;
;----------------------------------------
CBI PORTC,3 ;
MOV XL,ADH ;
SWAP XL ;
ANDI XL,$0F ;
LDI ZL,LOW(2*TABLE) ;
LDI ZH,HIGH(2*TABLE) ;
ADD ZL,XL
LPM ;
MOV XL,R0 ;
OUT PORTA,XL ;
RCALL DELAY ;
SBI PORTC,3 ;
RET ;
;****************************************
;***********************************
TABLE: .DB $C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$90
.DB $88,$83,$C6,$A1,$86,$8E
;***********************************
呵呵