Code:
;
; GPS NMEA Display code with GPSDO monitoring
;
; PIC16F876A
; __________
; !MCLR |1 28| RB7------D7
; PLL Volt--AN0---RA0 |2 27| RB6------D6
; adc spare--AN1---RA1 |3 26| RB5------D5
; adc spare--AN2---RA2 |4 25| RB4------D4
; adc spare--AN3---RA3 |5 24| RB3------LCD E
; spare---RA4 |6 23| RB2------LCD RS
; adc spare--AN4---RA5 |7 22| RB1------spare
; Ground---Vss |8 21| RB0------PPS In
; OSC1---XTAL |9 20| VDD------ +5 V
; OSC2---XTAL |10 19| Vss------Ground
; spare---RC0 |11 18| RC7------H-RX -- GPS NMEA In
; spare---RC1 |12 17| RC6------H-TX -- GPS Command Out
; spare---RC2 |13 16| RC5------spare
; Pbutton---RC3 |14 15| RC4------spare
; ----------
;====================================================================='
' Program to display returned value of a GPS NMEA string on RA4
' LCD in 4-BIT mode PIC16F876a controller 4Mhz clock Fuse PWRT BODEN
'
'Typical GPS sentence string: $GPRMC,192144.62,A,5041.6058,N,00412.6124,E,0.45,3 57.74,081205,,*0B
'The default sentences are continuously output.
'Now suppose I want to read only one particular sentence I need to program the GPS to do that.
'The input message ILOG controls which sentences are logged.
'$PRWIILOG,???,V,,,\r,\n
'Inputting this sentence, disables all the sentences.
'Now suppose we want only RMC sentence then input the following sentence serially to gps
'$PRWIILOG,RMC,A,,,,\r\n
'The \r() and \n () are sentence terminator in NMEA
'V disables that particular sentence while A enables that sentence.
@ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF
; Place a copy of these variables in your Main program for digit characters--
;-- The compiler will tell you which lines to un-comment --
;-- Do Not un-comment these lines --
;---------------------------------------------------------------------------
;wsave VAR BYTE $20 SYSTEM ' location for W if in bank0
wsave VAR BYTE $70 SYSTEM ' alternate save location for W
' if using $70, comment wsave1-3
' --- IF any of these three lines cause an error ?? ------------------------
' Comment them out to fix the problem ----
' -- Which variables are needed, depends on the Chip you are using --
'wsave1 VAR BYTE $A0 SYSTEM ' location for W if in bank1
'wsave2 VAR BYTE $120 SYSTEM ' location for W if in bank2
;wsave3 VAR BYTE $1A0 SYSTEM ' location for W if in bank3
' --------------------------------------------------------------------------
; Must use the 32-bit Floating Point routines
INCLUDE "FP2032.bas" ; 32-bit Floating Point for 14-bit cores with RAM at $20
INCLUDE "Average.bas" ; DT's 16-bit Analog Module averaging values
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas"
Define LCD_DREG PORTB ' Port for LCD Data
Define LCD_DBIT 4 ' Set LCD starting data bit
Define LCD_RSREG PORTB ' Port for RegisterSelect (RS) bit
Define LCD_RSBIT 2 ' Port Pin for RS bit (pin9)
Define LCD_EREG PORTB ' Port for Enable (E) bit
Define LCD_EBIT 3 ' Port Pin for E bit (pin7)
Define LCB_BITS 4 ' Using 4-bit bus
Define LCD_COMMANDUS 1500 ' Command Delay (uS)
define LCD_DATAUS 50 ' Data Delay (uS)
DEFINE OSC 4
DEFINE ADC_BITS 10 ' Setup ADC
DEFINE ADC_SAMPLEUS 5
DEFINE ADC_CLOCK 1
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_BAUD 4800
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
OPTION_REG.6 = 1 ' Interrupt rising edge
OPTION_REG.7 = 0 ' Enable Pull-Up's
PPS VAR PORTB.0
Pbutton VAR PORTC.3
' Initialise ADC
ADCON1 = %10000100 ' Set PORTA analog and RIGHT justify result
ADCON0 = %01000001 ' Configure and turn on A/D Module channel 0 Fosc 8
'Declare variables
volt VAR WORD ' scaled value real part
voltd1 VAR WORD ' scaled value first decimal place
voltd2 VAR WORD ' scaled value second decimal place
'Allocate Variables for GPS: ####################
TimeOut CON 2000
hh VAR BYTE 'hours
mm VAR BYTE 'minutes
ss VAR BYTE 'seconds
knots VAR WORD 'speed in knots (units)
knotsten VAR BYTE 'speed in knots (tens)
course VAR WORD 'heading
latdeg VAR BYTE 'degrees latitude
latmin VAR BYTE 'minutes latitude
latsecs VAR WORD 'seconds latitude
NS VAR BYTE 'north or south
londeg VAR BYTE 'degrees longitude
lonmin VAR BYTE 'minutes longitude
lonsecs VAR WORD 'seconds longtitude
EW VAR BYTE 'east or west
d VAR BYTE 'day
m VAR BYTE 'month
y VAR BYTE 'year
;###################################################
butt VAR BYTE 'pushbutton variable
marker VAR BYTE 'toggle marker
marker2 VAR BYTE 'UTC or BST
MH VAR BYTE[10] 'locator variables##########
;
Idx VAR BYTE ;
AddChar VAR BYTE ;
Divisor VAR BYTE[4] ;
AARG_SAVE VAR BYTE[4] '----------------###########
nPos var byte ' digit variables
nDig var byte '--------------------
Idx2 VAR BYTE ' Month variables
X VAR BYTE ;
Char VAR WORD '--------------------
scroll VAR BYTE
fix VAR BYTE 'GPS fix - Yes="A" No="V"
butt = 0 ;clear button variable
marker = 0 ;set marker to zero for full info display at start
marker2 = 0 ;set UTC
PAUSE 50
;--------------------------------------------------------------------------
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler INT_INT, _Clock, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
;--------------------------------------------------------------------------
@ INT_ENABLE INT_INT ; enable external (INT) interrupts
LCDOut $fe,$80," GPS Decoder " ; scrolling opening display
LCDOut $FE,$c0," G8VLQ March 2014 "
Pause 2000
for scroll = 1 to 20 ' FOR..NEXT loop so message scrolls off the LCD to the left
lcdout $fe,24 ' Scrolls display one position to the left
pause 100 ' Pause 150 ms
next scroll ' do loop again till max count
pause 1500 ' Pause 1000ms
lcdout $fe,1 ' Clears LCD
;------------------------------------------------
Initialisation: ;Leaving GPRMC as only sentence output
HSEROUT ["$PRWIILOG,GGA,V,,,",13,10]
PAUSE 100
HSEROUT ["$PRWIILOG,GSA,V,,,",13,10]
PAUSE 100
HSEROUT ["$PRWIILOG,GSV,V,,,",13,10]
PAUSE 100
HSEROUT ["$PRWIILOG,ZCH,V,,,",13,10]
PAUSE 100
;-------------------------------------------------
GPS: 'read GPS #############################################################################################
HSerIn Timeout,Clock,[wait("$GPRMC"),wait(","),DEC2 hh,DEC2 mm,DEC2 ss,wait(","),fix,wait(","),DEC2 _
latdeg,DEC2 latmin,wait("."),DEC4 latsecs,wait(","),NS,wait(","),DEC3 londeg,DEC2 lonmin,wait("."),DEC4 lonsecs,_
wait(","),EW,wait(","),knots,wait("."),DEC2 knotsten,wait(","),DEC3 course,wait(","),DEC2 d,DEC2 m,DEC2 y]
IF marker = 1 THEN BigClock ; keeps big clock running if value is 1
IF marker2 = 1 THEN Plusone
;-------------------------------------------------------- ;
BUTTON Pbutton,0,100,0,butt,1,BigClockClear ;button press to jump to fullscreen big clock
GOSUB PLL ;get the A/D value of pll control voltage
GOSUB ShowMonth ;show month as letters
GOSUB Locator ;maidenhead locator
;GOSUB BST
GOSUB Clock ;medium digit clock
goto GPS ; ##########################################################################################
;---------------------------------------------------------------
; MAIDENHEAD CONVERSION -- Darrel Taylor
;---------------------------------------------------------------
Locator:
ASM
MOVE?CF32 macro C, F ; put a Floating Point Constant in an FP variable
MOVE?CW (C & 0xFFFF), F
MOVE?CW (C >> 16), F + 2
endm
MOVE?FF32 macro Fin, Fout ; Copy an FP var to another FP var
MOVE?WW Fin, Fout
MOVE?WW Fin + 2, Fout + 2
endm
ENDASM
;-------------------------------------------------------------------------------
;----[convert Longitude Sexagesimal to Decimal Degrees]-------------------------
Aint = lonsecs : GOSUB ItoFA ; decimal portion of Minutes
Bint = 10000 : GOSUB ItoFB ; divided by 100
GOSUB fpdiv
Bint = LonMin : GOSUB ItoFB ; add whole portion of Minutes
GOSUB fpadd
Bint = 60 : GOSUB ItoFB ; divide by 60
GOSUB fpdiv
Bint = LonDeg : GOSUB ItoFB ; add degrees
GOSUB fpadd
IF EW = "W" THEN ; if west of Prime Meridian
@ MOVE?FF32 AARGB2, BARGB2 ; copy Float AARG to BARG
Aint = 0 : GOSUB ItoFA ; subtract from 0 to negate
GOSUB fpsub
ENDIF
Bint = 180 : GOSUB ItoFB ; add 180
GOSUB fpadd
;----[Have Longitude in AARG as Float]------------------------------------------
FOR Idx = 0 TO 8 STEP 2
SELECT CASE Idx
CASE 0 : AddChar = "A"
@ MOVE?CF32 0x83200000, _Divisor ; 20
CASE 2 : AddChar = "0"
@ MOVE?CF32 0x80000000, _Divisor ; 2
CASE 4 : AddChar = "a"
@ MOVE?CF32 0x7B2AAAAB, _Divisor ; 0.0833333
CASE 6 : AddChar = "0"
@ MOVE?CF32 0x78088889, _Divisor ; 0.00833333
CASE 8 : AddChar = "a"
@ MOVE?CF32 0x73360B61, _Divisor ; 0.000347222
END SELECT
GOSUB MH_Digit
NEXT Idx
;----[convert Latitude Sexagesimal to Decimal Degrees]--------------------------
Aint = latsecs : GOSUB ItoFA ; decimal portion of Minutes
Bint = 10000 : GOSUB ItoFB ; divided by 100
GOSUB fpdiv
Bint = LatMin : GOSUB ItoFB ; add whole portion of Minutes
GOSUB fpadd
Bint = 60 : GOSUB ItoFB ; divide by 60
GOSUB fpdiv
Bint = LatDeg : GOSUB ItoFB ; add degrees
GOSUB fpadd
IF NS = "S" THEN ; if south of equator
@ MOVE?FF32 AARGB2, BARGB2 ; copy Float AARG to BARG
Aint = 0 : GOSUB ItoFA ; subtract from 0 to negate
GOSUB fpsub
ENDIF
Bint = 90 : GOSUB ItoFB ; add 90
GOSUB fpadd
;----[Have Latitude in AARG as Float]------------------------------------------
FOR Idx = 1 TO 9 STEP 2
SELECT CASE Idx
CASE 1 : AddChar = "A"
@ MOVE?CF32 0x82200000, _Divisor ; 10
CASE 3 : AddChar = "0"
@ MOVE?CF32 0x7F000000, _Divisor ; 1
CASE 5 : AddChar = "a"
@ MOVE?CF32 0x7A2AAAAB, _Divisor ; 0.0416666
CASE 7 : AddChar = "0"
@ MOVE?CF32 0x770882F1, _Divisor ; 0.00416666
CASE 9 : AddChar = "a"
@ MOVE?CF32 0x723603EC, _Divisor ; 0.000173583
END SELECT
GOSUB MH_Digit
NEXT Idx
;----[Maidenhead conversion complete]-------------------------------------------
RETURN
;----[Calculate one digit of the Maidenhead Locator]----------------------------
MH_Digit:
@ MOVE?FF32 _Divisor, BARGB2 ; put divisor in BARG
GOSUB fpdiv ; do the divide
@ MOVE?FF32 AARGB2, _AARG_SAVE ; save AARG for modulus
GOSUB FtoIA ; get integer
MH(Idx) = Aint + AddChar ; The Character
Bint = Aint ; copy integer result to BARG
GOSUB ItoFB ; convert it to float
@ MOVE?FF32 _AARG_SAVE, AARGB2 ; restore previous AARG
GOSUB fpsub ; subtract integer
@ MOVE?FF32 _Divisor, BARGB2 ; multiply times original divisor
GOSUB fpmul ; AARG now contains the remainder
RETURN
;---------------------------------------------------------------------------
; Month routine
ShowMonth:
LCDOut $fe,$80+9,DEC2 d," "
GOSUB Month
LCDOut " ","20",DEC2 y
RETURN
Month:
Idx2 = (m - 1) * 3
FOR X = Idx2 TO Idx2 + 2
LOOKUP X,["JanFebMarAprMayJunJulAugSepOctNovDec"],Char
LCDOUT Char
NEXT X
RETURN
;--------------------------------------------------------------------------
; British Summer Time
;--------------------------------------------------------------------------
BST:
IF m = 3 AND d = 30 THEN Plusone
IF m >= 03 and m <= 10 THEN Plusone
RETURN
Plusone:
IF m = 10 and d = 26 then UTC
IF m >=10 and m <3 then UTC
hh = hh + 1
IF hh = 25 THEN hh = 0
marker2 = 1
RETURN
UTC:
marker2 = 0
RETURN
;--------------------------------------------------------------------------
; PLL control voltage read result via Average routine
;--------------------------------------------------------------------------
PLL: ' Measure GPSDO PLL control voltage for TCXO - Approx 1.65v for lock
ADCON0.2 = 1 ' Start conversion
NotDone:
pause 1
IF ADCON0.2 = 1 Then NotDone
value =((ADRESH * 256)+(ADRESL))
gosub Average
' Calculate Voltage to 2 decimal places
volt = value * 5/1024
voltd1 = ( value * 5//1024) * 10/1024
voltd2 = ((value *5 //1024) * 10//1024) * 10/1024
RETURN
;--------------------------------------------------------------------------
lock:
IF (volt=1) AND (voltd1 =6) AND (voltd2 =<9) THEN
LCDOUT $FE,$C0+9,"Lock "
ENDIF
RETURN
;---------------------------------------------------------------------------
ClockClear: ;Returning from Big Digit Clock, need to clear screen
LCDOut $FE, 1 ;Clear Screen
marker = 0 ;set marker to full info display
GOTO GPS
;--------------------------------------------------------------------------
Clock: ;Display medium character time clock
'Set up the digits (http://www.darreltaylor.com/files/CustChar.htm)
LCDOUT $FE,$40,$03,$03,$03,$03,$03,$03,$03,$03 ' Cust Char #0
LCDOUT $FE,$48,$0E,$1F,$1B,$1B,$1B,$1B,$1B,$1B ' Cust Char #1
LCDOUT $FE,$50,$1F,$1F,$18,$18,$18,$18,$1F,$1F ' Cust Char #2
LCDOUT $FE,$58,$03,$03,$03,$03,$03,$03,$1F,$1F ' Cust Char #3
LCDOUT $FE,$60,$0E,$1F,$1B,$1B,$1B,$1B,$1F,$0E ' Cust Char #4
LCDOUT $FE,$68,$1B,$1B,$1B,$1B,$1B,$1B,$1F,$0E ' Cust Char #5
LCDOUT $FE,$70,$1F,$1F,$03,$03,$03,$03,$1F,$1F ' Cust Char #6
LCDOUT $FE,$78,$1E,$1F,$03,$03,$03,$03,$03,$03 ' Cust Char #7
nDig=ss dig 0 : nPos=7 : gosub displaydigit
nDig=ss dig 1 : nPos=6 : gosub displaydigit
npos=5 : gosub colon
ndig=mm dig 0 : npos=4 : gosub displaydigit
ndig=mm dig 1 : npos=3 : gosub displaydigit
npos=2 : gosub colon
ndig=hh dig 0 : npos=1 : gosub displaydigit
ndig=hh dig 1 : npos=0 : gosub displaydigit
LCDOUT $FE,$C0+9,"False Data " ;displays
IF fix = "A" THEN
LCDOUT $FE,$C0+9,"Fix ",#volt, ".", # voltd1,# voltd2,"v" ;overwrites No Data
GOSUB lock ;checks for pll lock if Fix valid
ENDIF
LCDOUT $fe,$94," G8VLQ ",STR MH\10," " ;STR is 10 digit Maidenhead Locator
LCDOut $fe,$d4,DEC2 latdeg,$DF,DEC2 latmin,"'",DEC latsecs DIG 3,DEC latsecs DIG 2,_
NS," ",DEC2 londeg,$DF,DEC2 lonmin,"'",DEC lonsecs DIG 3,DEC lonsecs DIG 2,EW
;$DF is degree symbol, some LCD displays have it in different location
@ INT_RETURN
;RETURN
displaydigit:
if ndig=0 then gosub zero
if ndig=1 then gosub one
if ndig=2 then gosub two
if ndig=3 then gosub three
if ndig=4 then gosub four
if ndig=5 then gosub five
if ndig=6 then gosub six
if ndig=7 then gosub seven
if ndig=8 then gosub eight
if ndig=9 then gosub nine
return
Zero:
LCDOUT $FE,$80+nPos,1
LCDOUT $FE,$C0+nPos,5
return
One:
LCDOUT $FE,$80+nPos,0
LCDOUT $FE,$C0+nPos,0
return
Two:
LCDOUT $FE,$80+nPos,7
LCDOUT $FE,$C0+nPos,2
return
Three:
LCDOUT $FE,$80+nPos,6
LCDOUT $FE,$C0+nPos,3
return
Four:
LCDOUT $FE,$80+nPos,5
LCDOUT $FE,$C0+nPos,0
return
Five:
LCDOUT $FE,$80+nPos,2
LCDOUT $FE,$C0+nPos,3
return
Six:
LCDOUT $FE,$80+nPos,2
LCDOUT $FE,$C0+nPos,5
return
Seven:
LCDOUT $FE,$80+nPos,7
LCDOUT $FE,$C0+nPos,0
return
Eight:
LCDOUT $FE,$80+nPos,4
LCDOUT $FE,$C0+nPos,5
return
Nine:
LCDOUT $FE,$80+nPos,4
LCDOUT $FE,$C0+nPos,3
return
colon:
lcdout $fe,$80+nPos,$A5
lcdout $FE,$C0+nPos,$A5
return
;---------------------------------------------------------------------------
BigClockClear:
LCDOut $FE, 1 ;Clear original full data screen
marker = 1 ;set marker for fullscreen clock loop
'Set up the digits (http://www.darreltaylor.com/files/CustChar.htm)
'THICK DIGITS
LCDOUT $FE,$40,$07,$07,$07,$07,$07,$07,$07,$07 ' Cust Char #0
LCDOUT $FE,$48,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C ' Cust Char #1
LCDOUT $FE,$50,$0F,$1F,$1F,$1E,$1C,$1C,$1C,$1C ' Cust Char #2
LCDOUT $FE,$58,$1E,$1F,$1F,$0F,$07,$07,$07,$07 ' Cust Char #3
LCDOUT $FE,$60,$1C,$1C,$1C,$1C,$1E,$1F,$1F,$0F ' Cust Char #4
LCDOUT $FE,$68,$07,$07,$07,$07,$0F,$1F,$1F,$1E ' Cust Char #5
LCDOUT $FE,$70,$1F,$1F,$1F,$00,$00,$00,$00,$00 ' Cust Char #6
LCDOUT $FE,$78,$00,$00,$00,$00,$00,$1F,$1F,$1F ' Cust Char #7
;#############################################################################################
GPS2:
HSerIn Timeout,Clock,[wait("$GPRMC"),wait(","),DEC2 hh,DEC2 mm,DEC2 ss]
;##############################################################################################
BUTTON Pbutton,0,100,0,butt,1,ClockClear ;button press to change back to full info display
BigClock: ;Display Big Digit fullscreen clock
nDig=ss dig 0 : nPos=17 : gosub displaydigit1
nDig=ss dig 1 : nPos=14 : gosub displaydigit1
npos=13 : gosub colon
ndig=mm dig 0 : npos=10 : gosub displaydigit1
ndig=mm dig 1 : npos=7 : gosub displaydigit1
npos=6 : gosub colon1
ndig=hh dig 0 : npos=3 : gosub displaydigit1
ndig=hh dig 1 : npos=0 : gosub displaydigit1
GOTO GPS2
displaydigit1:
if ndig=0 then gosub Zero1
if ndig=1 then gosub One1
if ndig=2 then gosub Two1
if ndig=3 then gosub Three1
if ndig=4 then gosub Four1
if ndig=5 then gosub Five1
if ndig=6 then gosub Six1
if ndig=7 then gosub Seven1
if ndig=8 then gosub Eight1
if ndig=9 then gosub Nine1
return
Zero1:
LCDOUT $FE,$80+nPos,2
LCDOUT $FE,$81+nPos,3 ;note added 1 to position for right side of character
LCDOUT $FE,$C0+nPos,1
LCDOUT $FE,$C1+nPos,0 ;note added 1
LCDOUT $FE,$94+nPos,1
LCDOUT $FE,$95+nPos,0 ;note added 1
LCDOUT $FE,$D4+nPos,4
LCDOUT $FE,$D5+nPos,5 ;note added 1
return
One1:
LCDOUT $FE,$80+nPos," "
LCDOUT $FE,$81+nPos,0
LCDOUT $FE,$C0+nPos," "
LCDOUT $FE,$C1+nPos,0
LCDOUT $FE,$94+nPos," "
LCDOUT $FE,$95+nPos,0
LCDOUT $FE,$D4+nPos," "
LCDOUT $FE,$D5+nPos,0
return
Two1:
LCDOUT $FE,$80+nPos,6
LCDOUT $FE,$81+nPos,3
LCDOUT $FE,$C0+nPos,7
LCDOUT $FE,$C1+nPos,5
LCDOUT $FE,$94+nPos,1
LCDOUT $FE,$95+nPos," "
LCDOUT $FE,$D4+nPos,4
LCDOUT $FE,$D5+nPos,7
return
Three1:
LCDOUT $FE,$80+nPos,6
LCDOUT $FE,$81+nPos,3
LCDOUT $FE,$C0+nPos,7
LCDOUT $FE,$C1+nPos,5
LCDOUT $FE,$94+nPos," "
LCDOUT $FE,$95+nPos,3
LCDOUT $FE,$D4+nPos,7
LCDOUT $FE,$D5+nPos,5
return
Four1:
LCDOUT $FE,$80+nPos,1
LCDOUT $FE,$81+nPos," "
LCDOUT $FE,$C0+nPos,4
LCDOUT $FE,$C1+nPos,7
LCDOUT $FE,$94+nPos," "
LCDOUT $FE,$95+nPos,1
LCDOUT $FE,$D4+nPos," "
LCDOUT $FE,$D5+nPos,1
return
Five1:
LCDOUT $FE,$80+nPos,2
LCDOUT $FE,$81+nPos,6
LCDOUT $FE,$C0+nPos,1
LCDOUT $FE,$C1+nPos," "
LCDOUT $FE,$94+nPos,6
LCDOUT $FE,$95+nPos,3
LCDOUT $FE,$D4+nPos,7
LCDOUT $FE,$D5+nPos,5
return
Six1:
LCDOUT $FE,$80+nPos,2
LCDOUT $FE,$81+nPos,6
LCDOUT $FE,$C0+nPos,1
LCDOUT $FE,$C1+nPos," "
LCDOUT $FE,$94+nPos,2
LCDOUT $FE,$95+nPos,3
LCDOUT $FE,$D4+nPos,4
LCDOUT $FE,$D5+nPos,5
return
Seven1:
LCDOUT $FE,$80+nPos,6
LCDOUT $FE,$81+nPos,3
LCDOUT $FE,$C0+nPos," "
LCDOUT $FE,$C1+nPos,0
LCDOUT $FE,$94+nPos," "
LCDOUT $FE,$95+nPos,0
LCDOUT $FE,$D4+nPos," "
LCDOUT $FE,$D5+nPos,0
return
Eight1:
LCDOUT $FE,$80+nPos,2
LCDOUT $FE,$81+nPos,3
LCDOUT $FE,$C0+nPos,4
LCDOUT $FE,$C1+nPos,5
LCDOUT $FE,$94+nPos,2
LCDOUT $FE,$95+nPos,3
LCDOUT $FE,$D4+nPos,4
LCDOUT $FE,$D5+nPos,5
return
Nine1:
LCDOUT $FE,$80+nPos,2
LCDOUT $FE,$81+nPos,3
LCDOUT $FE,$C0+nPos,4
LCDOUT $FE,$C1+nPos,5
LCDOUT $FE,$94+nPos," "
LCDOUT $FE,$95+nPos,0
LCDOUT $FE,$D4+nPos,7
LCDOUT $FE,$D5+nPos,5
return
colon1:
lcdout $fe,$C0+nPos,$A5
lcdout $FE,$94+nPos,$A5
return
Bookmarks