一个S3F9454/9444的编程示例
文章来源: 本站原创   更新时间: 2006-07-07

;点击这里直接下载该示例源码
;-----------------------------------------------------
;茶具泡茶定时器
;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

相关备注:
 
三星单片机开发网首页