LCD BARgraphs


Results 1 to 40 of 233

Thread: LCD BARgraphs

Threaded View

  1. #31
    Join Date
    May 2006
    Location
    Del Rio, TX, USA
    Posts
    343


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Darrel, I hope you don't mind.

    Here is a modified version of Darrel's code that accommodates the flaw in the Newhaven Display Firmware preventing use of CGRAM location 0. (Changes I made are highlighted in blue)

    Code:
    '****************************************************************
    '*   Creates a variable sized BAR-graph anywhere on the screen  *
    '****************************************************************
    '*  Name    : LCDbar_INC_MOD1.bas                               *
    '*  Original:                                                   *
    '*  Author  : Darrel Taylor                                     *
    '*  Notice  : Copyright (c) 2005                                *
    '*  Date    : 9/8/2005                                          *
    '*  Version : 1.0                                               *
    '*  Notes   : Maximum Range is 32768                            *
    '*          : Range must always be a Constant                   *
    '*          : Value must always be a WORD variable              *
    '*          :                                                   *
    '* Modified : By SteveB on 11/23/2012                           *
    '*          : The original include has been modified to         *
    '*          : accomodate a flaw in Newhaven OLEDs firmware.     *
    '*          : By using the define below, it will adjust the     *
    '*          : custom CGRAM character locations used to 1-3      *
    '*          : (vs. 0-2).                                        *
    '*          :                                                   *
    '*          : If using a flawed Newhaven Display add the        *
    '*          : following define BEFORE the INCLUDE statement:    *
    '*          :                                                   *
    '*          : DEFINE NEWHAVEN_DISPLAY 1                         *
    '*          :                                                   *
    '****************************************************************
    
    BAR_width   VAR  BYTE : BAR_width = 16         ; Width of the BARgraph      16
    BAR_range   VAR  WORD : BAR_range = 100        ; Range of Values (0-100)   100
    BAR_row     VAR  BYTE : BAR_row = 1            ; Row location (1-4)          1
    BAR_col     VAR  BYTE : BAR_col = 0            ; Column location (0-15)      0
    BAR_value   VAR  WORD : BAR_value = 0          ; Current BAR value           0
    BAR_style   VAR  BYTE : BAR_style = 1          ; 1=lines, 2=boxed, 3=blocks  1
    
    ; --- Temporary vars ----
    BARtemp     VAR  WORD
    Remainder   VAR  WORD
    BARloop     VAR  BYTE
    LastCharset VAR  BYTE : LastCharset = 0
    Limit1      VAR  WORD
    
    GOTO overBAR                                   ; Skip over Subroutines
    
        ThreeBARS CON EXT                          
        TwoBARS   CON EXT
        OneBAR    CON EXT
        CharLoc3  CON EXT
        CharLoc2  CON EXT
        CharLoc1  CON EXT
    
    ASM
     ifdef NEWHAVEN_DISPLAY
    ThreeBARS = 1                                ; Identify the Custom Characters
    TwoBARS   = 2
    OneBAR    = 3
     else
    ThreeBARS = 0                                ; Identify the Custom Characters
    TwoBARS   = 1
    OneBAR    = 2
     endif
    
    CharLoc3 = 40h +(ThreeBARS*8)
    CharLoc2 = 40h +(TwoBARS*8)
    CharLoc1 = 40h +(OneBAR*8)
    
    lines  = 0x10000001                            ; Define the Styles
    boxed  = 0x10000002
    blocks = 0x10000003
    ENDASM
    
    ; --- lines Style custom chars ----
    CharsetLines:
        LCDOut $FE,CharLoc3,REP $15\8                  ; Custom char 0 - 3 lines  |||
        LCDOut $FE,CharLoc2,REP $14\8                  ; Custom char 1 - 2 lines  ||
        LCDOut $FE,CharLoc1,REP $10\8                  ; Custom char 2 - 1 line   |
    RETURN
    
    ; --- boxed Style custom chars ----
    CharsetBoxed:
        LCDOut $FE,CharLoc3,$1F,REP $15\6,$1F          ; III
        LCDOut $FE,CharLoc2,$1C,REP $14\6,$1C          ; II
        LCDOut $FE,CharLoc1,REP $10\8                  ; I
    RETURN
    
    ; --- blocks Style custom chars ----
    CharsetBlocks:
        LCDOut $FE,CharLoc3,REP $1F\8
        LCDOut $FE,CharLoc2,REP $1C\8
        LCDOut $FE,CharLoc1,REP $10\8
    RETURN
    
    ; ----- Show the BAR graph -----------------------------------------------------
    ShowBAR:
        IF BAR_width = 0 then BARdone
        if LastCharset <> BAR_style then          ; If the Style has changed ?
            LastCharset = BAR_style
            SELECT CASE BAR_style                 ; Load the new custom chars
                CASE 1 : GOSUB CharsetLines
                CASE 2 : GOSUB CharsetBoxed
                CASE 3 : GOSUB CharsetBlocks
            END SELECT
        endif
        
    @ ifdef LCD4X20    
        LOOKUP BAR_row,[$80,$80,$C0,$94,$D4],BARtemp
    @ else
        LOOKUP BAR_row,[$80,$80,$C0,$90,$D0],BARtemp
    @ endif    
        LCDOUT $FE, BARtemp + BAR_col             ; Move cursor to start of the BAR
        BARtemp = BAR_value * BAR_width           ; calc the char position
        BARtemp = DIV32 BAR_range
        Remainder = R2
    
        For BARloop = 0 to BAR_width -1
            SELECT CASE BARtemp
                CASE IS > BARloop
                    LCDOUT ThreeBARS              ; send 3 bars    |||
                CASE IS < BARloop
                    LCDOUT " "                    ; clear to end of BARwidth
                CASE IS = BARloop
                    Limit1 = BAR_range * 6
                    Limit1 = DIV32 10
                    if Remainder >= Limit1 then
                        LCDOUT TwoBARS            ; send 2 bars    ||
                    else
                        Limit1 = BAR_range * 3
                        Limit1 = DIV32 10
                        if Remainder >= Limit1 then    ; 30%
                            LCDOUT OneBAR         ; send 1 bar     |
                        else
                            LCDOUT " "            ; no bars
                        endif                
                    endif
            END SELECT
        NEXT BARloop
    BARdone:
    RETURN
    
    ASM
    ; --- The main macro for creating BARgraphs ------------------------------------
    BARgraph  macro  Value, Row, Col, Width, Range, Style
        MOVE?CW    Range, _BAR_range              ; Range MUST be a constant
        MOVE?WW    Value, _BAR_value              ; Value MUST be a WORD variable
        if (Row < 5)                              ; Row is a constant
            MOVE?CB    Row,   _BAR_row
        else                                      ; Row is a variable
            MOVE?BB    Row,   _BAR_row           
        endif
        if (Col < 16)                             ; Is Col a constant ?
            MOVE?CB    Col,   _BAR_col
        else                                      ; NO, it's a variable
            MOVE?BB    Col,   _BAR_col                                     
        endif
        if (Width <= 40)
            MOVE?CB    Width, _BAR_width
        else
            MOVE?BB    Width, _BAR_width
        endif
        if ((Style >= lines) & (Style <= blocks)) ; Is Style a valid constant ?
            MOVE?CB    Style, _BAR_style
        else                                      ; NO, treat it like a variable
            MOVE?BB    Style, _BAR_style
        endif
        L?CALL   _ShowBAR
        endm
        
    ENDASM
    
    overBAR:
    Of course, more could be done to make this even more flexible, but this is at least a tidy way do deal with this particular problem.
    Last edited by SteveB; - 24th November 2012 at 01:28. Reason: added ending statement

Similar Threads

  1. Is this code not initialising the LCD properly?
    By Platypus in forum mel PIC BASIC Pro
    Replies: 8
    Last Post: - 30th January 2010, 19:14
  2. 16f688 LCD what have I done wrong
    By spitfiredriver in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th August 2009, 19:54
  3. Play with LCD on PICDEM
    By The IceMan in forum mel PIC BASIC
    Replies: 5
    Last Post: - 22nd August 2008, 16:56
  4. Need help with LCD number display.
    By Steve Matson in forum mel PIC BASIC
    Replies: 8
    Last Post: - 26th June 2007, 23:07
  5. LCD will not start
    By btaylor in forum mel PIC BASIC Pro
    Replies: 49
    Last Post: - 24th May 2007, 02:30

Members who have read this thread : 2

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts