LCD BARgraphs


Closed Thread
Results 1 to 40 of 233

Thread: LCD BARgraphs

Hybrid View

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


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Christopher,

    I wasn't slighting your contribution, sorry if it came across that way. I seriously don't think anybody would have figured it out without the testing you did (ok, maybe Darrel if he decided to take it on as a project). It is certainly a unique problem. My posts were both aimed at the community at large. Initially to aviod any confusion by a would be user that is less diligent than yourself. Then, to offer a more comprehensive solution that could be used as a substitute for the original include file. (I would have sent it to Darrel via PM initially for his approval, and possible change to the original file, but since he is a big-wig at ME now, he doesn't accept PMs anymore. )

    And yes, you are correct, that DEFINE can probably go anywhere and it will still work. (I was playing it safe due to limited time to write and test the code for errors while my 3 kids were playing sword-fighting in the living room with me ducking occasionally to avoid a head wound ). If Darrel is inclined to correct that statement via his Moderator powers, I've got no problem with that. I also missed coloring the second "CharLoc1" blue.

    Best Regards,
    Steve

  2. #2
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    No worries. I like to be sarcastic and I'm difficult to offend. In my 7 years (on and off) this forum, it was the first time I was able to provide a contribution that may help other people.

  3. #3
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Is there a way to modify the code to display from the right to the left? I've tried a number of different things but it doesn't work correctly.

  4. #4
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Let the display do the hard work by using the Right to Left "Entry Mode".
    Then just change the custom characters.
    No changes are required to the include file.




    Code:
    X  VAR WORD
    
    ;----[Initialize bargraph]------------------------------------------------------
    X = 0
    @   BARgraph  _X,   1,   1, 20,   512,  lines
        LCDOut $FE,$48,REP $15\8                  ; Custom char 1 - 1 line     |
        LCDOut $FE,$50,REP $05\8                  ; Custom char 2 - 2 lines   ||
        LCDOut $FE,$58,REP $01\8                  ; Custom char 3 - 3 lines  |||
    
    ;----[Main Program Loop]--------------------------------------------------------
    MainLoop:
        FOR X=1 TO 512
            PAUSE 10
            LCDOUT $FE,$94,DEC X,"    "
    
            LCDOUT $FE,$04  ; Set Entry mode Right to Left
    '@      BARgraph   Value, Row, Col, Width, Range, Style 
    @       BARgraph      _X,   1,  20,    20,   512,  lines
            LCDOUT $FE,$06  ; Restore Entry mode Left to Right
    
        NEXT X
    GOTO MAINLOOP
    Of course, I'm assuming the Newhaven display can actually do that.
    Normal LCD's can.
    DT

  5. #5
    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 know you know what happens when one assumes.

  6. #6
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Of course, I'm assuming the Newhaven display can actually do that.
    Are Newhaven LCD's the redheaded step children of LCD's? I've never had a problem with them. Then again, I don't make many projects that have displays and if I do need one I don't look at the manufacturer when ordering one. If I was using an LCD, I'd go with whoever is the cheapest. Regarding OLED, it's the first time I've used one and the Newhaven OLED's are awesome. I am making a product for a car and the screen doesn't get washed out in the light and it's not too bright at night time. It's perfect!

    Anyhow, thanks for the help. I spent a little more than 6 hours trying to get it but you pushed the easy button! Regarding your comment, the display WILL show the bargraph but for some reason you have to modify this line:
    Code:
    BARgraph      _X,   1,  20,    20,   512,  lines
    To this:
    Code:
    BARgraph      _X,   1,  19,    20,   512,  lines
    If you don't modify it, the bargraph will sit in column one with three bars displayed while the number counts from 1 to 512. I guess you can add this to the "uniqueness" of Newhaven displays!

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


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    So, I know that Darrel provided a nice hardware solution. But, like a dog with a new bone, I wanted to work out a software solution.

    When using the modified include file, the only change needed in the main program is an additional parameter to @ BARgraph:

    @ BARgraph Value, Row, Col, Width, Range, Style, RtoL
    0 = Left to Right, 1 = Right to Left

    Here is the code, the file is below:

    Code:
    '****************************************************************
    '*   Creates a variable sized BAR-graph anywhere on the screen  *
    '****************************************************************
    '*  Name    : LCDbar_INC_MOD2.bas                               *
    '*  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 statement:                       *
    '*          :                                                   *
    '*          : DEFINE NEWHAVEN_DISPLAY 1                         *
    '*          :                                                   *
    '* Modified : By SteveB on 11/27/2012                           *
    '*          : This modification introduces the ability to       *
    '*          : display the bargraph from Right-to-Left.          *
    '*          :                                                   *
    '****************************************************************;
    ;@   BARgraph   Value, Row, Col, Width, Range, Style, RtoL
    ;  
    ;Value: The Value of the BARgraph  (0 to Range).If Range = 100 and Value is 50, then            
    ;          half of the BARgraph will be filled in.   Value MUST be a WORD sized variable¹  
    ;
    ;Row: LCD Row to place the BARgraph (1 to 4)   can be either a constant or a  
    ;          variable¹.  
    ;
    ;Col: LCD Column to place the BARgraph (0 to LCDsize² - 1)   can be either a constant  
    ;          or a variable¹. 
    ;
    ;Width: Width of the BARgraph in charaters. (1 to LCDsize²)   can be either a constant  
    ;          or a variable¹. 
    ;
    ;Range: The "full-scale" range of the BARgraph  (0 to 32768) MUST be a constant.  
    ;          Variables will not work here. 
    ;
    ;Style: Selects which Style will be used for the BARgraph  (lines, boxed, blocks)   can  
    ;          be either a constant or a variable¹.  
    ;
    ;RtoL: MUST be a constant
    ;	 When set to 0, Bar will display Left-to-Right
    ;	 When set to 1, Bar will display Right-to-Left
    ;
    ;Note ¹ - Variables must be preceeded with a 
    ;             underscore.   ie.  _Temperature    
    ;Note ² - LCDsize is the number of Chars in 1 line of 
    ;             the LCD, for "4x16" it's 16
    ;                                              ;                        default
    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
    BAR_RtoL    VAR  BYTE : BAR_RtoL = 0
    
    ; --- Temporary vars ----
    BARtemp     VAR  WORD
    Remainder   VAR  WORD
    BARloop     VAR  BYTE
    LastCharset VAR  BYTE : LastCharset = 0
    LastRtoL    VAR  BYTE : LastRtoL = 0
    Limit1      VAR  WORD
    
    GOTO overBAR                                   ; Skip over Subroutines
    
    ThreeBARS CON EXT                              ; Identify the Custom Characters
    TwoBARS   CON EXT
    OneBAR    CON EXT
    CharLoc3  CON EXT
    CharLoc2  CON EXT
    CharLoc1  CON EXT
    
    ASM
     ifdef NEWHAVEN_DISPLAY
    ThreeBARS = 1                                
    TwoBARS   = 2
    OneBAR    = 3
     else
    ThreeBARS = 0                                
    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\9                 ; Custom char 3 lines  |||
        IF BAR_Rtol = 0 THEN
            LCDOut $FE,CharLoc2,REP $14\9             ; Custom char 2 lines  ||
            LCDOut $FE,CharLoc1,REP $10\9             ; Custom char 1 line   |
        ELSE
            LCDOut $FE,CharLoc2,REP $05\9             ; Custom char 2 lines   ||
            LCDOut $FE,CharLoc1,REP $01\9             ; Custom char 1 line     |
        ENDIF
    RETURN
    
    ; --- boxed Style custom chars ----
    CharsetBoxed:
        LCDOut $FE,CharLoc3,$1F,REP $15\7,$1F         ; III
        IF BAR_Rtol = 0 THEN
            LCDOut $FE,CharLoc2,$1C,REP $14\7,$1C     ; II
            LCDOut $FE,CharLoc1,REP $10\9             ; I
        ELSE
            LCDOut $FE,CharLoc2,$07,REP $05\7,$07     ;  II
            LCDOut $FE,CharLoc1,REP $01\9             ;   I
        ENDIF
    RETURN
    
    ; --- blocks Style custom chars ----
    CharsetBlocks:
        LCDOut $FE,CharLoc3,REP $1F\9
        IF BAR_Rtol = 0 THEN
            LCDOut $FE,CharLoc2,REP $1C\9
            LCDOut $FE,CharLoc1,REP $10\9
        ELSE
            LCDOut $FE,CharLoc2,REP $07\9
            LCDOut $FE,CharLoc1,REP $01\9
        ENDIF
    RETURN
    
    ; ----- Show the BAR graph -----------------------------------------------------
    ShowBAR:
        IF BAR_width = 0 then BARdone
        if LastCharset <> BAR_style OR LastRtoL <> BAR_RtoL then ; If for change
            LastCharset = BAR_style
            LastRtoL = BAR_RtoL
            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
    
        IF BAR_RtoL = 0 THEN
            LCDOUT REP ThreeBARS\(BARtemp)                 ; send 3 bars 
        ELSE
            IF BARtemp < BAR_width THEN
                LCDOUT REP " "\(BAR_width - BARtemp - 1)   ; Clear up to BARtemp-1  
            ENDIF  
        ENDIF
    
        IF BARtemp < BAR_width THEN      
            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
        ENDIF
        
        IF BAR_RtoL = 0 THEN
        	IF BARtemp < BAR_width THEN
                LCDOUT REP " "\(BAR_width - BARtemp - 1)   ; clear till the end
            ENDIF
        ELSE
            LCDOUT REP ThreeBARS\(BARtemp)                 ; send 3 bars
        ENDIF
    BARdone:
    RETURN
    
    ASM
    ; --- The main macro for creating BARgraphs ------------------------------------
    BARgraph  macro  Value, Row, Col, Width, Range, Style, RtoL
        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
        MOVE?CB     RtoL, _BAR_RtoL
        L?CALL   _ShowBAR
        endm
        
    ENDASM
    
    overBAR:
    LCDbar_INC_MOD2.bas.txt

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


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Here's some sample code (no fancy animations):

    Code:
    'DEFINE NEWHAVEN_DISPLAY 1   'uncomment if needed
    INCLUDE "LCDbar_INC_MOD2.bas"
    
    wCounter VAR WORD
    
        LCDOUT $FE, $01
        PAUSE 100
    
    MAIN:
        FOR wCounter = 0 to 100
            PAUSE 50
            LCDOUT $FE, $80, DEC3 wCounter
        ;@  BARgraph   Value,   Row, Col, Width, Range, Style, RtoL
        @   BARgraph  _wCounter,   1,  5,    13,   100, lines, 0
        NEXT wCounter                                                             
        
        FOR wCounter = 100 to 0 STEP -1
            PAUSE 50
            LCDOUT $FE, $80, DEC3 wCounter
        ;@  BARgraph   Value,   Row, Col, Width, Range, Style, RtoL
        @   BARgraph  _wCounter,   1,  5,    13,   100, lines, 0
        NEXT wCounter
    
    GOTO MAIN
    Last edited by SteveB; - 28th November 2012 at 05:33.

  9. #9
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Works perfectly! Awesome job!

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