📄 clk.asm
字号:
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 + -