Greetings beloved.
Thanks for every help that I get from this forum.
Could you please send me/post for me the code that you used for DS1307. I think the difference will not be that big with DS1302 that I am using. I think I will also learn a lot from your code on how this devices works. below is the program code that I am currently using but is not working, so I will appreciate any help.......
;Moeketsane TP
;20211902
;BCD Clock using PIC 16f877 AND DS1302 Real time clock.
;The software is written to write my surname and student number, then writes time and date on LCD display
LIST P=16F877
#INCLUDE<P16F877.INC>
SDA EQU 0X06
SCL EQU 0X06
;CONSTANT VARS=0CH 00010010
DAT_VAL EQU 0X0C
NUM_VAL EQU 0X0D
ADR_HI EQU 0X0E
ADR_VAL EQU 0X0E
DEV_ADR EQU 0X10 ; A2,A1,A0
_N EQU 0X11
O_BYTE EQU 0X12
I_BYTE EQU 0X13
LOOP1 EQU 0X14
LOOP2 EQU 0X15
RASTA EQU 0X21
CLOCK EQU 0X22
TELLER1 EQU 30H ;create a counter named teller1
TELLER EQU 21H ;CREATE A COUNTER FILE NAMED TELLER
FLASH EQU 22H ;CREATE A GPR NAMED FLASH
ORG 0X00
GOTO PICINIT
PICINIT BCF STATUS,RP1
MOVLW 0X06 ;DISABLE COMPERATERS
MOVWF ADCON1 ;MAKE SURE PORTA IS DIGITAL OUTPUT
BSF STATUS,RP0 ;MOVE TO BANK 1
CLRF TRISA ;MAKE PORTA OUTPUTS
CLRF TRISB ;MAKE PORTB OUTPUTS
MOVLW B'00000111' ;MOVE BINARY VALUE TO W REGISTER
MOVWF OPTION_REG ;PRESET COUNTER T0 256
BCF STATUS,RP0 ;MOVE BACK TO BANK 0
CLRF PORTA ;CLEAR PORTA
CLRF PORTB ;CLEAR PORTB
GOTO LCDINIT ;GOTO LCD CONFIGURATION SUBROUTINE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LCD CONFIGURATION;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LCDINIT CALL LONGDELAY ;CALL DELAY FIRST
MOVLW 03H ;DIPLAY ON FIRST LINE
MOVWF PORTB
CALL ENABLE ;CLOCK DATA FROM PORTB TO THE LCD
CALL LONGDELAY
MOVLW 04H
MOVWF PORTB ;CHANGE TO 4 BIT FIRST FOUR BITS
CALL ENABLE ;CLOCK DATA
CALL LONGDELAY
MOVLW 04H
MOVWF PORTB ;CHANGE TO 4 BIT SECOND FOUR BITS
CALL ENABLE ;CLOCK DATA
CALL LONGDELAY
MOVLW 08H
MOVWF PORTB ;2 LINE MODE, 5X7 DOT FORMAT
CALL ENABLE ;CLOCK DATA
CALL LONGDELAY
MOVLW 0H ;CURSO ON, NOT UNDERLINED AND BLINK OFF
MOVWF PORTB
CALL ENABLE ;CLOCK DATA
CALL LONGDELAY
MOVLW 0CH
MOVWF PORTB ;CLOCK DATA
CALL ENABLE
CALL LONGDELAY
MOVLW 0H ;INCREMENT DISPLAY
MOVWF PORTB
CALL ENABLE ;CLOCK DATA
CALL LONGDELAY
MOVLW 6H
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
GOTO WRITE ;GOTO WRITE SUBRUOTINE TO WRITE DATA
LONGDELAY CALL SHORTDELAY
MOVLW 0X30
MOVWF TELLER
TH1 DECFSZ TELLER,F
GOTO TH1
RETLW 0
;MOVLW 0FFH ;DELAY
;MOVWF TELLER1 ;MOVE VALUE FFH TO TELLER1
;CALLBACK DECFSZ TELLER1,1 ;DECREMENT TELLER1 UNTIL IT IS 0
;GOTO CALLBACK
;RETLW 0
SHORTDELAY MOVLW 0X22
MOVWF TELLER1
TH DECFSZ TELLER1,F
GOTO TH
RETLW 0
ENABLE BSF PORTA,2 ;SET ENABLE BIT
NOP
RETLW 0
;;;;;;;;;;;;;;;;;THIS SUROUTINE IS TO MOVE THE FOUR UPPER BITS (03H) TO PORTB WHEN WRITING NUMBERS;;;;;;;;;;;;;;;;;;;;;;;;
NUMBER_CHART MOVLW 2H
MOVWF PORTA
MOVLW 3H
MOVWF PORTB
CALL ENABLE
RETLW 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SUBROUTINE FOR WRITING OUT NUMBERS;;;;;;;;;;;;;;;;;;;;;;;;;
STUDNUM
ADDWF PCL,F ;ADD WORKING REGISTER TO PROGRAM COUNTER
RETLW '0' ;RETURN WITH 0 TO W REGISTER
RETLW '2' ;WRITE OUT NUMBER '2'
RETLW '0' ;WRITE OUT NUMBER '0'
RETLW '2' ;WRITE OUT NUMBER '2'
RETLW '1' ;WRITE OUT NUMBER '1'
RETLW '1' ;WRITE OUT NUMBER '1'
RETLW '9' ;WRITE OUT NUMBER '9'
RETLW '0' ;WRITE OUT NUMBER '0'
RETLW '2' ;WRITE OUT NUMBER '2'
;;;;;;;;;;;;;;;;;;;;;;;;;;THIS SUBROUTINE IS TO MOVE FROM THE TOP LINE TO THE BOTTOM LINE;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LINE_2 CLRF PORTA ;CLEAR RS LINE TO ALLOW COMMANDS
MOVLW 0CH ;WRITE OUT 0CH WICH ALLOWS THE COUSER TO MOVE TO THE BOTTOM LINE
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
MOVLW 00H
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
RETLW 0
;;;;;;;;;;;;;;;;;;;;;;THIS SUBROUTINE IS TO WRITE OUT THE UPPER FOUR (04H) BITS FOR LETTERS A-O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UPPER_BITS MOVLW 2H
MOVWF PORTA
MOVLW 4H
MOVWF PORTB
CALL ENABLE
RETLW 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START TO WRITE CHARECTERS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRITE BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'M' ;M
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'O' ;O
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'E' ;E
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
;MOVLW 0H
;MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'K' ;E
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'E' ;K
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'T' ;E
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'S' ;T
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'A' ;S
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'N' ;A
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'E' ;N
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
;BSF PORTA,3
BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS
MOVLW 'E' ;E
MOVWF PORTB
CALL ENABLE
CALL LONGDELAY
;BCF PORTA,3
CALL LINE_2 ;MOVE FROM LINE 1 TO LINE 2
CLRF FLASH ;CLEAR TEMPORARY STORAGE FILE
MOVLW D'8' ;MOVE VALUE 8 IN TELLER TO ALLOW THE NUMBER SUBROUTIN TO BE REAPEATED 8 TIMES
MOVWF TELLER
NUMBER BSF PORTA,1 ;SET RS LINE
CALL UPPER_BITS ;CALL FIRST FOUR BITS
INCF FLASH,F ;INCREMENT TEMPORARY STORAGE FILE
MOVF FLASH,W ;MOVE FLASH TO W REGISTER
CALL STUDNUM ;CALL NUMBER TABLE
MOVWF PORTB ;MOVE DATA TO PORTB
CALL ENABLE ;CLOCK DATA TO LCD
CALL LONGDELAY ;CALL DEALAY
DECFSZ TELLER,F ;DECREMENT TELLER UNTIL 0
MOVLW 0X00
MOVWF DEV_ADR
SECONDS MOVLW 0X00
MOVWF RASTA
MOVLW 0X00
MOVWF DAT_VAL
CALL RANDOM_WRITE
MOVLW 0X30
CALL DELAY_N_MS
MINUTES MOVLW 0X01
MOVWF RASTA
MOVLW 0X00
MOVWF DAT_VAL
CALL RANDOM_WRITE
MOVLW 0X30
CALL DELAY_N_MS
HOURS MOVLW 0X02
MOVWF RASTA
MOVLW B'01000010'
MOVWF DAT_VAL
CALL RANDOM_WRITE
CALL DELAY_N_MS
;*************************************************************************
; THE FOLLOWING SUBROUTINE SET THE DATE IN FORMAT

