?? clk.asm
字號:
GET_HI_KEY
DECF TEMP ;REDUCE BY 1
SWAPF NEW_KEY,W ;GET HI NIBBLE
ANDLW B'00001111' ; /
MOVWF KEY_NIBL ;SAVE
MOVF TEMP,W ;GET OFFSET TO TBL
ADDWF PC ;LOAD IN PC
GOTO GET147A ;JUMP TO NEXT PART
GOTO GET2580 ; /
GOTO GET369B ; /
GOTO GETCDEF ; /
;
GET147A
MOVLW 4 ;SET COUNT TO 4
GETCOM
MOVWF TEMP ;
GETCOM1
BSF STATUS,C ;SET CARRY
RRF KEY_NIBL ;ROTATE RIGHT
BTFSS STATUS,C ;CHECK IF DONE
GOTO KEY_TBL ;JUMP TO TABLE
DECFSZ TEMP ;DEC COUNT
GOTO GETCOM1 ;LOOP
GOTO GO_RESET ;ELSE ERROR
;
GET2580
MOVLW 8 ;SET COUNT TO 8
GOTO GETCOM
;
GET369B
MOVLW D'12' ;SET COUNT TO 12
GOTO GETCOM
;
GETCDEF
MOVLW D'16' ;SET COUNT TO 16
GOTO GETCOM
PAGE
;
KEY_TBL
DECF TEMP ;REDUCE BY 1
MOVF TEMP,W ;GET IN W
ADDWF PC ;JUMP TO TABLE
RETLW 1 ;KEY 1
RETLW 4 ;KEY 4
RETLW 7 ;KEY 7
RETLW 0A ;KEY A
RETLW 2 ;KEY 2
RETLW 5 ;KEY 5
RETLW 8 ;KEY 8
RETLW 0 ;KEY 0
RETLW 3 ;KEY 3
RETLW 6 ;KEY 6
RETLW 9 ;KEY 9
RETLW 0B ;KEY B
RETLW 0C ;KEY C
RETLW 0D ;KEY D
RETLW 0E ;KEY E
RETLW 0F ;KEY F
;
PAGE
;
MASK_ANNC
MOVLW B'11111100' ;CHK IF DIGIT 1
XORWF PORT_B,0 ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO MASK_ALARM ;ELSE MASK ALARM
MOVLW B'11110011' ;CHK IF DIGIT 2
XORWF PORT_B,0 ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO MASK_COLON ;ELSE MASK COLON
MOVLW B'11001111' ;CHK IF DIGIT 3
XORWF PORT_B,0 ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO MASK_PM ;ELSE MASK PM
MASK_AM
INCF FSR ;INC FSR
BTFSS F0,AM_PM ;IF 0 THEN AM
BSF DIGIT,7 ;SET MSB
GOTO BLNK_LEAD_0 ;NEXT
MASK_PM
INCF FSR ;INC FSR
BTFSC F0,AM_PM ;IF 1 THEN PM
BSF DIGIT,7 ;SET MSB
GOTO BLNK_LEAD_0 ;NEXT
MASK_ALARM
BTFSC FLAG,ALRMLED ;1 THEN LIGHT LED
BSF DIGIT,7 ; /
GOTO BLNK_LEAD_0 ;NEXT
MASK_COLON
BTFSC FLAG,COLON ;1 THEN LIGHT LED
BSF DIGIT,7 ; /
GOTO BLNK_LEAD_0 ;NEXT
;
BLNK_LEAD_0
MOVF FLAG,W ;GET IN W
ANDLW B'00000011' ;SEE IF IN DEM
XORLW B'00000010' ;CHECK
BTFSC STATUS,Z ;NO THEN DO
RETLW 0 ;ELSE RETURN
MOVLW B'11111100' ;SEE IF DIGIT 1
XORWF PORT_B,0 ; /
BTFSS STATUS,Z ;YES THEN SKIP
RETLW 0 ;RETURN
MOVLW B'00111111' ;ELSE MASK G AND ANUNC
ANDWF DIGIT,0 ;GET IN W
XORLW B'00111111' ;SEE IF 0
BTFSS STATUS,Z ;YES THEN SKIP
RETLW 0 ;RETURN
MOVLW B'10000000' ;ELSE BLANK D1
ANDWF DIGIT ; /
RETLW 0 ;RETURN
;
;
;
PAGE
;
;THIS ROUTINE SETS UP PORTS A,B,C AND THE INTERNAL
;REAL TIME CLOCK COUNTER.
INIT_CLK
MOVLW B'00001111' ;MAKE ACTIVE HIGH
MOVWF PORT_A ; /
MOVLW B'00000000' ;SET PORT A AS OUTPUTS
TRIS PORT_A
;
MOVLW B'11111111' ;SET LEVELS HIGH
MOVWF PORT_B ; /
MOVLW B'00000000' ;SET PORT B AS OUTPUTS
TRIS PORT_B
;
MOVLW B'00000000' ;SET LEVELS LOW
MOVWF PORT_C ; /
MOVLW B'00000000' ;SET PORT C AS OUTPUTS
TRIS PORT_C ; /
;
MOVLW B'00000100' ;SET UP PRESCALER
OPTION ; /
;
MOVLW MSEC5 ;RTCC = 5 mSEC
MOVWF RTCC ; /
CLRF MSTMR ;CLEAR MSTMR
CLRF STMR ; & SEC TMR
CLRF MTMR ;& MINUTES
MOVLW 12H ;MAKE HRS = 12
MOVWF HTMR ; /
MOVWF HALARM ;MAKE HRS = 12
CLRF MALARM ; /
MOVLW B'00000011' ;SET TO TEST MODE
MOVWF FLAG ; /
CLRF ALFLAG ;CLEAR ALL FLAG
CLRF AAFLAG ; /
CLRF ENTFLG ; /
GOTO TEST_HARDWARE
;
;All routines related to timer updates are located at
;address 200 and above.
PAGE
ORG 0200
;
UPDATE_TIMERS
MOVF RTCC,W ;SEE IF RTCC = 0
BTFSS STATUS,Z ;IF 0 THEN SKIP
GOTO UPDATE_TIMERS ;ELSE LOOP
MOVLW MSEC5 ;RTCC = 5 mSEC
MOVWF RTCC ; /
INCF MSTMR ;INC 5 MILLI SEC
BTFSC FLAG,KEY_HIT ;NO KEY HIT THEN SKIP
GOTO CHK_DE_BOUNCE ;ELSE DEBOUNCE
UP_TMR_1
MOVF FLAG,W ;ALARM MODE?
ANDLW B'00000011' ; /
XORLW B'00000001' ; /
BTFSS STATUS,Z ;SKIP IF YES
GOTO UP_TMR_2 ;DO NEXT
BSF FLAG,ALRMLED ;LIGHT LED
BSF FLAG,COLON ; /
MOVLW D'100' ;IF 1/2 SEC
SUBWF MSTMR,0 ; BLINK
BTFSS STATUS,C ; /
BCF FLAG,ALRMLED ;ALARM LED
GOTO UP_TMR_3 ;SKIP
UP_TMR_2
BSF FLAG,COLON ;TURN ON
MOVLW D'100' ;<100 BLINK COLON
SUBWF MSTMR,0 ; /
BTFSS STATUS,C ;YES THEN SKIP
BCF FLAG,COLON ;ELSE TURN OFF
UP_TMR_3
MOVF MSTMR,0 ;GET MSTMR IN W
XORLW D'199' ;= 199 THEN SKIP
BTFSS STATUS,Z ; /
RETLW 0
;INC SECONDS COUNT
CLRF MSTMR ;CLEAR MS_TMR
MOVF MIN_SEC,W ;GET MIN_SEC TIMER
ANDLW B'00001111' ;MASK MINUTES
BTFSS STATUS,Z ;ZERO THEN SKIP
DECF MIN_SEC ;REDUCE SECONDS
MOVLW STMR ;LOAD FSR WITH S_TMR
MOVWF FSR ; /
CALL INC_60 ;INC SECONDS
IORLW 0 ;DO AN OPERATION
BTFSS STATUS,Z ;IF RETURN = 0 SKIP
GOTO CHK_AL_TIM ;CHK ALRM
;INC MINUTES COUNT
SWAPF MIN_SEC ;SWAP MIN SEC
MOVF MIN_SEC,W ;GET MIN_SEC IN W
ANDLW B'00001111' ;MASK SECONDS
BTFSS STATUS,Z ;SKIP IF NOT SET
DECF MIN_SEC ;ELSE DEC
SWAPF MIN_SEC ;SWAP BACK
CALL CHK_SILNC_TIM ;SILNCE ON?
MOVLW MTMR ;INC MINUTES
MOVWF FSR ; /
CALL INC_60 ; /
IORLW 0 ;DO AN OPERATION
BTFSS STATUS,Z ;IF 0 THEN SKIP
GOTO CHK_AL_TIM ;CHECK ALRAM TIME
;INC HOUR COUNT
MOVLW HTMR ;GET HTMR IN FSR
MOVWF FSR
CALL INC_HR ;INC HOURS
;
CHK_AL_TIM
BTFSS ALFLAG,ALONOF ;IF OFF QUIT
RETLW 0 ; /
BTFSC ALFLAG,SILNC ;RET IF IN SILENCE
RETLW 0
BTFSC ALFLAG,INAL ;ALREADY DONE
GOTO CHK_1_MIN ;SEE IF 1 MIN UP
; RETLW 0 ;YES THEN QUIT
MOVF HALARM,W ;CHK HRS
XORWF HTMR,W ;EQUAL?
BTFSS STATUS,Z ;YES THEN SKIP
RETLW 0 ;ELSE RET
MOVF MALARM,W ;CHK MIN
XORWF MTMR,W ;EQUAL?
BTFSS STATUS,Z ;YES THEN SKIP
RETLW 0 ;ELSE RET
MOVF STMR,W ;SEE IF SEC=0
BTFSS STATUS,Z ;YES THEN SKIP
RETLW 0 ;NO THEN RET
BSF ALFLAG,INAL ;SET IN ALARM FLAG
MOVLW 10 ;SET 1 MIN TIMER
MOVWF MIN_SEC ; /
RETLW 0
;
CHK_1_MIN
SWAPF MIN_SEC,W ;SWAP IN W
ANDLW B'00001111' ;CHK MINUTES
BTFSS STATUS,Z ;0 THEN SKIP
RETLW 0 ;ELSE RET
BCF ALFLAG,INAL ;CLR IN ALARM
BCF ALFLAG,INAA ;CLR IN AA
BSF PORT_A,BEP ;STOP BEEPER
RETLW 0
;
INC_60
INCF F0 ;INC AND GET IN W
MOVF F0,0 ; /
ANDLW B'00001111' ;MASK HI BITS
XORLW B'00001010' ;= 10 THEN MAKE IT 0
BTFSS STATUS,Z ; /
RETLW 1 ;ELSE RETURN NON ZERO
MOVLW B'11110000' ;ZERO LSB
ANDWF F0 ; /
SWAPF F0 ;SWAP INDIRECT
INCF F0 ;INC
MOVF F0,0 ;GET IN W
SWAPF F0 ;SWAP F0 BACK
XORLW D'6' ;=6 THEN SKIP
BTFSS STATUS,Z ; /
RETLW 1 ;ELSE RETURN NZ
CLRF F0 ; /
RETLW 0 ;RET 0
;
PAGE
;
CHK_SILNC_TIM
BTFSS ALFLAG,SILNC ;CHK IF IN SILENCE
RETLW 0 ;NO THEN SKIP
SWAPF MIN_SEC,W ;GET MIN IN W
ANDLW B'00001111' ;MASK SECS
BTFSS STATUS,Z ;ZERO?
RETLW 0 ;NO THEN RET
BCF ALFLAG,SILNC ;RESET SILENCE
MOVLW 10 ;SET I MIN TIMER
MOVWF MIN_SEC ; /
RETLW 0
;
;
CHK_DE_BOUNCE
BTFSC ENTFLG,INKEYBEP ;IN KEY BEEP?
GOTO CHK_DEB_1 ;YES THEN DEC TIMER
BTFSS FLAG,KEY_BEEP ;KEY BEEP SET?
GOTO CHK_SERV ;NO, SEE IF SERVICED
BTFSC ALFLAG,INAA ;IN AA?
GOTO CHK_BEP_ON ;YES THEN SEE IF ON
CHK_DEB_1
BSF ENTFLG,INKEYBEP ;SET FLAG
MOVF DEBOUNCE,W ;GET IN W
BTFSC STATUS,Z ;NZ THEN SKIP
MOVLW D'20' ;ELSE DB 100 mSEC
MOVWF DEBOUNCE ; /
BCF PORT_A,BEP ;TURN ON BEEPER
DECFSZ DEBOUNCE ;DEC AND CHK
GOTO UP_TMR_1 ;GO BACK
BSF PORT_A,BEP ;TURN OFF BEEPER
CHK_SERV
; CLRF DEBOUNCE
; BSF PORT_A,BEP
BTFSS FLAG,SERVICED ;SERVICED THEN SKIP
GOTO UP_TMR_1 ;GO BACK
BCF FLAG,SERVICED ;ELSE CLEAR FLAGS
BCF FLAG,KEY_HIT ; /
BCF FLAG,KEY_BEEP ;RESET FLAG
BCF ENTFLG,INKEYBEP ; /
GOTO UP_TMR_1 ;GO BACK
;
CHK_BEP_ON
BTFSS PORT_A,BEP ;IF OFF THEN SKIP
GOTO UP_TMR_1 ;ELSE WAIT
GOTO CHK_DEB_1 ;RETURN
;
;
INC_HR
INCF F0 ;INC HOUR TIMER
MOVF F0,W ;GET HR TMR IN W
MOVWF TEMP ;SAVE IN TEMP
ANDLW B'00001111' ;CHK LO BYTE = 10
XORLW D'10' ; /
BTFSS STATUS,Z ;YES THEN SKIP
GOTO INC_AM_PM ;ELSE CHK 12
MOVLW B'00010000' ;LOAD 1 IN MSB
MOVWF F0
GOTO RESTORE_AM_PM ;RESTORE AM/PM
INC_AM_PM
BCF F0,AM_PM ;CLEAR AM/PM
MOVF F0,W ;GET IN W
XORLW 12H ;SEE IF 12 HEX
BTFSS STATUS,Z ;YES THEN SKIP
GOTO CHK_13 ;ELSE CHK 13
BTFSS TEMP,AM_PM ;IF SET, SKIP
GOTO SET_AM_PM ;ELSE SET
BCF F0,AM_PM ;CLEAR FLAG
RETLW 0 ;RETURN
SET_AM_PM
BSF F0,AM_PM ;SET FLAG
CHK_13
MOVF F0,W ;GET IN W
XORLW 13H ;SEE IF 13
BTFSS STATUS,Z ;YES THEN SKIP
GOTO RESTORE_AM_PM
SET_1_HR
MOVLW B'00000001' ;SET TO 1
MOVWF F0
RESTORE_AM_PM
BTFSC TEMP,AM_PM ;SKIP IF AM
BSF F0,AM_PM ;ELSE SET TO PM
RETLW 0
;
;
;
PAGE
ORG 400
;
;KEY DEFINITIONS
ALARM_KEY EQU 0A
CE_KEY EQU 0B
SNOOZE_KEY EQU 0C
AM_PM_KEY EQU 0D
CLR_ALARM_KEY EQU 0E
SET_KEY EQU 0F
;
SERVICE_KEYS
BTFSS FLAG,KEY_HIT ;NO KEY HIT THEN ...
RETLW 0 ;RETURN
BTFSC FLAG,SERVICED ;IF NOT SERVICED SKIP
RETLW 0 ;ELSE RETURN
BSF FLAG,SERVICED ;SET SERVICED FLAG
MOVF FLAG,W ;GET MODE OF OPERATION
ANDLW B'00000011' ; /
BTFSC STATUS,Z ;00 THEN RTM
GOTO RTMKS ;RTM KEY SERVICE
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -