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

📄 clk.asm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -