;*****************Part 1*****************
; by: Eng'r Roland Michael A. dela Peña *
;****************************************
LIST P=16F84
ERRORLEVEL -302
#INCLUDE P16F84.INC
;************************************************************
; REGISTER DEFINITIONS
;************************************************************
CBLOCK 0CH
ACCUM ; SUBSTITUTE REGISTER FOR W (DURING INTERRUPT)
CNUM ; CALL NUMBER (ONES)
CNUMT ; CALL NUMBER (TENS)
CNUMH ; CALL NUMBER (HUNDREDS)
DSEC ; ONES FOR SECONDS (DURATION)
SEC ; ONES FOR SECONDS (RTC)
DSECT ; TENS FOR SECONDS (DURATION)
SECT ; TENS FOR SECONDS (RTC)
DMIN ; ONES FOR MINUTES (DURATION)
MIN ; ONES FOR MINUTES (RTC)
DMINT ; TENS FOR MINUTES (DURATION)
MINT ; TENS FOR MINUTES (RTC)
DHOUR ; ONES FOR HOURS (DURATION)
HOUR ; ONES FOR HOURS (RTC)
DHOURT ; TENS FOR HOURS (DURATION)
HOURT ; TENS FOR HOURS (RTC)
DAY ; ONES FOR DAYS (RTC)
DAYT ; TENS FOR DAYS (RTC)
DSEC1 ; ONES FOR SECONDS (DISPLAY)
DSECT1 ; TENS FOR SECONDS (DISPLAY)
DMIN1 ; ONES FOR MINUTES (DISPLAY)
DMINT1 ; TENS FOR MINUTES (DISPLAY)
DHOUR1 ; ONES FOR HOURS (DISPLAY)
DHOURT1 ; TENS FOR HOURS (DISPLAY)
DAY1 ; ONES FOR DAYS (DISPLAY)
DAYT1 ; TENS FOR DAYS (DISPLAY)
TEL1 ; 1ST DIALED # BUFFER
TEL2 ; 2ND DIALED # BUFFER
TEL3 ; 3RD DIALED # BUFFER
TEL4 ; 4TH DIALED # BUFFER
TEL5 ; 5TH DIALED # BUFFER
TEL6 ; 6TH DIALED # BUFFER
TEL7 ; 7TH DIALED # BUFFER
TEL8 ; 8TH DIALED # BUFFER
TEL9 ; 9TH DIALED # BUFFER
TEL10 ; 10TH DIALED # BUFFER
TEL11 ; 11TH DIALED # BUFFER
TELE1 ; 1ST DIALED # BUFFER (DISPLAY)
TELE2 ; 2ND DIALED # BUFFER (DISPLAY)
TELE3 ; 3RD DIALED # BUFFER (DISPLAY)
TELE4 ; 4TH DIALED # BUFFER (DISPLAY)
TELE5 ; 5TH DIALED # BUFFER (DISPLAY)
TELE6 ; 6TH DIALED # BUFFER (DISPLAY)
TELE7 ; 7TH DIALED # BUFFER (DISPLAY)
TELE8 ; 8TH DIALED # BUFFER (DISPLAY)
TELE9 ; 9TH DIALED # BUFFER (DISPLAY)
TELE10 ; 10TH DIALED # BUFFER (DISPLAY)
TELE11 ; 11TH DIALED # BUFFER (DISPLAY)
DISVAR ; VARIABLE REGISTER (DISPLAY)
CNTVAR ; VARIABLE REGISTER (COUNTER FOR HIGHER ADDRESS)
LOVAR ; LOWER ADDRESS COUNTER FOR SAVING ADDRESS
ROLAND ; VARIABLE REGISTER (DTMF)
MICHAEL ; VARIABLE REGISTER (DTMF)
POGI ; DTMF INTERRUPT REGISTER
BOSCO ; CALL NUMBER INTERRUPT REGISTER
CMODE ; INDICATOR FOR MODE
CMODE1 ; INDICATOR FOR CLOCK IF NEEDED TO BE DISPLAYED
CSHIFT1 ; INDICATOR FOR SHIFT @ MODE1
CSHIFT2 ; INDICATOR FOR SHIFT @ MODE2
EEPROM ; BIT BUFFER
ADDR ; LOWER ADDRESS COUNTER
DATAI ; DATA INPUT REGISTER
DATAO ; DATA OUTPUT REGISTER
TXBUF ; TRANSMIT BUFFER
COUNT ; BIT COUNTER
LOOP ; DELAY LOOP COUNTER
LOOPS ; DELAY LOOP COUNTER
LOOPS2 ; DELAY LOOP COUNTER
ENDC
;************************************************************
; BIT DEFINITIONS
;************************************************************
D1 EQU 0 ; DTMF'S D1
D2 EQU 1 ; DTMF'S D2
D4 EQU 2 ; DTMF'S D4
D8 EQU 3 ; DTMF'S D8
COMP EQU 4 ; COMPARATOR BIT
RING EQU 4 ; RINGBACK TONE BIT
BUSY EQU 5 ; BUSY TONE BIT
CLK EQU 2 ; DISPLAY'S CLOCK
DAT EQU 3 ; DISPLAY'S DATA
BSY EQU 1 ; DISPLAY'S BUSY
DI EQU 7 ; EEPROM INPUT BIT
DO EQU 6 ; EEPROM OUTPUT BIT
SDATA EQU 7 ; SERIAL EE DATA LINE
SCLK EQU 6 ; SERIAL EE CLOCK LINE
;************************************************************************
;THIS PART INITIALIZES THE PORTS AND OTHER PHERIPERALS IN MICROCONTROLLER
;************************************************************************
ORG 0000h ; SET POWER ON RESET VECTOR.
CLRF CMODE1
CLRF CNTVAR
CALL CLEAR2 ; CLEARS ALL THE UNITS IN DURATION.
GOTO INIT
ORG 0004h ; SET INTERRUPT VECTOR.
GOTO TIME
ORG 0005h
INIT
CLRF ADDR ; RESETTING THE SELECTED REGISTERS.
CLRF LOVAR
CLRF SEC
CLRF SECT
CLRF MIN
CLRF MINT
MOVLW d'2'
MOVWF HOUR
MOVLW d'1'
MOVWF HOURT
CLRF DAYT
MOVLW d'1'
MOVWF DAY
CLRF CNUM
CLRF CNUMT
CLRF CNUMH
CLRF POGI
BSF STATUS,RP0 ; SET BANK = 1.
BCF OPTION_REG,7 ; ENABLE BUILT-IN PULL-UP RESISTORS.
MOVLW b'00011111' ; SET RA0,RA1,RA2,RA3,RA4 TO INPUT.
MOVWF TRISA
MOVLW b'00110011' ; SET RB1,RB2,RB5,RB6,RB7 TO OUTPUT
MOVWF TRISB ; AND RB0,RB3,RB4 TO INPUT.
BCF STATUS,RP0 ; SET BANK = 0.
CALL READ_1 ; READ THE DATA TO RESTORE ADDRESS FOR SAVING.
CALL READ1 ; READ THE DATA TO RESTORE PREVIOUS ADDRESSES.
MOVLW d'2'
ADDWF LOVAR
MOVLW d'254'
XORWF LOVAR,0
BTFSC STATUS,2
CLRF LOVAR
CALL SAVE1 ; SAVE THE ADDRESS FOR SAVING.
CALL SAVE ; SAVE THE ADDRESSES FOR RESTORING.
;**************************************************************
; ENABLING THE INTERRUPT AT RB0/INT PIN
;**************************************************************
BCF INTCON,1 ; SET RB0 INTERRUPT TO DID NOT OCCUR.
BSF INTCON,4 ; SET RB0/INT AS INTERRUPT.
BSF INTCON,GIE ; RB0/INT IS NOW READY FOR INTERRUPT.
;****************************************************************
; THIS IS THE START OF THE PREVIOUS CALL MONITORING PROGRAM
;****************************************************************
START
CALL CLEAR3 ; ERASE THE DATA STORED IN SRAM.
CLRF CMODE ; RESET MODE INDICATOR.
CLRF CSHIFT1 ; RESET SHIFT @ MODE1 INDICATOR.
MOVLW d'1'
MOVWF CSHIFT2 ; RESET SHIFT @ MODE2 INDICATOR.
BTFSC PORTA,COMP ; IS ON-HOOK DETECTED?
GOTO START
INITCALL
CALL DTMF1 ; IS DTMF DETECTED?
CALL MODE ; YES, THEN CHECK IF MODE IS TO BE EXECUTED.
;****************************************************************
; THIS PART STORE THE DIALED #S IN SRAM
;****************************************************************
INITCALL1
CALL CONVERT
MOVFW ROLAND
MOVWF TEL1 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL2 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL3 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL4 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL5 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL6 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL7 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL8 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL9 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL10 ; STORE THE DIALED # IN SRAM.
CALL INITCALL_1
MOVWF TEL11 ; STORE THE DIALED # IN SRAM.
CALL UNPRESS
CALL DTMF
HOOK1
BTFSC PORTA,COMP ; IS ON-HOOK DETECTED?
GOTO START ; YES.
GOTO HOOK1 ; NO.
INITCALL_1
CALL UNPRESS
CALL DTMF
CALL CONVERT
MOVFW ROLAND
RETURN
;****************************************************************
; THIS PART CHECKS THE STATUS OF THE CALL
;****************************************************************
RINGING
BCF POGI,0
CALL HOOK ; DETECT IF ON-HOOK DETECTED DURING RINGING.
; CALL BUSYTONE
; CALL RINGBACK ; WAIT UNTIL THE RINGBACK TONE STOPS.
MOVLW d'13' ; WAIT 5 SEC FOR ANOTHER RINGBACK TONE.
MOVWF LOOP
CALL RINGING2
CALL WAIT1
CALL CLEAR2 ; CALLED PARTY ANSWERED THEN TIMER STARTS.
CALL RINGING1
DISPDUR0
CLRF CMODE1
CALL DISPDUR1
MOVFW DAYT
CALL DISP1
MOVFW DAY
CALL DISP1
MOVFW DHOURT
CALL DISP1
MOVFW DHOUR
CALL DISP1
MOVFW DMINT
CALL DISP1
MOVFW DMIN
CALL DISP1
MOVFW DSECT
CALL DISP1
MOVFW DSEC
CALL DISP1
RINGFIN
BTFSC PORTA,COMP ; IS ON-HOOK DETECTED?
GOTO RINGING3 ; YES.
BTFSC CMODE1,0
GOTO DISPDUR0
CALL LONG ; NO.
GOTO RINGFIN
RINGING1
BTFSS BOSCO,0
CALL MODE_1
BCF BOSCO,0
INCF CNUM ; INCREMENT CALL NUMBER.
MOVLW d'10'
XORWF CNUM,0
BTFSS STATUS,2
RETURN ; THE CALL WAS FINISHED.
CLRF CNUM
INCF CNUMT
MOVLW d'10'
XORWF CNUMT,0
BTFSS STATUS,2
RETURN ; THE CALL WAS FINISHED.
CLRF CNUMT
INCF CNUMH
MOVLW d'10'
XORWF CNUMH,0
BTFSC STATUS,2
CLRF CNUMH
RETURN ; THE CALL WAS FINISHED.
RINGING2
MOVLW d'250'
MOVWF LOOPS
CALL WAIT
DECFSZ LOOP
GOTO RINGING2
RETLW d'0' ; 5 SECONDS WAS FINISHED.
RINGING3
CALL STORE ; RECORD THE CALL INFOS IN EEPROM.
GOTO START
BUSYTONE
BTFSC PORTB,BUSY ; IS BUSY TONE DETECTED AFTER 10 RINGS?
BTFSC PORTB,RING ; IS RINGBACK TONE DETECTED?
RETURN
GOTO BUSYTONE2
BUSYTONE1
BTFSS PORTB,BUSY ; IS BUSY TONE DETECTED AFTER 10 RINGS?
RETLW d'0' ; NOPE.
BTFSC PORTB,RING ; IS RINGBACK TONE DETECTED?
GOTO RINGING
BUSYTONE2
MOVLW d'255'
MOVWF LOOP
CALL RINGING2
GOTO HOOK1
RINGBACK
BTFSC PORTB,RING ; IS RINGBACK TONE DETECTED?
GOTO RINGING ; YES.
BTFSC POGI,0 ; IS RINGBACK TONE DETECTED?
GOTO RINGING ; YES.
RETURN
HOOK
BTFSC PORTA,COMP ; IS ON-HOOK DETECTED?
GOTO START ; YES, CLEAR THE DISPLAY.
RETURN ; NO.
LONG
MOVLW d'2'
XORWF DHOURT,0
BTFSS STATUS,2 ; IS 20 HOURS IS OVER?
RETLW d'0' ; NO.
MOVLW d'4' ; 20 HOURS WAS OVER.
XORWF DHOUR,0
BTFSS STATUS,2 ; IS 24 HOURS IS OVER?
RETLW d'0'
CALL STORE
CALL CLEAR2 ; START ANOTHER SET.
GOTO RINGFIN
;*************************************************************
; DELAY ROUTINE
; THIS ROUTINE TAKES THE VALUE IN ‘LOOPS’
; AND MULTIPLIES IT TIMES 1 MILLISECOND TO
; DETERMINE DELAY TIME
;*************************************************************
WAIT
MOVLW d'250' ; TIMING ADJUSTMENT VARIABLE.
MOVWF LOOPS2
TOP
CALL RINGBACK
CALL HOOK
DECFSZ LOOPS2 ; INNER LOOPS COMPLETE?
GOTO TOP ; NO, GO AGAIN.
DECFSZ LOOPS ; OUTER LOOPS COMPLETE?
GOTO WAIT ; NO, GO AGAIN.
RETLW d'0' ; YES, RETURN FROM SUB.
WAIT1
MOVLW d'250' ; TIMING ADJUSTMENT VARIABLE.
MOVWF LOOPS2
TOP1
CALL BUSYTONE ; SIT AND WAIT.
CALL HOOK
DECFSZ LOOPS2 ; INNER LOOPS COMPLETE?
GOTO TOP1 ; NO, GO AGAIN.
DECFSZ LOOPS ; OUTER LOOPS COMPLETE?
GOTO WAIT1 ; NO, GO AGAIN.
RETLW d'0' ; YES, RETURN FROM SUB.
;**************************************************************
; CLEARING THE SELECTED REGISTER
;**************************************************************
CLEAR2
MOVLW d'5' ; ADD 5 SEC TO DURATION BECAUSE OF THE 5 SEC DELAY.
MOVWF DSEC
CLRF DSECT
CLRF DMIN
CLRF DMINT
CLRF DHOUR
CLRF DHOURT
RETLW d'0' ; RESET THE DURATION.
CLEAR3
MOVLW d'10' ; SET THEM AS BLANK.
MOVWF TEL1
MOVWF TEL2
MOVWF TEL3
MOVWF TEL4
MOVWF TEL5
MOVWF TEL6
MOVWF TEL7
MOVWF TEL8
MOVWF TEL9
MOVWF TEL10
MOVWF TEL11
RETLW d'0'
;****************************************************************
; THIS SUB ROUTINE DISPLAY THE PREVIOUS DIALED #S
; RECORDED IN EEPROM
;****************************************************************
DISPCALL
MOVLW d'15'
CALL DISP1 ; SEND COMMAND FOR DISPLAY CALL.
MOVFW CNUMH
CALL DISP1
MOVFW CNUMT
CALL DISP1
MOVFW CNUM
CALL DISP1
MOVFW TELE1
CALL DISP1
MOVFW TELE2
CALL DISP1
MOVFW TELE3
CALL DISP1
MOVFW TELE4
CALL DISP1
MOVFW TELE5
CALL DISP1
MOVFW TELE6
CALL DISP1
MOVFW TELE7
CALL DISP1
MOVFW TELE8
CALL DISP1
MOVFW TELE9
CALL DISP1
MOVFW TELE10
CALL DISP1
MOVFW TELE11
GOTO DISP1
;****************************************************************
; THIS SUB ROUTINE DISPLAY THE DURATION & DATE OF PREVIOUS CALLS
;****************************************************************
DISPDUR
CALL DISPDUR1
MOVFW DAYT1
CALL DISP1
MOVFW DAY1
CALL DISP1
MOVFW DHOURT1
CALL DISP1
MOVFW DHOUR1
CALL DISP1
MOVFW DMINT1
CALL DISP1
MOVFW DMIN1
CALL DISP1
MOVFW DSECT1
CALL DISP1
MOVFW DSEC1
GOTO DISP1
DISPDUR1
MOVLW d'16'
CALL DISP1 ; SEND COMMAND FOR DISPLAY DUARATION.
MOVFW CNUMH
CALL DISP1
MOVFW CNUMT
CALL DISP1
MOVFW CNUM
GOTO DISP1
;****************************************************************
; THIS ROUTINE DISPLAYS THE CLOCK
;****************************************************************
F3
CALL DISP1
DISPCLOCK
CALL CONFIRM1 ; CONFIRM IF THE MAX IS 3.
MOVFW DAYT
CALL DISP1
CALL CONFIRM2 ; CONFIRM IF THE MAX DAY IS 31.
MOVFW DAY
CALL DISP1
CALL CONFIRM3 ; CONFIRM IF THE MAX IS 2.
MOVFW HOURT
CALL DISP1
CALL CONFIRM4 ; CONFIRM IF THE MAX HOUR IS 24.
MOVFW HOUR
CALL DISP1
CALL CONFIRM5 ; CONFIRM IF THE MAX IS 6.
MOVFW MINT
CALL DISP1
MOVFW MIN
CALL DISP1
MOVFW SECT
CALL DISP1
MOVFW SEC
DISP1
MOVWF DISVAR
;****************************************************************
; THIS PART INITIATE THE DATA TO BE DISPLAYED ON LCD
;****************************************************************
TRANS
BSF PORTB,CLK ; FOR CLOCK PULSE.
TRANS1
BTFSS PORTB,BSY ; CHECK IF NEXT BIT IS READY TO BE SENT.
GOTO TRANS1
BCF PORTB,CLK
MOVLW d'8'
MOVWF COUNT ; SET # OF BITS TO 8.
DISPLAY
RRF DISVAR ; ROTATE RIGHT TXBUF THROUGH CARRY OF STATUS FLAG.
BTFSC STATUS,0 ; IS LEAST SIGNIFICANT BIT OF DISVAR = 0?
BSF PORTB,DAT ; NO, SET DATA HIGH.
BTFSS STATUS,0 ; IS LEAST SIGNIFICANT BIT OF DISVAR = 0?
BCF PORTB,DAT ; YES, SET DATA LOW.
BSF PORTB,CLK ; FOR CLOCK PULSE.
DISPLAY1
BTFSC PORTB,BSY ; CHECK IF NEXT BIT IS READY TO BE SENT.
GOTO DISPLAY1
BCF PORTB,CLK
DECFSZ COUNT ; DECREMENT BIT COUNT.
GOTO DISPLAY
DISPLAY2
BTFSC PORTB,BSY ; CHECK IF NEXT DATA ARE READY TO BE SENT.
GOTO DISPLAY2
RETLW d'0'
CONFIRM1
MOVLW d'3'
SUBWF DAYT,0
BTFSS STATUS,1 ; IS THE TENS (DAY) EXCEED 3?
RETLW d'0' ; NO.
MOVLW d'3' ; YES, SET IT ONLY TO MAXIMUM OF 3.
MOVWF DAYT
RETLW d'0'
CONFIRM2
XORWF DAYT,0
BTFSS STATUS,2 ; IS THE TENS (DAY) EQUAL TO 0?
GOTO THREE ; NO.
MOVLW d'0' ; YES.
XORWF DAY,0
BTFSS STATUS,2 ; IS THE ONES (DAY) EQUAL TO 0?
RETLW d'0' ; NO.
MOVLW d'1' ; YES, SET IT TO 1 (BECAUSE THERE'S NO 0 DAY).
MOVWF DAY
RETLW d'0'
THREE
MOVLW d'3'
XORWF DAYT,0
BTFSS STATUS,2 ; IS THE TENS (DAY) EQUAL TO 3?
RETLW d'0' ; NO.
MOVLW d'1' ; YES.
SUBWF DAY,0
BTFSS STATUS,1 ; IS THE ONES (DAY) EXCEED TO 1?
RETLW d'0' ; NO.
MOVLW d'1' ; YES, SET IT TO 1 (BECAUSE THE MAXIMUM DAY
MOVWF DAY ; IN A MONTH IS ONLY 31).
RETLW d'0'
CONFIRM3
MOVLW d'2'
SUBWF HOURT,0
BTFSS STATUS,1 ; IS THE TENS (HOUR) EXCEED TO 2?
RETLW d'0' ; NO.
MOVLW d'2' ; YES, SET IT TO MAXIMUM OF 2 ONLY.
MOVWF HOURT
RETLW d'0'
CONFIRM4
MOVLW d'2'
XORWF HOURT,0
BTFSS STATUS,2 ; IS THE TENS (HOUR) EQUAL TO 2?
RETLW d'0' ; NO.
MOVLW d'3' ; YES.
SUBWF HOUR,0
BTFSS STATUS,1 ; IS ONES (HOUR) EXCEED TO 3?
RETLW d'0' ; NO.
MOVLW d'3'
MOVWF HOUR ; YES, SET IT TO MAXIMUM OF 3 ONLY.
RETLW d'0'
CONFIRM5
MOVLW d'6'
SUBWF MINT,0
BTFSS STATUS,1 ; IS TENS (MIN) EXCEED TO 6?
RETLW d'0' ; NO.
MOVLW d'5'
MOVWF MINT ; YES, SET IT TO 0 (BECAUSE THERE'S ONLY 60
RETLW d'0' ; MINUTES IN ONE DAY).
;****************************************************************
; INDICATOR FOR FLASHING THE SELECTED FIGURE
;****************************************************************
FLASH1
CLRF CMODE1
MOVLW b'11111110'
CALL F3
FLASH_1
BTFSC CMODE1,0
GOTO FLASH1
CALL F1
BTFSC STATUS,2
GOTO FLASH_1
CALL F2
MOVWF DAYT
GOTO FLASH1
FLASH2
CLRF CMODE1
MOVLW b'11111101'
CALL F3
FLASH_2
BTFSC CMODE1,0
GOTO FLASH2
CALL F1
BTFSC STATUS,2
GOTO FLASH_2
CALL F2
MOVWF DAY
GOTO FLASH2
FLASH3
CLRF CMODE1
MOVLW b'11111011'
CALL F3
FLASH_3
BTFSC CMODE1,0
GOTO FLASH3
CALL F1
BTFSC STATUS,2
GOTO FLASH_3
CALL F2
MOVWF HOURT
GOTO FLASH3
FLASH4
CLRF CMODE1
MOVLW b'11110111'
CALL F3
FLASH_4
BTFSC CMODE1,0
GOTO FLASH4
CALL F1
BTFSC STATUS,2
GOTO FLASH_4
CALL F2
MOVWF HOUR
GOTO FLASH4
FLASH5
CLRF CMODE1
MOVLW b'11101111'
CALL F3
FLASH_5
BTFSC CMODE1,0
GOTO FLASH5
CALL F1
BTFSC STATUS,2
GOTO FLASH_5
CALL F2
MOVWF MINT
GOTO FLASH5
FLASH6
CLRF CMODE1
MOVLW b'11011111'
CALL F3
FLASH_6
BTFSC CMODE1,0
GOTO FLASH6
CALL F1
BTFSC STATUS,2
GOTO FLASH_6
CALL F2
MOVWF MIN
GOTO FLASH6
F1
CALL HOOK ; CHECK IF OFF-HOOK WAS DETECTED.
GOTO DTMF4
F2
CALL MODE ; DETECT IF MODE IS EXECUTED.
CALL MODE2 ; DETECT IF SHIFT IS EXECUTED.
CALL CONVERT ; CHANGE THE SELECTED CLOCK FIGURE.
CALL UNPRESS
MOVFW ROLAND
RETURN
;****************************************************************
; THIS DETERMINES IF THE MODE WAS EXECUTED
;****************************************************************
MODE
MOVLW d'11'
XORWF ROLAND,0
BTFSS STATUS,2 ; IS "*" WAS PRESSED?
RETLW d'0' ; NO.
CALL UNPRESS ; YES.
COMF CMODE ; TOGGLE TO SELECT MODE.
;****************************************************************
; THIS ROUTINE SETS THE RTC IF CMODE,7 IS SET
;****************************************************************
CLOCKSET
BTFSC CMODE,7 ; CHECK IF WHAT MODE IS TO BE EXECUTED.
GOTO MODE1 ; DISPLAY DIALED #S STORED IN EEPROM.
GOTO BLINK ; DISPLAY CLOCK TO BE SET.
;****************************************************************
; THIS ROUTINE DISPLAY THE DIALED #S STORED IN EEPROM
;**************************************************************
MODE1
CALL MODE_1
CALL DISPCALL ; DISPLAY THEM NOW.
OPTION1
CALL DTMF1
CALL MODE ; CHECK IF MODE IS TO BE EXECUTED.
CALL SHIFT ; CHECK IF SHIFT IS TO BE EXECUTED.
CALL FWD ; CHECK IF FWD IS TO BE EXECUTED.
CALL BACK ; CHECK IF BACK IS TO BE EXECUTED.
GOTO OPTION1 ; TRY AGAIN.
MODE_1
CALL READ1 ; READ THE LATEST CALL INFOS RECORDED.
MOVLW d'21' ; SET THE FIRST LOWER ADDRESS OF CALL INFO
SUBWF ADDR ; TO BE READ.
GOTO READ ; READ THE LATEST CALL INFOS
END
               (
geocities.com/ece23314)