Shop OBEX P1 Docs P2 Docs Learn Events
Double Size numbers on LCD — Parallax Forums

Double Size numbers on LCD

flying_flipflying_flip Posts: 36
edited 2008-12-04 16:46 in BASIC Stamp
Here is a piece of code that I would like to share.
Using a Parallax LCD, and the BOE, I am starting the code for my Scooter Speedometer display.

Comments and critiques welcome.

Thanks,

Phil

' =========================================================================
'
'   File...... ScooterLCD.BS2
'   Purpose... LCD Control for Scooter program, using customer characters
'   Author.... Philip L. Lutz
'   E-mail.... phillutz@socal.rr.com
'   Started... 18 NOV 2008
'   Updated...
'
'   {$STAMP BS2px}
'   {$PBASIC 2.5}
'
' =========================================================================

' -----[noparse][[/noparse] Program Description ]---------------------------------------------
' Routines for handling an LCD.
'
' PrintDoubleSize prints custom characters spanning 2 columns and 2 rows
' Custom character defintions are stored in eeprom to make digits 0-9 as the 4 character blocks
' first digit, second digit
'  0,1         5,6
'  2,3         7,8
' -----[noparse][[/noparse] Revision History ]------------------------------------------------

#SELECT $STAMP
  #CASE BS2, BS2E, BS2PE
    T1200 CON 813
    T2400 CON 396
    T9600 CON 84
    T19K2 CON 32
    T38K4 CON 6
  #CASE BS2SX, BS2P
    T1200 CON 2063
    T2400 CON 1021
    T9600 CON 240
    T19K2 CON 110
    T38K4 CON 45
  #CASE BS2PX
    T1200 CON 3313
    T2400 CON 1646
    T9600 CON 396
    T19K2 CON 188
    T38K4 CON 84
#ENDSELECT

' -----[noparse][[/noparse] I/O Definitions ]-------------------------------------------------

LcdTx           PIN     14     ' serial output to LCD

' -----[noparse][[/noparse] Constants ]-------------------------------------------------------
LcdBaud         CON     T9600

LcdBkSpc        CON     $08             ' move cursor left
LcdRt           CON     $09             ' move cursor right
LcdLF           CON     $0A             ' move cursor down 1 line
LcdCls          CON     $0C             ' clear LCD (use PAUSE 5 after)
LcdCR           CON     $0D             ' move pos 0 of next line
LcdBLon         CON     $11             ' backlight on
LcdBLoff        CON     $12             ' backlight off
LcdOff          CON     $15             ' LCD off
LcdOn1          CON     $16             ' LCD on; cursor off, blink off
LcdOn2          CON     $17             ' LCD on; cursor off, blink on
LcdOn3          CON     $18             ' LCD on; cursor on, blink off
LcdOn4          CON     $19             ' LCD on; cursor on, blink on
LcdLine1        CON     $80             ' move to line 1, column 0
LcdLine2        CON     $94             ' move to line 2, column 0

LcdCC0          CON     $F8             ' define custom char 0
LcdCC1          CON     $F9             ' define custom char 1
LcdCC2          CON     $FA             ' define custom char 2
LcdCC3          CON     $FB             ' define custom char 3
LcdCC4          CON     $FC             ' define custom char 4
LcdCC5          CON     $FD             ' define custom char 5
LcdCC6          CON     $FE             ' define custom char 6
LcdCC7          CON     $FF             ' define custom char 7

' -----[noparse][[/noparse] EEPROM Data ]-----------------------------------------------------

' Define the number 0
CC0             DATA    $07,$0F,$18,$18,$18,$18,$19,$19,
                        $1C,$1E,$03,$07,$0F,$0F,$13,$13,
                        $1E,$1C,$18,$18,$0F,$07,$00,$00,
                        $03,$03,$03,$03,$1E,$1C,$00,$00
' Define the number 1
CC1             DATA    $01,$07,$07,$01,$01,$01,$01,$01,
                        $10,$10,$10,$10,$10,$10,$10,$10,
                        $01,$01,$01,$01,$07,$07,$00,$00,
                        $10,$10,$10,$10,$1C,$1C,$00,$00
' Define the number 2
CC2             DATA    $07,$0F,$1C,$18,$00,$00,$00,$00,
                        $1C,$1E,$07,$03,$03,$07,$0E,$1C,
                        $01,$03,$07,$0E,$1F,$1F,$00,$00,
                        $18,$10,$00,$00,$1F,$1F,$00,$00
' Define the number 3
CC3             DATA    $1F,$1F,$00,$00,$01,$01,$00,$00,
                        $1F,$1F,$0E,$1C,$18,$18,$1C,$0E,
                        $00,$00,$18,$1C,$0F,$07,$00,$00,
                        $07,$03,$03,$07,$1E,$1C,$00,$00
' Define the number 4
CC4             DATA    $00,$00,$01,$03,$07,$0E,$1C,$18,
                        $0C,$1C,$1C,$1C,$0C,$0C,$0C,$0C,
                        $1F,$1F,$00,$00,$00,$00,$00,$00,
                        $1F,$1F,$0C,$0C,$0C,$0C,$00,$00
' Define the number 5
CC5             DATA    $1F,$1F,$18,$18,$1F,$1F,$00,$00,
                        $1F,$1F,$00,$00,$1C,$1E,$07,$03,
                        $00,$00,$18,$1C,$0F,$07,$00,$00,
                        $03,$03,$03,$07,$1E,$1C,$00,$00
' Define the number 6
CC6             DATA    $01,$03,$07,$0E,$1C,$18,$1F,$1F,
                        $1C,$1C,$00,$00,$00,$00,$1C,$1E,
                        $18,$18,$18,$1C,$0F,$07,$00,$00,
                        $07,$03,$03,$07,$1E,$1C,$00,$00
' Define the number 7
CC7             DATA    $1F,$1F,$00,$00,$00,$00,$01,$03,
                        $1F,$1F,$03,$07,$0E,$1C,$18,$10,
                        $07,$06,$06,$06,$06,$06,$00,$00,
                        $00,$00,$00,$00,$00,$00,$00,$00
' Define the number 8
CC8             DATA    $07,$0F,$1C,$18,$18,$1C,$0F,$0F,
                        $1C,$1E,$07,$03,$03,$07,$1E,$1E,
                        $1C,$18,$18,$1C,$0F,$07,$00,$00,
                        $07,$03,$03,$07,$1E,$1C,$00,$00
' Define the number 9
CC9             DATA    $07,$0F,$1C,$18,$18,$1C,$0F,$07,
                        $1C,$1E,$07,$03,$03,$07,$1F,$1F,
                        $00,$00,$00,$00,$07,$07,$00,$00,
                        $03,$07,$0E,$1C,$18,$10,$00,$00

' -----[noparse][[/noparse] Variables ]-------------------------------------------------------

loop1           VAR     Byte
loop2           VAR     Byte
CustomDefn      VAR     Byte

pos             VAR     Bit
digit           VAR     Nib
workVal         VAR     Word
char            VAR     Byte

speed           VAR     Byte

' -----[noparse][[/noparse] Initialization ]--------------------------------------------------

Reset:
  HIGH LcdTx                            ' setup serial output pin
  PAUSE 5

Initialize_Lcd:

  SEROUT LcdTx, LcdBaud, [noparse][[/noparse]LcdCls, LcdOn1 ,LcdBLon]   ' Initialize LCD
  PAUSE 5

' -----[noparse][[/noparse] Program Code ]----------------------------------------------------

Main:

   FOR speed = 0 TO 99
     GOSUB PrintDoubleSize
     PAUSE 500
   NEXT
   PAUSE 1000
   GOTO Main

