?? clk.asm
字號:
MOVWF TEMP ;SAVE IN TEMP
DECFSZ TEMP ;REDUCE TEMP
GOTO SK1 ;SKIP
GOTO ATMKS ;01, DO ALARM MODE
SK1
DECFSZ TEMP ;REDUCE TEMP
RETLW 0 ;11 THEN RETURN
GOTO DEMKS ;10, DATA ENTRY MODE
;
;REAL TIME MODE KEY SERVICE
RTMKS
CALL CHK_AL_KEYS ;CHK ALARM KEYS
IORLW 0 ;SEE IF NZ RET
BTFSC STATUS,Z ;NZ THEN SKIP
RETLW 0 ;ELSE RETURN
MOVLW SET_KEY ;SEE IF SET KEY
XORWF NEW_KEY,W ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO SERV_SET_RTM ;SERVICE SET KEY
MOVLW ALARM_KEY ;ALARM KEY?
XORWF NEW_KEY,W ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO SERV_ALARM_RTM ;ELSE SERVICE ALARM
IGNORE_KEY
RETLW 0 ;ELSE RETURN
;
;ALARM TIME MODE KEY SERVICE
ATMKS
CALL CHK_AL_KEYS ;CHECK ALRM KEYS
IORLW 0 ;CHECK IF 0
BTFSC STATUS,Z ;NZ THEN SKIP
RETLW 0 ;ELSE RETURN
MOVLW SET_KEY ;SEE IF SET KEY
XORWF NEW_KEY,W ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO SERV_SET_ATM
MOVLW ALARM_KEY ;GET ALARM KEY
XORWF NEW_KEY,W ;SEE IF HIT
BTFSC STATUS,Z ;NO THEN SKIP
GOTO SERV_ALARM_ATM ;ELSE SERVICE
GOTO IGNORE_KEY
;
;DATA ENTRY MODE KEY SERVICE
DEMKS
CALL CHK_AL_KEYS ;CHECK ALARM KEYS
IORLW 0 ;CHK IF 0
BTFSC STATUS,Z ;NZ THEN SKIP
RETLW 0 ;ELSE RETURN
MOVLW SET_KEY ;IF SET KEY THEN END
XORWF NEW_KEY,W ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO DEMKS_END ;GOTO END
MOVLW CE_KEY ;IF CLEAR ENTRY
XORWF NEW_KEY,W ; /
BTFSC STATUS,Z ;SKIP IF NO
GOTO DEMKS_END_1 ;ABANDON ENTRY
BTFSS ENTFLG,HR10 ;10'S HRS DONE?
GOTO ENT_HR_10 ;NO THEN GET
BTFSS ENTFLG,HR ;HRS DONE?
GOTO ENT_HRS ;NO THEN GET
BTFSS ENTFLG,MIN10 ;10'S MIN. DONE?
GOTO ENT_MIN_10 ;NO THEN GET
BTFSS ENTFLG,MIN ;MIN DONE?
GOTO ENT_MIN ;NO THEN GET
GOTO ENT_AM_PM ;NO THEN GET
DEMKS_END
BTFSS ENTFLG,RTATS ;GET OLD STATUS
GOTO LD_RTM ;LOAD IN TIME
MOVF MENTRY,W ;LD IN ALARM
MOVWF MALARM ; /
MOVF HENTRY,W ; /
MOVWF HALARM ; /
BCF FLAG,ALRMLED ;CLEAR FLAG
BTFSC ALFLAG,ALONOF ;SEE IF ON-OFF
BSF FLAG,ALRMLED ;ELSE SET
DEMKS_END_1
BCF FLAG,0 ;RTM MODE
BCF FLAG,1 ; /
BCF FLAG,FLASH ;STOP FLASH
SERV_COM_RET
BSF FLAG,KEY_BEEP
RETLW 0 ;RETURN
;
LD_RTM
MOVF MENTRY,W ;LD IN RTM
MOVWF MTMR ; /
MOVF HENTRY,W ; /
MOVWF HTMR ; /
CLRF MSTMR ;CLR TIME
CLRF STMR ; /
GOTO DEMKS_END_1 ;GO BACK
;
ENT_HR_10
MOVF NEW_KEY,W ;SEE IF 0
BTFSC STATUS,Z ;NZ THEN SKIP
GOTO LD_HENTRY_0 ;LOAD 0
DECFSZ NEW_KEY,0 ;1 THE SKIP
GOTO IGNORE_KEY ;ELSE IGNORE KEY
BSF HENTRY,4 ;SET TO 1
BSF ENTFLG,HR10 ;SET FLAG
GOTO SERV_COM_RET ;GO GET NEXT
LD_HENTRY_0
BCF HENTRY,4 ;SET TO 0
BSF ENTFLG,HR10
GOTO SERV_COM_RET ;
ENT_HRS
MOVLW HENTRY ;USE INDIRECT ADDR.
MOVWF FSR ; /
BTFSC HENTRY,4 ;SEE IF 0
GOTO ALLOW0_2 ;YES THEN 0,1&2
MOVLW D'10' ;SEE IF 0 - 9
SUBWF NEW_KEY,W ; /
BTFSC STATUS,C ;IF C THEN SKIP
GOTO IGNORE_KEY ;ELSE IGNORE
ENT_LO_COM1
BSF ENTFLG,HR ;SET FLAG
ENT_LO_COM
MOVF F0,W ;LD HRS
ANDLW B'11110000' ;MASK LO NIBL
IORWF NEW_KEY,W ;OR NEW KEY
MOVWF F0 ;SAVE BACK
GOTO SERV_COM_RET ;GET NEXT
ALLOW0_2
MOVLW D'3' ;SEE IF 0 - 2
SUBWF NEW_KEY,W ; /
BTFSC STATUS,C ;<3 THEN SKIP
GOTO IGNORE_KEY
GOTO ENT_LO_COM1 ; /
;
ENT_MIN_10
MOVLW MENTRY ;DO INDIRECT ADDR.
MOVWF FSR ; /
MOVLW D'6' ;ALLOW 0 - 5
SUBWF NEW_KEY,W ; /
BTFSC STATUS,C ;IF C THEN SKIP
GOTO IGNORE_KEY ;ELSE IGNORE
SWAPF F0,W ;SWAP AND GET
ANDLW B'11110000' ;MASK LO NIBL
IORWF NEW_KEY,W ;OR NEW KEY
MOVWF F0 ;SAVE BACK
SWAPF F0 ;SWAP BACK
BSF ENTFLG,MIN10
GOTO SERV_COM_RET ;GET NEXT
;
ENT_MIN
MOVLW MENTRY ;DO INDIRECT
MOVWF FSR ; /
MOVLW D'10' ;ALLOW 0 - 9
SUBWF NEW_KEY,W ;SEE IF >
BTFSC STATUS,C ;NO THEN SKIP
GOTO IGNORE_KEY ;ELSE IGNORE
BSF ENTFLG,MIN ;SET FLAG
GOTO ENT_LO_COM ; /
;
ENT_AM_PM
MOVLW AM_PM_KEY ;AM/PM KEY?
XORWF NEW_KEY,W ; /
BTFSS STATUS,Z ;YES THEN SKIP
GOTO IGNORE_KEY
BTFSS HENTRY,AM_PM ;TEST BIT
GOTO SETAMPM ;ELSE SET
BCF HENTRY,AM_PM ;CLEAR FLAG
GOTO SERV_COM_RET ;GOTO END
SETAMPM
BSF HENTRY,AM_PM ;SET FLAG
GOTO SERV_COM_RET
;
PAGE
;
SERV_SET_RTM
MOVF MTMR,W ;TRANSFER TIME
MOVWF MENTRY ;TO DATA ENTRY
MOVF HTMR,W ; /
MOVWF HENTRY ; /
SERV_COM
MOVF FLAG,W ;SAVE IN W
ANDLW B'00000001' ;ATM OR RTM MODE?
MOVWF ENTFLG ;SAVE IN ENTFLG
MOVLW B'11110010' ;FORCE 1S
IORWF FLAG ; /
BCF FLAG,0 ; /
RETLW 0
;
SERV_SET_ATM
MOVF MALARM,W ;TRANSFER ALARM
MOVWF MENTRY ;TO DATA ENTRY
MOVF HALARM,W ; /
MOVWF HENTRY ; /
BSF ALFLAG,ALONOF ;SET FLAG
GOTO SERV_COM ;GOTO COMMON
;
SERV_ALARM_ATM
BTFSS ALFLAG,ALONOF ;TEST ON/OFF
GOTO SET_ALONOF ;SET ON/OF FLG
BCF ALFLAG,ALONOF ;CLEAR FLAG
GOTO SERV_ATM_COM ;RET THRO COM
SET_ALONOF
BSF ALFLAG,ALONOF ;SET FLAG
SERV_ATM_COM
BSF FLAG,KEY_BEEP ;BEEP
MOVLW B'11110000' ;CLEAR SEC COUNT
ANDWF MIN_SEC ; /
RETLW 0 ;RETURN
;
SERV_ALARM_RTM
BSF FLAG,KEY_BEEP ;SET BEEP FLAG
BSF FLAG,0 ;SET TO ALARM TIME
BCF FLAG,1 ; /
MOVLW D'05' ;SAVE 5 IN MIN_SEC
MOVWF MIN_SEC ; /
RETLW 0
;
SERV_SNOOZE
MOVLW 0A0 ;SNOOZE FOR 10 MINS
MOVWF MIN_SEC ; /
BSF ALFLAG,SILNC ;SET FLAG
CLR_AL_COM
BSF FLAG,KEY_BEEP ;SET BEEP FLAG
CLRF AATMR ;RESET AA TIMER
CLRF AAFLAG ;CLEAR AA FLAGS
BCF ALFLAG,INAA ;RESET INAA FLAG
BSF PORT_A,BEP ;TURN OFF BEEPER
RETLW 0 ;RET
;
CHK_AL_KEYS
BTFSS ALFLAG,ALONOF ;ALARM ON?
RETLW 1 ;NO THEN RET
BTFSS ALFLAG,INAL ;IN ALARM?
RETLW 1 ;NO THEN SKIP
MOVLW CLR_ALARM_KEY ;CHECK IF CLR ALARM
XORWF NEW_KEY,W ; /
BTFSC STATUS,Z ;NO THEN SKIP
GOTO CLR_ALARM ;ELSE CLEAR ALARM
MOVLW SNOOZE_KEY ;SEE IF SNOOZE HIT
XORWF NEW_KEY,W ; /
BTFSS STATUS,Z ;YES THEN SKIP
RETLW 1
GOTO SERV_SNOOZE
;
CLR_ALARM
BCF ALFLAG,INAL ;CLEAR ALARM
BCF ALFLAG,SILNC ;CLEAR SILENCE
MOVLW B'00001111' ;CLEAR MINS
ANDWF MIN_SEC ; /
GOTO CLR_AL_COM
;
ORG 600
;If the AA alarm is set, then this routine takes care of
;the timing in sounding the alarm.
;
SOUND_AA
BTFSS ALFLAG,INAL ;SKIP IF IN ALRM
RETLW 0 ;ELSE RETURN
BTFSC ALFLAG,SILNC ;SKIP IF NOT IN SIL
RETLW 0 ;ELSE RET
BTFSC ENTFLG,INKEYBEP ;SKIP IF NOT IN KEY BEP
GOTO CHK_COLSN ;CHK COLLISION
SND_AA_0
BTFSS ALFLAG,INAA ;SKIP IF IN AA
SND_AA_1
CALL INIT_AA ;INIT ALL
BTFSS AAFLAG,0 ;SKIP IF DONE
GOTO DO_CYCL0 ;DO FIRST CYCL
BTFSS AAFLAG,1 ;SKIP IF DONE
GOTO DO_CYCL1 ;ELSE 2ND CYCLE
BTFSS AAFLAG,2 ;SKIP IF DONE
GOTO DO_CYCL2 ;ELSE DO 3RD CYCLE
BTFSS AAFLAG,3 ;SKIP IF DONE
GOTO DO_CYCL3 ;DO CYCLE 4
BTFSS AAFLAG,4 ;SKIP IF DONE
GOTO DO_CYCL4 ;DO CYCLE 5
BTFSS AAFLAG,5 ;SKIP IF DONE
GOTO DO_CYCL5 ;DO CYCLE 6
BTFSS AAFLAG,6 ;SKIP IF DONE
GOTO DO_CYCL6 ;DO CYCLE 6
BTFSS AAFLAG,7 ;SKIP IF DONE
GOTO DO_CYCL7 ;DO CYCLE 7
GOTO SND_AA_1 ;GO BACK
;
INIT_AA
CLRF AAFLAG ;CLEAR ALL FLAGS
BSF ALFLAG,INAA ;SET IN AA FLAG
GOTO PUT_ON_100 ;ON 100 MSECS
;
DEC_AA_TMR
DECF AATMR ;REDUCE TIMER
MOVF AATMR,W ;GET IN W
BTFSS STATUS,Z ;CHECK IF Z
RETLW 1 ;NO THEN NZ
RETLW 0 ;ELSE 0
;
DO_CYCL0
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0
BSF AAFLAG,0 ;SET DONE FLAG
PUT_OFF_100
BSF PORT_A,BEP ;TURN OFF BEEPER
MOVLW D'20' ;FOR 100 MSECS
MOVWF AATMR ; /
RETLW 0
;
DO_CYCL1
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0
BSF AAFLAG,1 ;SET DONE FLAG
PUT_ON_100
BCF PORT_A,BEP ;TURN ON BEEPER
MOVLW D'20' ;FOR 100 MSECS
MOVWF AATMR ; /
RETLW 0
;
DO_CYCL2
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0 ; /
BSF AAFLAG,2 ;SET DONE FLAG
BSF PORT_A,BEP ;TURN OFF BEEPER
MOVLW D'100' ;FOR 500 MSECS
MOVWF AATMR ; /
RETLW 0
;
DO_CYCL3
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0 ; /
BSF AAFLAG,3 ;SET DONE FLAG
GOTO PUT_ON_100 ;DO NEXT CYCLE
;
DO_CYCL4
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0 ; /
BSF AAFLAG,4 ;SET DONE FLAG
GOTO PUT_OFF_100 ;DO NEXT CYCLE
;
DO_CYCL5
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0 ; /
BSF AAFLAG,5 ;SET DONE FLAG
GOTO PUT_ON_100 ;DO NEXT CYCLE
;
DO_CYCL6
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0 ; /
BSF AAFLAG,6 ;SET DONE FLAG
BSF PORT_A,BEP ;TURN OFF BEEPER
MOVLW D'200' ;FOR 1000 MSECS
MOVWF AATMR ; /
RETLW 0
;
DO_CYCL7
CALL DEC_AA_TMR ;REDUCE TIMER
BTFSS STATUS,Z ;IF NZ THEN RET
RETLW 0 ; /
BSF AAFLAG,7 ;SET DONE FLAG
GOTO PUT_ON_100 ;DO NEXT CYCLE
;
CHK_COLSN
BTFSC PORT_A,BEP ;IF ON THEN SKIP
GOTO SND_AA_0 ;ELSE RET
MOVF AATMR,W ;GET TIMER
BTFSC STATUS,Z ;NZ THEN SKIP
GOTO LD_AAT_1 ;LOAD A 1 IN TMR
DECF AATMR ;REDUCE TIMER
RETLW 0 ;RETURN
LD_AAT_1
INCF AATMR ;INC TIMER
RETLW 0 ;RET
;
ORG PIC57
SYS_RESET
GOTO START
;
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -