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

📄 clk.asm

📁 PIC单片机常用子程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
		TITLE        "Alarm Clock"
LIST  P = 16C57
;
;Define Equates:
;       
	PIC57   EQU     7FFH
;************************************************************************
;External Ossc. used = 4.096Mhz. Prescaler of 32 used, which gives a
;31.25 microSec increment of the RTCC. If RTCC is intially loaded with 96,
;it would overflow to 0 in 5.000 milliSecs. Giving a 0.00% error.
	MSEC5   EQU     D'96'
;*************************************************************************
	C       EQU     0
	BEP     EQU     0
	RTATS   EQU     0
	DC      EQU     1
	HR10    EQU     1
	Z       EQU     2
	HR      EQU     2
	MIN10   EQU     3
	MIN     EQU     4
	FLASH   EQU     4
	PA0     EQU     5
	KEY_BEEP EQU    5
	AMPM    EQU     5
	PA1     EQU     6
	F0      EQU     0
	KEY_HIT EQU     6
	ALED    EQU     6
	AM_PM   EQU     7
	COLON   EQU     3
	ALRMLED EQU     2
	SERVICED EQU    7
	ALONOF  EQU     0
	INAL    EQU     1
	SILNC   EQU     2
	INAA    EQU     3
	INKEYBEP EQU    5
;
;DEFINE RAM LOCATIONS:
	RTCC    EQU     1
	PC      EQU     2
	STATUS  EQU     3
	FSR     EQU     4
	PORT_A  EQU     5
	PORT_B  EQU     6
	PORT_C  EQU     7
;DEFINE REAL TIME MODE REGS (RTM)
	MSTMR   EQU     8       ;MILLI SEC. TIMER
	STMR    EQU     9       ;SEC. TIMER
;*****************************************************
;DO NOT CHANGE RELATIVE POSITION OF NEXT 6 BYTES
	MTMR    EQU     0A      ;MIN. TIMER
	HTMR    EQU     0B      ;HOUR TIMER
;DEFINE ALARM TIME MODE REGS (ATM)
	MALARM  EQU     0C      ;MIN. ALARM
	HALARM  EQU     0D      ;HOUR ALARM
;DEFINE DATA ENTRY MODE REGS (DEM)
	MENTRY  EQU     0E      ;MIN. ENTRY
	HENTRY  EQU     0F      ;HOUR ENTRY
;*****************************************************
PAGE
;
;DEFINE FLAG REG AND FUNCTION:
	FLAG    EQU     10
;       BIT # 7|6|5|4|3|2|1|0|
;--------------|-|-|-|-|-|-|-|
;             X|X|X|X|X|X|0|0| --> REAL TIME MODE (RTM)
;             X|X|X|X|X|X|0|1| --> ALARM TIME MODE(ATM)
;             X|X|X|X|X|X|1|0| --> DATA ENTRY M0DE(DEM)
;             X|X|X|X|X|X|1|1| --> TEST MODE (TM)
;             X|X|X|X|X|Y|X|X| --> ALRMLED ON/OFF
;             X|X|X|X|Y|X|X|X| --> COLON LED ON/OFF
;             X|X|X|Y|X|X|X|X| --> FLASH DISPLAY
;             X|X|Y|X|X|X|X|X| --> KEY_BEEP
;             X|Y|X|X|X|X|X|X| --> KEY_HIT (0/1)
;             Y|X|X|X|X|X|X|X| --> SERVICED
; X = DEFINED ELSEWHERE IN TABLE 
; Y = DEFINED AS SHOWN (0/1)
;
	TEMP    EQU     11
	DIGIT   EQU     12
	NEW_KEY EQU     13
	KEY_NIBL EQU    14
	DEBOUNCE EQU    15
	MIN_SEC EQU     16      ;MIN/SECONDS TIMER
	ENTFLG  EQU     17
;flag dedicated to the key entry mode
;       BIT # 7|6|5|4|3|2|1|0|
;--------------|-|-|-|-|-|-|-|
;             X|X|X|X|X|X|X|Y| --> REAL/ALARM TIME STATUS
;             X|X|X|X|X|X|Y|X| --> HR10 DONE
;             X|X|X|X|X|Y|X|X| --> HR DONE
;             X|X|X|X|Y|X|X|X| --> MIN10 DONE
;             X|X|X|Y|X|X|X|X| --> MIN DONE
;             X|X|Y|X|X|X|X|X| --> INKEYBEP
;             X|Y|X|Y|X|X|X|X| --> NOT USED
;             Y|X|X|X|X|X|X|X| --> NOT USED
;
;
	ALFLAG  EQU     18
;flag dedicated to the alarm
;       BIT # 7|6|5|4|3|2|1|0|
;--------------|-|-|-|-|-|-|-|
;             X|X|X|X|X|X|X|Y| --> ALONOF
;             X|X|X|X|X|X|Y|X| --> INAL
;             X|X|X|X|X|Y|X|X| --> SILNC
;             X|X|X|X|Y|X|X|X| --> INAA
;             X|X|X|Y|X|X|X|X| --> NOT USED
;             X|X|Y|X|X|X|X|X| --> NOT USED
;             X|Y|X|Y|X|X|X|X| --> NOT USED
;             Y|X|X|X|X|X|X|X| --> NOT USED
;
	AAFLAG  EQU     19
;flag dedicated to the AA alarm
	AATMR   EQU     1A
;
;Port pin definitions:
;
;PORT_A:
;       BIT 0   --> BEEPER (ACTIVE LOW) OUTPUT
;       BIT 1-3 --> unused I/O
;
;PORT_B: ALL OUTPUTS
;       BIT 0&4 --> MSB DIGIT COMMON CATHODE & ALARM
;       BIT 1&5 --> 2ND DIGIT COMMOM CATHODE & COLON
;       BIT 2&6 --> 3RD DIGIT COMMON CATHODE & PM
;       BIT 3&7 --> LSB DIGIT COMMON CATHODE & AM
;
;PORT_C: 
;IN DISPLAY MODE ALL SEG/ANNN SET AS OUTPUTS
;IN KEY SCAN MODE COLS ARE OUTPUTS ROWS ARE INPUTS
;       BIT 0   --> SEGMENT A & COL 4 
;       BIT 1   --> SEGMENT B & COL 3
;       BIT 2   --> SEGMENT C & COL 2
;       BIT 3   --> SEGMENT D & COL 1
;       BIT 4   --> SEGMENT E & ROW 4
;       BIT 5   --> SEGMENT F & ROW 3
;       BIT 6   --> SEGMENT G & ROW 2
;       BIT 7   --> CA OF ALL ANNUNCIATORS & ROW 1
;
;
PAGE
;
	ORG     0
START
	GOTO    INIT_CLK        ;INITIALIZE CLOCK
;THIS ROUTINE RUNS A TEST ON THE LEDS.
;ALL THE RELEVENT LEDS ARE LIT UP FOR 2 SECS.
;
TEST_HARDWARE
	MOVLW   d'02'           ;DISPLAY FOR 2 SECS
	MOVWF   MIN_SEC         ;       /
;        
;
TEST_LOOP
	MOVF    MIN_SEC,W       ;GET MIN/SEC
	BTFSC   STATUS,Z        ;NOT 0 THEN SKIP
	GOTO    NORM_TIME       ;ELSE NORMAL TIME
	CALL    UPDATE_DISPLAY  ;UPDATE DISPLAY
	BSF     STATUS,PA0      ;GOTO PAGE 1
	CALL    UPDATE_TIMERS   ;WAIT AND UPDATE
	BCF     STATUS,PA0      ;RESET PAGE MARKER
	GOTO    TEST_LOOP       ;LOOP BACK
NORM_TIME
	BCF     FLAG,0          ;PUT IN REAL TIME
	BCF     FLAG,1
TIME_LOOP
	CALL    UPDATE_DISPLAY
	BSF     STATUS,PA1      ;GOTO PAGE 2
	CALL    SERVICE_KEYS
	BSF     STATUS,PA0      ;GOTO PAGE 3
	CALL    SOUND_AA        ;CHECK ALARM
	BCF     STATUS,PA1      ;GOTO PAGE 1
	CALL    UPDATE_TIMERS   ;WAIT AND UPDATE TIMERS
	BCF     STATUS,PA0      ;RESET PAGE MARKER
	BCF     STATUS,PA1      ;       /
	MOVF    FLAG,W          ;SEE IF IN ATM
	ANDLW   B'00000011'     ;       /
	XORLW   B'00000001'     ;      /
	BTFSC   STATUS,Z        ;SKIP IF NOT
	CALL    RESET_ATM
	GOTO    TIME_LOOP
;
RESET_ATM
	MOVF    MIN_SEC,W       ;GET MIN/SEC
	ANDLW   B'00001111'     ;       /
	BTFSS   STATUS,Z        ;Z THEN SKIP
	RETLW   0               ;ELSE RETURN
	BCF     FLAG,0          ;SET TO RTM
	BCF     FLAG,ALRMLED    ;CLEAR LED
	BTFSC   ALFLAG,ALONOF   ;TEST STAT
	BSF     FLAG,ALRMLED    ;SET LED
	RETLW   0               ;RETURN
PAGE
;
;
UPDATE_DISPLAY
	MOVLW   B'00000000'     ;CLEAR SEG DRIVE
	MOVWF   PORT_C          ;       /
	MOVLW   B'00111111'     ;SEE IF LAST DIGIT
	XORWF   PORT_B,0        ;       /
	BTFSC   STATUS,Z        ;NO THEN SKIP
	GOTO    SCAN_KP         ;ELSE SCAN KEYPAD