PrintDoubleSize:

  ' split speed into separate digits
  FOR pos = 0 TO 1             ' For each digit
    IF pos = 0 THEN
      digit = (Speed / 10)
    ELSE
      digit = (Speed // 10)
    ENDIF
    workVal = digit * 32       ' offset for the custom char definition in EEPROM
    CustomDefn = pos * 4       ' offset for the custom char definition storage position

    ' Read/Define Cust Char 0+offset position value
    FOR loop1 = 0 TO 3         ' for each custom character needed
      SEROUT LcdTx, LcdBaud, [noparse][[/noparse]((LcdCC0+loop1)+CustomDefn)]   ' Begin character defintion
      FOR loop2 = 0 TO 7                                     ' 8 bytes, define 8 rows of pixels
        READ (workVal + (loop1 * 8) + loop2), char           ' Get byte
        SEROUT LcdTx, LcdBaud, [noparse][[/noparse]char]                        ' Send it to the LCD
      NEXT
    NEXT
  NEXT

  SEROUT LcdTx, LcdBaud,[noparse][[/noparse](LcdLine1),0,1,4,5] ' Print top part of both digits
  SEROUT LcdTx, LcdBaud,[noparse][[/noparse](LcdLine2),2,3,6,7] ' Print bottom part of both digits

  RETURN
' ----------------------------------------------------

Comments

  • ArsinArsin Posts: 10
    edited 2008-12-03 00:47
    Hey, Im interested in making a speedometer for my longboard I'm very new to the BASIC Stamp, just heard about it in Computer Engineering class. Could you tell me what part's I'd need in order to make it happen?

    My teacher said I need 2 magnets that give a value of 1 and 0 (Obviously) so what he said was to attach a magnet to my wheel and an other on the hanger of my trucks. Then just put the basic stamp underneath my board hooking it up how it's supposed to but I'd like to see my speed after the run since going at high speeds on a longboard and looking at a number instead of looking on the road is dumb I was wondering can the basic stamp record and save data on the fly?

    Thing's I'd like to know are like distance traveled, time, average speed, and speed for every second. I know that the basic stamp doesn't hold a lot of info and I don't want to run to a notebook and then look at it or do my run and then figure out I didn't have enough room to save it. I want it to display on a LCD so off the bat I know I need

    (1) Basic Stamp
    (2) Magnets
    (2) Push buttons (To change the view from Time Distance and Speeds)
    (1) Bread board
    (1) LCD Display

    And one last question can Basic Stamps preform under constant vibration and if I wipe out which I will is there any hope for it lasting or is it better to just get a Garmin Forerunner

    Thanks.
  • flying_flipflying_flip Posts: 36
    edited 2008-12-03 01:53
    Look at hall effect sensors.
    They will pop a signal when metal is passed by them.
    (used to read gear rotation)

    Mount the Hall effect on wheel mount (needs to be close to the passing metal)
    With programming, you should be able to do all of the items on your do list [noparse]:)[/noparse]

    Buttons for toggling the display would be good, but you could also change the display on a cycle.
    Show MPH for 5 seconds, then display Distance Travelled, then Time, thne back to mph....

    You can protect the Stamp by mounting it in a box, rubber mounted (isolated) to take some of the shock.

    Phil
  • ArsinArsin Posts: 10
    edited 2008-12-03 02:40
    So it can store info on the fly? and how many runs would it last(memory wise) if I'm going for 2-3min runs

    and thanks for the help so far
  • flying_flipflying_flip Posts: 36
    edited 2008-12-03 03:18
    It all depends on the size of the program, and EEPROM remaining.
    I have seen other posts, "Data logging" that mention adding EEPROM to your system, thereby increasing the amount your can store.

    You need to decide
    1. what you want to store
    2. how much space a that data sample will occupy
    3. how many samples you want in a minute, 5 minutes...

    You might sample 10 samples per second, once a second, or once every 5 seconds, it all depends on what you want to accomplish.

    Phil
  • sylvie369sylvie369 Posts: 1,622
    edited 2008-12-03 03:25
    Here is that recent thread on data logging:

    http://forums.parallax.com/showthread.php?p=766989
  • Carl HayesCarl Hayes Posts: 841
    edited 2008-12-03 04:15
    A Hall-effect sensor would work, but a reed switch would be cheaper, easier to interface, and lots less fun. Recently I bought a little bag of 50 reed switches on eBay for about three bucks. They're very fast, too -- it's easy to get 50 counts per second with most reed switches, and many are lots faster than that.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    · -- Carl, nn5i@arrl.net
  • GeorgeLGeorgeL Posts: 131
    edited 2008-12-03 05:57
    What Carl said, reed switches could possibly be the best option, but you need to make a formula for the circumfrence of the longboard wheels. That might take you some time. Also how do you plan to attach it. Post pics when done, would be interesting to see.
  • PJAllenPJAllen Banned Posts: 5,065
    edited 2008-12-04 16:46
    F_F,

    Are you writing to user-definable CGRAM, this is a "44780"-type LCD?
Sign In or Register to comment.