Greetings all,
Well... another total PIC newbie here...
I've dabbled in electronics for a few decades and can generally navigate my way around hardware pretty well.
But I'm *totally* new to PIC's and programming in general, so please be gentle with me...
I'm attempting to build a project that requires an RTC with battery backup and an LCD display that displays (among other things).. the real time.
The problem I'm having is setting the clock.
I'm using a 16F690, a DS1302, and a standard 16x2 LCD (in 4-bit mode). Compiler is PICBASIC PRO and programmer is a PICkit2.
I've got the DS1302 and LCD up and running just fine. The clock keeps (and displays) time just fine. I also have no trouble detecting the set buttons.
The problem is SETTING the clock. I think I'm either math challenged and/or just generally clueless here.
The sample program I started with sets the initial time manually when you load the PIC, but what I need of course is to set it with buttons. That's where my troubles begin.
Here's some snippets of my code, so you've got an idea where I'm at: (just the relevant bits I think)
Code:
' Allocate variables
rtcyear var byte
rtcday var byte
rtcmonth var byte
rtcdate var byte
rtchr var byte
rtcmin var byte
rtcsec var byte
rtccontrol var byte
'**This is what I want to do away with and replace with buttons:
Code:
' Set initial time
rtcyear = $09 'Set Year
rtcday = $05 'Set Day
rtcmonth = $1 'Set Month
rtcdate = $1 'Set Date of month
rtchr = $21 'Set Hour
rtcmin = $03 'Set Minutes
rtcsec = $20 'Set Seconds
Gosub settime ' DO IT! - Set the time
'**This is the main goods:
Code:
' Subroutine to write time to RTC
settime:
RST = 1 ' Ready for transfer
Shiftout IO, SCLK, LSBFIRST, [$8e, 0] ' Enable write
RST = 0 ' Reset RTC
RST = 1 ' Ready for transfer
' Write all 8 RTC registers in burst mode
Shiftout IO, SCLK, LSBFIRST, [$be, rtcsec, rtcmin, rtchr, rtcdate, rtcmonth, rtcday, rtcyear, 0]
RST = 0 ' Reset RTC
Return
' Subroutine to read time from RTC
gettime:
RST = 1 ' Ready for transfer
' Read all 8 RTC registers in burst mode
Shiftout IO, SCLK, LSBFIRST, [$bf]
Shiftin IO, SCLK, LSBPRE, [rtcsec, rtcmin, rtchr, rtcdate, rtcmonth, rtcday, rtcyear, rtccontrol]
RST = 0 ' Reset RTC
Return
' Main program loop - updates the LCD with the time
mainloop:
Gosub gettime ' Read the time from the RTC
' Display time on LCD
Lcdout $fe, 1, $fe, 2, hex2 rtchr, ":", Hex2 rtcmin, ":", Hex2 rtcsec,_
$fe,$C0, " ", Hex2 rtcmonth, "/", Hex2 rtcdate, "/" , Hex2 rtcyear
Pause 100 ' slow things down a bit to keep the LCD from freaking out
gosub checkbuttons
Goto mainloop ' repeat until nauseated...
When a button is detected I call a subroutine that's supposed to increment the minutes (or hours) to set the clock. This is where I'm tOO sTOoPid:
Code:
increminute:
rtcmin= rtcmin + 1
if rtcmin >= 60 then
rtcmin = 0
endif
gosub settime
return
---------
Even that part works... to a degree. It does set the time on the clock. THE PROBLEM is that it sets the minutes on the LCD in HEX!
if I start at 03 minutes (as shown on the LCD) and increment with the set button, it works fine until I get past 09... then it goes to 0A, OB, OE, etc. instead of continuing at 10, 11, 12, etc.
Clearly, this will not do!
Can someone please help me out of the darkness here? Or at least give me a shove in the right direction? I've searched about a million websites and forum posts, but.... 
Thanks very much,
Steve
Bookmarks