UP_DSP_1
;SELECT DIGIT TO BE DISPLAYED
	COMF    PORT_B,0        ;GET COMPL. PORT B IN W
	BTFSC   STATUS,Z        ;NO DIGIT SELECTED?
	MOVLW   B'11000000'     ;THEN SELECT DEFAULT
	MOVWF   TEMP            ;SAVE IN TEMP
	COMF    TEMP            ;COMPLEMENT VALUE
	BSF     STATUS,C        ;SET CARRY
	RLF     TEMP            ;SHIFT LEFT
	BTFSS   STATUS,C        ;IF C=1 THEN SKIP
	RLF     TEMP            ;ELSE 3 TIMES...
	RLF     TEMP            ;THRU CARRY
	MOVF    TEMP,0          ;GET IN W
	MOVWF   PORT_B          ;OUTPUT TO PORT
;NOW THAT DIGIT IS SELECTED, SELECT SEG VALUES FOR THAT DIGIT
;FIRST FIND MODE OF OPERATION.
	MOVLW   MTMR            ;LOAD FSR WITH MTMR
	MOVWF   FSR             ;       /
	MOVF    FLAG,0          ;GET FLAG IN W
	ANDLW   B'00000011'     ;MASK OTHER BITS
	MOVWF   TEMP            ;SAVE IN TEMP
	XORLW   B'00000011'     ;IN TEST MODE
	BTFSC   STATUS,Z        ;NO THEN SKIP
	GOTO    DO_TM           ;ELSE TEST MODE
	BCF     STATUS,C        ;CLEAR CARRY
	RLF     TEMP            ;LEFT SHIFT TEMP
	MOVF    TEMP,0          ;GET IN W
	ADDWF   FSR             ;CHANGE INDIRECT POINTER
	CALL    GET_7_SEG       ;GET 7 SEG DATA IN W
	MOVWF   DIGIT           ;SAVE IN DIGIT LOC.
	CALL    MASK_ANNC       ;MASK ANNC TO DIGIT
	BTFSC   FLAG,FLASH      ;NO FLASH THEN SKIP
	CALL    CHK_HALF_SEC    ;ELSE CHK. IF ON
	MOVF    DIGIT,0         ;GET BACK DIGIT
	MOVWF   PORT_C          ;OUTPUT TO PORT
	RETLW   0               ;RETURN
;
DO_TM
	MOVLW   B'11111111'     ;LIGHT ALL SEGMENTS
	MOVWF   PORT_C          ;       /
	RETLW   0               ;RETURN FROM UPDATE DISPLAY
;
CHK_HALF_SEC
	BTFSS   FLAG,COLON      ;IF COLON ON THEN DO
	GOTO    BLANK_DSP       ;ELSE BLANK DISPLAY
	RETLW   0
BLANK_DSP
	MOVLW   B'00000000'     ;MAKE PORT C LOW
	MOVWF   DIGIT
	RETLW   0
;
PAGE
;
;ON ENTRY FSR POINTS TO THE REAL TIME MODE'S MINUTES REGISTER.
;ON RETURN FSR POINTS TO THE TIMER REGISTER TO BE DISPLAYED.
;W REG. CONTAINS THE DECODED 7 SEG. INFO OF THE DIGIT
;TO BE DISPLAYED
;
GET_7_SEG
	COMF    PORT_B,0        ;COMPLEMENT B --> W
	ANDLW   B'11110000'     ;MASK LO NIBBLE
	BTFSC   STATUS,Z        ;NZ THEN SKIP
	INCF    FSR             ;INC POINTER
	MOVF    F0,0            ;MOVE INDIRECT TO W
	MOVWF   TEMP            ;GET INTO TEMP
	COMF    PORT_B,0        ;COMPL.B --> W
	ANDLW   B'11110000'     ;MASK LO NIBBLE
	BTFSC   STATUS,Z        ;IF D1/2 THEN
	BCF     TEMP,AM_PM      ;CLEAR AM/PM BIT
	COMF    PORT_B,0        ;GET PORT B AGAIN
	ANDLW   B'11001100'     ;SEE IF D2 OR D4
	BTFSC   STATUS,Z        ;YES THEN SKIP
	SWAPF   TEMP            ;SWAP TEMP
	MOVLW   B'00001111'     ;MASK HI NIBBLE
	ANDWF   TEMP,0
	ADDWF   PC              ;ADD TO PC
	RETLW   B'00111111'     ;CODE FOR 0
	RETLW   B'00000110'     ;CODE FOR 1
	RETLW   B'01011011'     ;CODE FOR 2
	RETLW   B'01001111'     ;CODE FOR 3
	RETLW   B'01100110'     ;CODE FOR 4
	RETLW   B'01101101'     ;CODE FOR 5
	RETLW   B'01111101'     ;CODE FOR 6
	RETLW   B'00000111'     ;CODE FOR 7
	RETLW   B'01111111'     ;CODE FOR 8
	RETLW   B'01100111'     ;CODE FOR 9
