⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clk.asm

📁 PIC单片机常用子程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	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 + -