LCD BARgraphs


Closed Thread
Results 1 to 40 of 233

Thread: LCD BARgraphs

Hybrid View

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


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    Quote Originally Posted by SteveB View Post
    THE CHANGES IN THE ABOVE POST ARE INCOMPLETE!!!

    If you make those modifications, you need to change all of the custom character declarations. Otherwise, the other styles will not work properly. Here are the other modifications (shown with the first set for context):
    No kidding. Did you read my post?
    You have change the numbers in the other two character sets if you use blocks and boxes.

    Quote Originally Posted by Darrel Taylor View Post
    So, what you're saying is that if you use Custom Character 0 on those displays, everything goes crazy?
    Displaying the wrong characters on the wrong lines.

    And by just not using Cust. Char 0, everythings AOK?
    On both of your dispays?

    That's a new one ... but it sounds typical for Newhaven.
    Yup. I tried this on both displays with different programs. Whenever a 0 is used, the display gets all wacky. It will not only display the characters on the wrong line, the entire OLED displays wacky stuff. (I took two crappy cell phone pics of the differences). You also have to change the LCDOUT commands too. If you don't, it will still work but the box won't be filled out completely.

    I tested it a bunch of different ways and I couldn't make it fail. Perhaps I didn't test every single mode but what I did test (what I normally use) worked perfectly!Name:  IMAG0306.jpg
Views: 2331
Size:  47.4 KBName:  IMAG0307.jpg
Views: 2325
Size:  80.5 KB

  2. #2
    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

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


    Did you find this post helpful? Yes | No

    Default Re: LCD BARgraphs

    (Changes I made are highlighted in blue)
    I'm glad I was able to help.

    '* : If using a flawed Newhaven Display add the *
    '* : following define BEFORE the INCLUDE statement:
    It doesn't matter where you put this statement. Top, bottom, side, back, inbetween, etc. It will work no matter it is.

  4. #4
    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

  5. #5
    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.

  6. #6
    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.

  7. #7
    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

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