What I'm trying to end up with is a clock displaying seconds, minutes, hours and maybe a few other things.
What I've been experimenting with so far is the seconds and minutes displays. The displays are 5082-7300 are hooked up to portc and there LEDs on portd.0 and portb.1. The LEDs are just so I know the program is running. I thought I had a schematic but I saved it in wrong format so I can update it later if needed.
Code:
''* Notes :This program will blink a light on portd.1 at *
'* :about a 1 hz rate w/ LED on portb.1 set to 100cps *
'* : *
'****************************************************************
' This program will count from 0 to 59 using porte.0 and porte.1
' without writing a 60.
' Now trying to get the displays to sequence they look like they're
' always on.
'rearranging port outs to resemble final diagram output on portc
' portc outputs one and tens properly when latched from porte.1
'--------------------------------------------------clock variables
ticks VAR BYTE
seconds VAR BYTE
minutes VAR BYTE
hours VAR BYTE
days VAR BYTE
'-----------------------------------------------my variables
secondschanged VAR BYTE 'seconds
x VAR BYTE
out_tens VAR BYTE
minutes_changed VAR BYTE 'minutes
minutes_count VAR BYTE
tens_minutes VAR BYTE
out_tens_minutes VAR BYTE
'---------------------------------------------------testing variables
led1 VAR portb.1
led2 VAR portd.0 ' blinks at pause rate
trisc = %00000000
trise = %001
portc = 0
porte = 0
cmcon = %00000111 ' comparators off
adcon0 = %00000000 ' adc off
adcon1 = %11000110 ' sets AN ports to digital
ccp1con = %00000000 ' turns comparator module off
latch_enable VAR porte.0' pin 8 on 16f877a
second_latch_enable VAR porte.1 'pin 9 on 16f877a
tens_seconds VAR BYTE ' something for the tens digit to display
'-------------------------------------------DT interrupt area
wsave VAR BYTE $70 SYSTEM ' alternate save location for W
' if using $70, comment wsave1-3
INCLUDE "DT_INTS-14.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts
DEFINE osc4
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _ToggleLED1, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
T1CON = %00000001 ; Prescaler = 1:1, TMR1ON
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
preload VAR WORD
preload = 60643 '60643 yeilds exactly 100 Hz w/ 1:1 prescaler
tmr1l = preload.LowByte
tmr1h = preload.HighByte
seconds = 0
tens_seconds = 0
minutes_count = 0
tens_minutes = 0
Main:
'--------------------------------------------increment seconds
IF ticks > 50 THEN 'seconds counting to 59
ticks = 0
seconds = seconds + 1
IF seconds > 9 THEN
tens_seconds = tens_seconds + 1
seconds = 0
ENDIF
portc = (portc & %11110000) | seconds'tell the port which bits to use
IF tens_seconds > 5 THEN
tens_seconds = 0
minutes_changed = 1
ENDIF
out_tens = tens_seconds * 16
trise = %110 ' porte.0
portc = (portc & %00001111) | out_tens 'tell the port which bits to use
HIGH latch_enable ' enable write
PAUSE 5
LOW latch_enable 'disable write
PAUSE 5
ENDIF
'-----------------------------------------------increment minutes
IF minutes_changed = 1 THEN
minutes_changed = 0
minutes_count = minutes_count + 1
IF minutes_count > 9 THEN
minutes_count = 0
tens_minutes = tens_minutes + 1
ENDIF
portc = (portc & %11110000) | minutes_count'tell the port which bits to use
IF tens_minutes > 5 THEN tens_minutes = 0
out_tens_minutes = tens_minutes * 16
trise = %101 ' porte.1
portc = (portc & %00001111) | out_tens_minutes 'tell the port which bits to use
HIGH second_latch_enable 'disable write
PAUSE 5
LOW second_latch_enable
PAUSE 5
ENDIF
porte = 0
TOGGLE led2
GOTO Main
'---[TMR1 - interrupt handler]------------------------------------
ToggleLED1:
t1con.0 = 0
tmr1l = preload.LowByte
tmr1h = preload.HighByte
t1con.0 = 1
TOGGLE led1
ticks = ticks + 1
@ INT_RETURN
END
First, I know it's running fast. I got impatient waiting for the digits to turn over so I sped it up. I'll fix that later.
The problem I'm having is with the ones digit in the minutes display. In my program I initially set all the indicators to zero but the minutes ones digit sets to a 1 immediately. As the program counts the ones and tens seconds display works well. When it comes time to chalk up another minute the ones digit shows the correct count only for a second, or as long as the seconds display is zero, then goes back to being a 1.
Can anybody tell me why or how to fix it so the digit retains the correct number?
Most of the time your thoughts are always welcome.
Bookmarks