D/MM/YY
;*************************************************************************
DAYS MOVLW 0X03 ;ADDRESS FOR SETTING DAYS
MOVWF RASTA
MOVLW B'00000111'
MOVWF DAT_VAL
CALL RANDOM_WRITE
MOVLW 0X30
CALL DELAY_N_MS
MONTH MOVLW 0X04 ;ADDRESS FOR SETTING DATE
MOVWF RASTA
MOVLW 0X05
MOVWF RASTA ;ADDRESS FOR SETTING MONTH
MOVLW 0X02
MOVWF DAT_VAL ;SET MONTH INTO FEBRUARY
CALL RANDOM_WRITE
MOVLW 0X30
CALL DELAY_N_MS
YEAR MOVLW 0X06
MOVWF RASTA
MOVLW B'01000110'
MOVWF DAT_VAL
CALL RANDOM_WRITE
MOVLW 0X30
CALL DELAY_N_MS
CALL RANDOM_READ
DONE GOTO DONE
RANDOM_WRITE BCF STATUS,5 ;WRITE DAT_VAL TO 16 BIT ADDRESS
RLF DEV_ADR,W ;SEND THE ADDRESS BYTE
IORLW 0A0H
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF ADR_HI,W
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF DAT_VAL,W
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
CALL STOP
RETURN
;************************************************************************
RANDOM_READ; THIS SUBROUTINE READS DATA AT SPECIFIED LOCATION AND RETURN
; THE RESULTS IN W.
;************************************************************************
CALL START
BCF STATUS,5
RLF DEV_ADR,W
IORLW 0A0H
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF RASTA
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
MOVF RASTA
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
CALL START
BCF STATUS,5
RLF DEV_ADR,W
IORLW 0A1H ;R/W SET TO 1 FOR READ OPERATION
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
CALL IN_BYTE
CALL NACK
CALL STOP
MOVF I_BYTE,W
RETURN
;********************************************************************
IN_BYTE CLRF I_BYTE
MOVLW D'8'
MOVWF _N
CALL HIGH_SDA
IN_BIT CALL HIGH_SCL
BTFSS PORTB,SDA
GOTO IN_ZERO
GOTO IN_ONE
IN_ZERO BCF STATUS,5
RLF I_BYTE,F
GOTO CONT_IN
IN_ONE BCF STATUS,5
RLF I_BYTE,F
INCF I_BYTE,F
GOTO CONT_IN
CONT_IN CALL LOW_SCL
DECFSZ _N,F
GOTO IN_BIT
RETURN
OUT_BYTE MOVLW D'8'
MOVWF _N
OUT_BIT BCF STATUS,5
RLF O_BYTE,F
BTFSS STATUS,5
GOTO OUT_ZERO
GOTO OUT_ONE
OUT_ZERO CALL LOW_SDA
CALL CLOCK
CALL HIGH_SDA
GOTO OUT_CONT
RETURN
OUT_ONE CALL HIGH_SDA
CALL CLOCK
GOTO OUT_CONT
RETURN
OUT_CONT DECFSZ _N,F
GOTO OUT_BYTE
NACK CALL HIGH_SDA
CALL CLOCK
RETURN
ACK CALL LOW_SDA
CALL HIGH_SDA
CALL HIGH_SCL
CALL LOW_SDA
CALL LOW_SCL
RETURN
START CALL LOW_SCL
CALL HIGH_SDA
CALL HIGH_SCL
CALL LOW_SDA
CALL LOW_SCL
STOP CALL LOW_SCL
CALL LOW_SDA
CALL HIGH_SCL
CALL HIGH_SDA
CALL LOW_SDA
RETURN
BINGHI CALL HIGH_SCL
CALL LOW_SCL
RETURN
HIGH_SDA BSF STATUS,7
BSF TRISB,SDA
BCF STATUS,RP0
RETURN
LOW_SDA BCF PORTB,SDA
BSF STATUS,7
BCF TRISB,SDA
BCF STATUS,7
CALL DELAY_SHORT
RETURN
HIGH_SCL BSF STATUS,7
BSF TRISB,SCL
BCF STATUS,7
CALL DELAY_SHORT
RETURN
LOW_SCL BCF PORTB,SCL
BSF STATUS,7
BCF TRISB,SCL
BCF STATUS,7
CALL DELAY_SHORT
RETURN
DELAY_SHORT MOVLW D'10'
MOVWF LOOP2
DELAY_SHORT1 NOP
DECFSZ LOOP2,F
GOTO DELAY_SHORT1
RETURN
DELAY_LONG MOVLW D'50'
DELAY_N_MS MOVWF LOOP1
OUTTER MOVLW D'110'
MOVWF LOOP2
INNER NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ LOOP2,F
GOTO OUTTER
RETURN
END
LOOP GOTO LOOP ;MAKE ENDLESS LOOP WHEN WRITING IS COMPLETE
Thanks for everyone's help and support
Ras Creation King