;
;This routine scans the 4x4 hex key pad for a key hit.
;If key is pressed, KEY_HIT flag is set and the value of
;the hex key is returned in reg NEW_KEY
;If no key is detected, then a 0xff value is returned in
;register NEW_KEY and the flag KEY_HIT is reset.
;
SCAN_KP
	BTFSC   FLAG,KEY_HIT    ;KEY UNDER SERVICE?
	GOTO    UP_DSP_1        ;YES SKIP ROUTINE
	MOVLW   B'11111111'     ;SET DIGIT SINKS ...
	MOVWF   PORT_B          ;TO HIGH
	MOVLW   B'11110111'     ;SET KEY COL LOW
	MOVWF   TEMP            ;SAVE IN TEMP
SKP1
	MOVLW   B'00000000'     ;SET PORT C AS OUTPUTS
	TRIS    PORT_C          ;       /
	MOVF    TEMP,W
	ANDLW   B'00001111'     ;DISCHARGE PINS
	MOVWF   PORT_C          ;       /
	MOVLW   B'11110000'     ;SET AS I/O
	TRIS    PORT_C          ;   /
	MOVF    TEMP,W          ;GET OLD VALUE
	MOVWF   PORT_C          ;OUTPUT TO PORT
	MOVF    PORT_C,W        ;INPUT PORT VALUE
	ANDLW   B'11110000'     ;MASK LO BYTE
	XORLW   B'11110000'     ;SEE IF KEY HIT
	BTFSS   STATUS,Z        ;NO KEY THEN SKIP        
	GOTO    DET_KEY         ;LOAD KEY VALUE
SKP3        
	BSF     STATUS,C        ;SET CARRY
	RRF     TEMP            ;MAKE NEXT COL. LOW
	BTFSC   STATUS,C        ;ALL DONE THEN SKIP
	GOTO    SKP1
	CLRF    NEW_KEY         ;SET NEW_KEY = FF
	DECF    NEW_KEY         ;       /
SKP2                           
	CLRF    PORT_C          ;SETPORT C AS ...
	MOVLW   B'00000000'     ;OUTPUTS
	TRIS    PORT_C          ;       /
	GOTO    UP_DSP_1        ;RETURN
DET_KEY
;key is detected
	INCF    NEW_KEY,W       ;CHK IF KEY ...
	BTFSS   STATUS,Z        ;WAS RELEASED
	GOTO    SKP2            ;NO THEN RETURN
	MOVF    PORT_C,W        ;GET RAW KEY...
	IORLW   B'00001111'     ;VALUE.
	ANDWF   TEMP,W          ;   /
	MOVWF   NEW_KEY         ;SAVE IN NEW_KEY
	CALL    GET_KEY_VAL     ;GET ACTUAL KEY ...
	MOVWF   NEW_KEY         ;VALUE
	BSF     FLAG,KEY_HIT    ;SET KEY HIT FLAG
	GOTO    SKP2            ;RETURN
;
PAGE
;This routine decodes the hex value from the "raw" data got
;from scanning the rows and cols.
;   actual key value          raw hex value
;       ONE              EQU     77
;       TWO              EQU     7B
;       THREE            EQU     7D
;       C                EQU     7E      
;       FOUR             EQU     0B7
;       FIVE             EQU     0BB
;       SIX              EQU     0BD
;       D                EQU     0BE     
;       SEVEN            EQU     0D7
;       EIGHT            EQU     0DB
;       NINE             EQU     0DD
;       E                EQU     0DE
;       A                EQU     0E7
;       ZERO             EQU     0EB
;       B                EQU     0ED    
;       F                EQU     0EE     
;
;
GET_KEY_VAL
	ANDLW   B'00001111'     ;GET LO NIBBLE        
	MOVWF   KEY_NIBL        ;SAVE
	MOVLW   4               ;SET COUNT TO 4
	MOVWF   TEMP            ;       /
GKV1
	BSF     STATUS,C        ;SET CARRY
	RRF     KEY_NIBL        ;ROTATE NIBBLE
	BTFSS   STATUS,C        ;SKIP IF NOT Z
	GOTO    GET_HI_KEY      ;GOTO NEXT PART
	DECFSZ  TEMP            ;DEC COUNT
	GOTO    GKV1            ;LOOP
GO_RESET
	BSF     STATUS,PA0      ;SET MSB
	BSF     STATUS,PA1      ;       /
	GOTO    SYS_RESET       ;ELSE BIG ERROR

⌨️ 快捷键说明

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