;点击这里直接下载该示例源码
;-----------------------------------------------------
;茶具泡茶定时器
;S3F9454,FOSC=3.2MHZ
.include "s3c9454.reg"
;-----------------------------------------------------
;以下为本程序所用变量定义
RUNFLAG EQU 00H ;运行标志寄存器
TMR_1S EQU 01H
TMR_1M EQU 02H
AUTO_TIMER EQU 03H
TMR_LOOP EQU 04H
TMR_TIME EQU 05H
;-----------------------------------------------------
;P0.0--P0.7-----保留未用
;P1.0-----------定时按键,输入
;P1.1-----------保留未用
;P2.0-----------蜂鸣器驱动,输出
;P2.1-----------定时1M指示,1-点亮,0-熄灭
;P2.1-----------定时2M指示,1-点亮,0-熄灭
;P2.1-----------定时3M指示,1-点亮,0-熄灭
;P2.1-----------定时4M指示,1-点亮,0-熄灭
;其它未用
;-----------------------------------------------------
;RUNFLAG.0------key_down,1-有键按下,0-无键按下
;RUNFLAG.1------定时标志,1-已设定定时,0-未定时
;-----------------------------------------------------
;-------<中断向量定义interrupt vector address>>
ORG 0000H ;S3C9454
has only one interrupt vector
VECTOR 00H,INT_9454
;-------smart option
ORG 003CH
DB 00H ;003CH,must
be initialized to 0
DB 00H ;003DH,must
be initialized to 0
DB 0E7H ;003EH,enable
LVR(2.3V)
DB 03H
;-------<程序复位地址>
ORG 0100H
RESET: DI ;disable interrupt
LD BTCON,#10100011B
;Watch-dog disable
LD CLKCON,#00011000B
;selet non-divided CPU clock
LD SP,#0C0H ;Stack
pointer must be set as 0C0H
LD PWMCON,#10011100B
;set PWM input clock=Fosc/2=0.625us
;disable
PWM overlow interrupt
LD PWMDATA,#00H
LD P1CON,#00000101B
;set P1.0,P1.1 is as input with pull-up
LD P2CONH,#00011010B
LD P2CONL,#10101010B
;set P2.0-P2.5 is as push-pull output
LD P2,#00H ;turn
off all output
LD P0CONH,#11010101B
LD P0CONL,#00H ;set
P0.0 is as interrup input(falling)
;set
P0.1,P0.2,P0.3,P0.4,P0.5 is as input
;set
P0.6 is as PWM output
;set
P0.7 is as A/D input
LD P0PND,#00H ;disable
P0.1,P0.0 interrrupt
LD T0DATA,#0FAH
LD T0CON,#01001010B
;set T0 input clock=Fosc/256
;enable
T0 interrrupt
;----------------------------------------------
MAIN:
EI
CLR TMR_1S
CLR TMR_1M
AND RUNFLAG,#01H
LD TMR_LOOP,#00H
LD P2,#00H
LD R0,#10H
CALL BEEP
WAIT_KEY:
LD BTCON,#02H
TM P1,#01H
JR Z,CHECK_KEY
AND RUNFLAG,#0FEH
;if no key pressed,clear key_down flag
TM RUNFLAG,#02H
;check tmr flag
JR Z,WAIT_KEY
JR TMR_CHECK
CHECK_KEY:
TM RUNFLAG,#01H
;check key_down flag
JR NZ,WAIT_KEY
DI
;如果定时键按下,则设定定时
AND P2,#00011110B
TM RUNFLAG,#02H
;check timer flag
JR NZ,LOOP_TMR
FIRST_TIMER:
;if first start
timer
LD P2,#10H
LD TMR_LOOP,#01H
JR START_TIMER
LOOP_TMR:
RR P2
INC TMR_LOOP
CP TMR_LOOP,#04H
JR UGT,FIRST_TIMER
START_TIMER:
OR RUNFLAG,#03H
;set key_down=1,tmr=1
CLR TMR_1S
CLR TMR_1M
CLR TMR_TIME
LD R0,#03H
CALL BEEP
TMR_CHECK:
EI
LD R15,#0FFH
LD R14,#0FFH
WAITA:
DEC R14
JR NZ,WAITA
LD R14,#64H
DEC R15
JR NZ,WAITA
CP TMR_TIME,TMR_LOOP
JR ULT,WAIT_KEY
JR MAIN
;--------------------------------------------------------------------
BEEP:
LD BTCON,#10100011B
;Watch-dog disable
DI
NEXT_BEEP:
LD R6,#0FAH
ONE_BEEP:
LD R5,#27H
XOR P2,#01H
_LOOP:
DEC R5
JR NZ,_LOOP
DEC R6
JR NZ,ONE_BEEP
DEC R0
JR NZ,NEXT_BEEP
LD BTCON,#02H
EI
RET
;------------------------------------------------------------
;interrupt service routine
;TMR0 每20MS 中断一次
INT_9454:
LD BTCON,#02H ;Clear
watch-dog
AND T0CON,#11110110B
;clear t0 interrupt pending
;clear
T0CON.3
INC TMR_1S ;inc
1s counter
CP TMR_1S,#32H
JR ULT,END_INT ;if
counter 1s no comed,back
CLR TMR_1S
INC TMR_1M ;inc
1minutes timer
CP TMR_1M,#3CH
JR ULT,END_INT
CLR TMR_1M
INC TMR_TIME
END_INT:
IRET
;-----------------------------------------------
.END
|