Help with LCD Scroll


Closed Thread
Results 1 to 15 of 15

Hybrid View

  1. #1
    Join Date
    Aug 2003
    Posts
    985


    Did you find this post helpful? Yes | No

    Default Re: Help with LCD Scroll

    So since that was meaningless if you can’t scroll on LCD already, I’ll try an example.

    Code:
    string var byte [16] ‘ because I assume it’s one line of a 2x16 display but you can change this
    character var byte ‘ the current character
    counter var byte ‘ a step counter and index
    lindex var byte ‘ a lookup table index
    Now how you’re getting the string in the first place you didn’t say, it could be being typed in serial,
    or already stored in eprom or something. I’ll go with a longer than 16 char message stored in lookup table,
    and put it in a subroutine at the end of the program.

    Code:
    lookuptable: ‘ get the next character from the table into the character buffer
    LOOKUP lindex,[“CHECK IT OUT A SCROLLING TEXT DEMO!!!”],character ‘ 0-36 length message (37 characters in Human talk)
    return
    We need something to actually rotate the 16 char line buffer and drop the oldest byte off the end
    whenever a new character is shifted in. This goes in a subroutine also at the end of the program.

    Code:
    '
    rotatearray:				‘ rotate line array
    for counter = 16 to 1 step - 1
    string[counter] = string[counter-1]
    next counter
    string[0] = character			‘ insert new character byte at zero index
    return
    ‘
    Then a main cycle is needed to index the lookup table, call the lookup and rotate routines and
    print the line to LCD. After the variable declarations and before the subroutines:

    Code:
    lindex = 0
    CLEARLCD ‘ it’s been a while since I looked at LCDOUT, but whatever two byte code to clear LCD and home.
    '
    cycle:
    HOMELCD ‘ it’s been a while since I looked at LCDOUT, but whatever two byte code to home LCD cursor.
    '
    gosub lookuptable
    lindex = lindex + 1 ‘ increment lookup index
    if lindex > 36 then ‘ limit lookup index to length of message
    lindex = 0
    endif
    gosub rotatearray ‘ rotate line with new character at zero index
    
    for counter = 0 to 15 ‘ print the line to lcd
    LCDOUT string[counter]
    next counter
    
    pause 1000 ‘ delay to see one movement per second
    
    goto cycle ‘ do cycle forever
    Largely untested so if someone has a simulation with LCD pls feel free to run it
    Last edited by Art; - 2nd February 2015 at 19:23.

  2. #2
    Join Date
    Jan 2013
    Location
    Texas USA
    Posts
    229


    Did you find this post helpful? Yes | No

    Default Re: Help with LCD Scroll

    Art,

    I ran your suggestions through a simulator and a couple of things.
    1. Scrolls from Left to Right, ozarkshermit wanted Right to Left.
    2. Characters are in reverse order. Should read for 20 chars on the screen "CHECK IT OUT A SCROL", but comes out "LORCS A TUO TI KCEHC"

    So I took your example and modified it to change these items.

    I put this together for a 18F4620.
    Compiles and runs fine in the simulator.

    Code:
    '*****PIC MCU Configuration Fuses (MPASM)*****
    #IF __PROCESSOR__ = "18F4620"
        #CONFIG
            CONFIG OSC = ECIO6            ; EC oscillator, port function on RA6
            CONFIG  WDT = OFF             ; WDT disabled (control is placed on the SWDTEN bit)
            CONFIG  FCMEN = OFF           ; Fail-Safe Clock Monitor disabled
            CONFIG  IESO = OFF            ; Oscillator Switchover mode disabled
            CONFIG  PWRT = OFF            ; PWRT disabled
            CONFIG  BOREN = SBORDIS       ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
            CONFIG  BORV = 3              ; Minimum setting
            ;CONFIG  WDT = ON              ; WDT enabled
            CONFIG  WDTPS = 512           ; 1:512
            CONFIG  CCP2MX = PORTC        ; CCP2 input/output is multiplexed with RC1
            CONFIG  PBADEN = OFF          ; PORTB<4:0> pins are configured as digital I/O on Reset
            CONFIG  LPT1OSC = OFF         ; Timer1 configured for higher power operation
            CONFIG  MCLRE = ON            ; MCLR pin enabled; RE3 input pin disabled
            CONFIG  STVREN = ON           ; Stack full/underflow will cause Reset
            CONFIG  LVP = OFF             ; Single-Supply ICSP disabled
            CONFIG  XINST = OFF           ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
            CONFIG  DEBUG = OFF           ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
            CONFIG  CP0 = OFF             ; Block 0 (000800-003FFFh) not code-protected
            CONFIG  CP1 = OFF             ; Block 1 (004000-007FFFh) not code-protected
            CONFIG  CP2 = OFF             ; Block 2 (008000-00BFFFh) not code-protected
            CONFIG  CP3 = OFF             ; Block 3 (00C000-00FFFFh) not code-protected
            CONFIG  CPB = OFF             ; Boot block (000000-0007FFh) not code-protected
            CONFIG  CPD = OFF             ; Data EEPROM not code-protected
            CONFIG  WRT0 = OFF            ; Block 0 (000800-003FFFh) not write-protected
            CONFIG  WRT1 = OFF            ; Block 1 (004000-007FFFh) not write-protected
            CONFIG  WRT2 = OFF            ; Block 2 (008000-00BFFFh) not write-protected
            CONFIG  WRT3 = OFF            ; Block 3 (00C000-00FFFFh) not write-protected
            CONFIG  WRTC = OFF            ; Configuration registers (300000-3000FFh) not write-protected
            CONFIG  WRTB = OFF            ; Boot Block (000000-0007FFh) not write-protected
            CONFIG  WRTD = OFF            ; Data EEPROM not write-protected
            CONFIG  EBTR0 = OFF           ; Block 0 (000800-003FFFh) not protected from table reads executed in other blocks
            CONFIG  EBTR1 = OFF           ; Block 1 (004000-007FFFh) not protected from table reads executed in other blocks
            CONFIG  EBTR2 = OFF           ; Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks
            CONFIG  EBTR3 = OFF           ; Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks
            CONFIG  EBTRB = OFF           ; Boot Block (000000-0007FFh) not protected from table reads executed in other blocks
    
        #ENDCONFIG
    #else
        #ERROR "This program requires a PIC 18F4620 MCU"
    #endif
    
    OSCCON = $60  ' Set PIC to 4Mhz & ECIO Clock Mode
    '*****END PIC Configuration*****
    
    '*****Defines*****
    define OSC 4            ' Set clock to 4Mhz in PIC Basic
    '*****Define LCD registers and bits*****
    define LCD_BITS      4
    define LCD_LINES     2
    Define LCD_DREG      PORTD
    Define LCD_DBIT      4
    Define LCD_RSREG     PORTE
    Define LCD_RSBIT     0
    Define LCD_EREG      PORTE
    Define LCD_EBIT      1
    define LCD_RWREG     PORTE
    define LCD_RWBIT     2
    define LCD_COMMANDUS 1500
    define LCD_DATAUS    44
    '*****END Defines*****
    
        ADCON0.0 = 0  ' A/D Converter module is disabled   
        ADCON1 = $0F  ' %0000 1111 AN2=VSS, AN3=VDD, AN12-0 = Digital 
        ADCON2 = $00  ' %0000 0000
        TRISA = 0
        TRISB = 0
        TRISC = 0
        TRISD = 0
        TRISE = 0
        
    
    string var byte[20] ' because I assume it’s one line of a 2x20 display but you can change this
    character var byte ' the current character
    counter var byte ' a step counter and index
    lindex var byte ' a lookup table index
    
        ' Initialize LCD
        Low PORTE.2       ' LCD R/W low = write
        Pause 100         ' Wait for LCD to startup
        
        LCDOUT $fe,1,"Startup"
        pause 1000
    
    
    
    start:
        lindex = 0
        lcdout $fe,1    'CLEARLCD  it’s been a while since I looked at LCDOUT, but whatever two byte code to clear LCD and home.
    
    cycle:
        lcdout $fe, $02 'HOMELCD  it’s been a while since I looked at LCDOUT, but whatever two byte code to home LCD cursor.
        gosub lookuptable
        lindex = lindex + 1 ' increment lookup index
        if lindex > 37 then ' limit lookup index to length of message
            lindex = 0
        endif
        gosub rotatearray ' rotate line with new character at zero index
        
        for counter = 0 to 19 ' print the line to lcd
            LCDOUT string[counter]
        next counter
        pause 1000 ' delay to see one movement per second
        
        goto cycle ' do cycle forever
    
    
    lookuptable: ' get the next character from the table into the character buffer
        LOOKUP lindex,["CHECK IT OUT A SCROLLING TEXT DEMO!!! "],character ' 0-37 length message (38 characters in Human talk)
    return
    
    rotatearray:				' rotate line array
        for counter = 0 to 18 step 1
            string[counter] = string[counter+1]
        next counter
        string[19] = character    
    return
    Regards,
    TABSoft

  3. #3
    Join Date
    Aug 2003
    Posts
    985


    Did you find this post helpful? Yes | No

    Default Re: Help with LCD Scroll

    Lol, thanks, there will always be something off when you don’t actually run it

    Thing is I was reading about string support in the wish list section and thought to myself
    a string is just a character array with a zero value at the end of it.
    All of the C functions: string length, string compare, sprint, etc. can all be written into BASIC easily.

  4. #4


    Did you find this post helpful? Yes | No

    Default Re: Help with LCD Scroll

    Thanks to all the responses.

    Eventually I came up with the lookup table approach, sending one character at a time, and of course it works. The display was just too "jerkey" for my tastes.

    In all the various scrolling approaches linked to, none of them use a "conventional" scroll on a 4 line LCD, and prohibit the scroll from "wrapping" to line 3.

    Disabling the "line wrap" simply is not possible, IMHO.

    Ken

  5. #5
    Join Date
    Aug 2003
    Posts
    985


    Did you find this post helpful? Yes | No

    Default Re: Help with LCD Scroll

    I’m not sure what you mean there by “disabling line wrap not possible”.
    Did you get what you want done?

  6. #6


    Did you find this post helpful? Yes | No

    Default Re: Help with LCD Scroll

    Thanks Art

    See my first post in this thread. I have not been able to accomplish that

    Ken

  7. #7
    Join Date
    Aug 2003
    Posts
    985


    Did you find this post helpful? Yes | No

    Default Re: Help with LCD Scroll

    The way I read it, that should be what the version Tabsoft posted does.
    I might be seeing something else in my mind, or does it just scroll the wrong direction?

    Basically, this could be written simpler if it never had to be a real program.
    You could ditch the line buffer and rotate routine, step the index where you read the lookup table,
    check it’s bounds, and write 20 char to LCD at a time directly to LCD.

    Usually you want to look at, or change the display data, so I’d normally prepare
    all lines of text in buffers, and write all four lines from the line's start positions for every frame.
    even if the text doesn’t change or move.
    If you never write past the end of a line the text can’t wrap.

Similar Threads

  1. Scroll text on LCD second line
    By Raadys in forum General
    Replies: 2
    Last Post: - 25th May 2013, 16:14
  2. trying to do a scroll window
    By AvionicsMaster1 in forum Test Area
    Replies: 0
    Last Post: - 7th September 2011, 14:00
  3. Scroll LCD?
    By polymer52 in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 1st March 2010, 20:24
  4. Olympic timer Scroll Text
    By Patrick in forum mel PIC BASIC Pro
    Replies: 8
    Last Post: - 16th December 2006, 13:03
  5. how to scroll display one character
    By micro in forum General
    Replies: 3
    Last Post: - 13th March 2006, 22:32

Members who have read this thread : 1

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