'****************************************************************
' *
' Filename: GPS_LCD.bas *
' Date: 11/18/2008 *
' File Version: 0.01 *
' *
' Author: Peter Putnam *
' email: peter@ni6e.com *
' *
'****************************************************************
'
'This project decodes the RS-232 output from a GPS receiver and
'displays the time and date values from the $GPRMC string on
'a 2-line x 8-character LCD.
'The top line displays hours, minutes and seconds of UTC time.
'If the GPS data is valid, denoted by the character "A" in array
'position 14, the lower line displays the UTC date. It displays
'the warning "No Fix" if the fix data is invalid.
'The "No Fix" pin is reset to low if the fix is valid. If the fix
'becomes invalid, the LED pin is set high to turn on a warning LED.
'The message "No Data" is posted if the RS232 input fails at
' any time.
' Compiled with SourceBoost BASIC for the PIC microprocessor
'****************************************************************
' 16F688 *
' +---------+ *
' 1 | | 14 *
' 5.0 V ----+ +---- GND *
' 2 | | 13 *
' xtal ----+ +---- RA0 "No Fix" LED *
' 3 | | 12 *
' xtal ----+ +---- RA1 RS *
' 4 | | 11 *
' RA3 ----+ +---- RA2 E *
' 5 | | 10 *
' RX ->--+ +---- RC0 DB4 *
' 6 | | 9 *
' TX -<--+ +---- RC1 DB5 *
' 7 | | 8 *
' DB7 RC3 ----+ +---- RC2 DB6 *
' | | *
' +---------+ *
' *
'****************************************************************
' processor now 16F917 for test
' soon to be ported to 16F688
#pragma DATA 0x2007, _XT_OSC & _WDT_ON & _MCLRE_ON
'#pragma DATA 0x2007, _XT_OSC & _WDT_OFF & _MCLRE_OFF for 16F688
#pragma CLOCK_FREQ 3686400
Sub main()
call lcd_init() 'Initialize the LCD to 4-bit format
call lcd_clear() 'Clear the LCD
call usart_init() 'Initialize the UART to 4800,n,8,1
dim i as byte 'Array pointer
dim v(60) as byte 'Data array
call lcd_putch(32) 'Prints ASCII char " "
call lcd_putch(32) 'Prints ASCII char " "
call lcd_putch(32) 'Prints ASCII char " "
call lcd_putch(78) 'Prints ASCII char "N"
call lcd_putch(111) 'Prints ASCII char "o"
call lcd_line2()
call lcd_putch(32) 'Prints ASCII char " "
call lcd_putch(32) 'Prints ASCII char " "
call lcd_putch(68) 'Prints ASCII char "D"
call lcd_putch(97) 'Prints ASCII char "a"
call lcd_putch(116) 'Prints ASCII char "t"
call lcd_putch(97) 'Prints ASCII char "a"
loop1:
v(0) = (call usart_rx()) 'Take any character into array
' 'Clear watchdog timer, data is flowing
asm
{
CLRWDT
}
if v(0) = 36 then 'Search for "$" at beginning of string
for i = 1 to 3 ' take next three characters after "$"
v(i) = (call usart_rx())
next i
else goto loop1 'Start over if first character is not "$"
end if
' If string "GPRMC" is found
' then gather rest of string
' only "P" and "R" are tested here
'
if v(2) = 80 and v(3)= 82 then 'If this string is "GPRMC"
for i = 4 to 58 ' collect a total of 58 bytes
v(i) = (call usart_rx())
next i
else goto loop1 'Start over if string in not "GPRMC"
end if
call lcd_clear() 'Clears the LCD
call lcd_putch(v(7)) 'Print 10s of hours
call lcd_putch(v(8)) 'Print 1s of hours
call lcd_putch(58) 'Print ASCII char ":"
call lcd_putch(v(9)) 'Print 10s of minutes
call lcd_putch(v(10)) 'Print 1s of minutes
call lcd_putch(58) 'Print ASCII char ":"
call lcd_putch(v(11)) 'Print 10s of seconds
call lcd_putch(v(12)) 'Print 1s of seconds
call lcd_line2() 'Put cursor at begining of LCD line 2
if v (14) = 65 then 'Array element 14 contains "A" if the fix is valid
goto loop2 ' for a valid fix, display the date on line 2
else goto loop3 ' for an invalid fix, display "No Fix"
end if
loop2:
' porta.2 = 0 'Drives Port A.0 pin low, turns warning LED off
call lcd_putch(v(55)) 'Print 10s of months
call lcd_putch(v(56)) 'Print 1s of months
call lcd_putch(46) 'Print ASCII char "."
call lcd_putch(v(53)) 'Print 10s of days
call lcd_putch(v(54)) 'Print 1s of days
call lcd_putch(46) 'Print ASCII char "."
call lcd_putch(v(57)) 'Print 10s of year
call lcd_putch(v(58)) 'Print 1s of year
goto loop1
loop3:
' porta.2 = 1 'Drives Port A.0 pin high, turns warning LED on
call lcd_putch(32) 'Prints ASCII char " "
call lcd_putch(78) 'Prints ASCII char "N"
call lcd_putch(111) 'Prints ASCII char "o"
call lcd_putch(32) 'Prints ASCII char " "
call lcd_putch(70) 'Prints ASCII char "F"
call lcd_putch(105) 'Prints ASCII char "i"
call lcd_putch(120) 'Prints ASCII char "x"
goto loop1
End Sub