Graphic LCD support?


Results 1 to 23 of 23

Threaded View

  1. #11
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,159


    Did you find this post helpful? Yes | No

    Default Re: Graphic LCD support?

    Look at what I found going through my archives:

    Code:
    '************************************************************************
    'GLIPICW.BAS Graphic application for use with a KS0108 (or compatible)
    'graphic LCD controller connected to a Microchip(TM) PIC 16F877
    'Written in MELabs PicBasicPro(TM) Ver 3.32
    'Beta version 0.8.0
    '================== NOT FOR COMMERICIAL USE =============================
    '
    '       Author: Ranjit Diol - COMPSys LLC, March 2000
    '            (c) Copyright Ranjit Diol, 2001
    '
    '   DISCLAIMER: This file is being released as non-commericial
    '   freeware. It is being provided "AS IS", neither the author, 
    '   nor COMPSys LLC shall be held liable for any damages caused
    '   by its use.
    '
    '   LICENSE: This application may be used in its entirety or 
    '   in parts within some other non-commercial application as long
    '   as the author is given credit for those parts used.
    '
    '        Contact: [email protected] for more information
    '
    '************************************************************************
    '                  IMPORTANT, PLEASE NOTE THE FOLLOWING
    'This application assumes you have a 64KBit external eeprom connected
    'via I2C. Without that you will only be able to send images directly
    'to the LCD display and not be able to store them -- See the readme.txt
    'for the Windows GLiPIC interface.
    '
    'Adjust the PIN assignments as neccessary for your prototype
    'This was tested using a 20MHz xtal if you use a different OSC speed
    'you may have to make some adjustement in the 'strobe' subroutine.
    '************************************************************************
     
    DEFINE ONINT_USED 1 'Required if using ISP
    DEFINE OSC 20   'OSC speed, you may have to tweak the 'strobe'
        'routine's e_pause constant for other speeds
    ADCON1 = 7   'Make all pins digital, you may adjust as needed
     
    SPBRG=0    '************ NOTE ***********
    RCSTA=0    'This is required if you are using
    TXSTA=2    'Shane Tolmie's bootloader (PICLoader)
        '*****************************
     
    dat  VAR  PORTD  'LCD bus Pins 7-14 LSB-MSB
    scl  VAR  PORTC.3  'I2C SCL  for ext eeprom 
    sda  VAR PORTC.4  'I2C SDA for ext eeprom
    in_pin   VAR    PORTC.7         'Serial input pin
    out_pin  VAR    PORTC.6         'Serial output pin
    e  VAR  PORTC.0  'Enable pin on LCD
    cd  VAR PORTC.1  'Data/Command Pin 4 on LCD
    rw  VAR  PORTC.2  'Read/Write Pin 5 on LCD
    cs1  VAR  PORTB.1  'ChipSelect1 Pin 15 on LCD
    cs2  VAR PORTB.2  'ChipSelect2 Pin 16 on LCD
    rst  VAR PORTC.5  'Reset Pin 17 on LCD
    'Set pins for output
    TRISB.0  = 0
    TRISB.1  = 0
    TRISB.2  = 0
    TRISD  = 0
    TRISC.0  = 0
    TRISC.1  = 0
    TRISC.2  = 0
    TRISC.3  = 0
    TRISC.4  = 0
    TRISC.5  = 0
    'Constants used
    ser_baud  CON    32             '19200 baud serout/serin
    ctl       CON    $A0  'EEprom control code
    row    CON  $b8  'LCD page 0
    last_row  CON    $bf  'LCD page 7
    col   CON    $40         'Line byte position 0
    last_col  CON    63             'Last column (1-64)
    first_col CON    0  'First column
    max_col   CON    128            'Last column (1-127)
    max_line  CON    8  'Line 8 (based on 1-8)
    max_pos   CON    64             'Column 64 positon per side (1-64)
    cr        CON    13  'CR for serout
    lf        CON    10  'LF for serout
    disp_on   CON    $3f  'LCD Display ON
    disp_off  CON    $3e            'LCD Display OFF
    disp_ram  CON    $c0            'Ram Display 0 (Page 0 at top of display) 
    blank     CON    $00  'Blank character
    e_pause   CON    10  'Pauseus 6 for Strobe routine
    'Word variables used
    eepaddr  VAR    WORD
    addr     VAR    WORD
    'Arrays used
    in_array VAR    byte[32]
    in_ctl   VAR    byte[8]
    'Byte Variables used
    buff_count VAR  BYTE 'buffer count
    hex_nibble VAR  BYTE 'hex nibble from serin
    in_ascii   VAR  BYTE 'ASCII char from serin
    buf_cnt    VAR  BYTE 'buffer counter
    byte_pos   VAR  BYTE 'To keep track of a byte's position
    in_byte    VAR  BYTE 'The incoming byte
    tmp    VAR BYTE 'Temporary var
    index    VAR BYTE 'Index for arrays
    j    VAR  BYTE 'General counter
    k    VAR  BYTE 'General counter
    line    VAR  BYTE 'An LCD row
    delay      VAR  BYTE 'Execution delay, used with 'pause'
    'Initialize variables
    hex_nibble = 0
    byte_pos   = 0
    delay      = 10
    in_byte    = 0
    tmp        = 0
    index      = 0
     
    'Reset LCD
    dat = 0 ' Clear PORTD
    cd =  0
    rw =  0
    e =   0
    cs1 = 1
    cs2 = 0
    rst = 1
    pause 100 'Let things  stabilize
    rst = 0
    pause 10 ' Reset LCD
    rst = 1
    pause  500
     
    'Jump over subroutines to main program
    goto main
    ' **** (GO)SUB ROUTINES ****
    strobe:
     e = 1
     pauseus e_pause
     e = 0
    return
    clearall:
     cd = 0  ' Command mode
     dat = disp_off ' Display Off
     gosub strobe
     cs1=1
     cs2=0
     for index = 1 to 2
              for j = row to last_row
             cd = 0         'Command mode
              gosub strobe ' Write the data
             dat = col ' Column address = 0
             gosub strobe
             dat = j
             gosub strobe 
             cd = 1  ' Write mode
               for k = first_col to last_col
                  dat = blank
                  gosub strobe
               next
       next
       swap cs1,cs2
            next
     cs1=0
     cs2=1
     cd=0
     dat=row
     gosub strobe
     dat = disp_ram ' Ram Line 0
     gosub strobe
     dat=col
     gosub strobe
     dat = disp_on 'display on
     gosub strobe
     cs1=1
     cs2=0
     dat=row
     gosub strobe
     dat = disp_ram ' Ram Line 0
     gosub strobe
     dat=col
     gosub strobe
     dat = disp_on 'display on
     gosub strobe
     cd = 1  ' Set Data command
     cs1 = 1  ' Left side active
     cs2 = 0
    return 
     
    init:   'Initialization
     cd = 0   ' Set command mode
     cs1 = 1   ' Left Side on
     cs2 = 0   ' Right Side off 
             for index = 1 to 2
        dat = disp_off ' Display Off
        dat = disp_ram ' Ram Line 0
        gosub strobe  ' Write the data
        dat = col  ' Y address = 0
        gosub strobe
        dat = row  ' Page = 0
        gosub strobe
        dat = disp_on ' Display On
        gosub strobe
        swap cs1,cs2
             next
     cs1=1
     cs2=0
     
    return
    '****Place char on LCD Routine *****
    'Place byte of data on lcd assumes in_byte, byte_pos and line (line)
    'Char position on LCD byte_pos = 0-127 (Horiz), ROW 0-7 (vert)
    putbyte: 
     dat = in_byte  'Display the byte
     gosub strobe   
     byte_pos=byte_pos+1 'Increment position
     'Now do some LCD house cleaning and adjust counters
     if byte_pos=max_pos then
        cs1=0
        cs2=1
        cd = 0
        dat = col
        gosub strobe
        dat = disp_ram
        gosub strobe
        dat = row + line
        gosub strobe
        cd = 1
     endif
         if byte_pos = max_col then 'Check if
        line = line + 1  'New Line
                  if line = max_line then
             line = 0
                  endif
         byte_pos = 0  'Reset byte_pos
            cs1=1
     cs2=0
     cd = 0
     dat=col
     gosub strobe
     dat = row + line
     gosub strobe
     dat = disp_ram
     gosub strobe
            cd =1 
         endif
     
    return
    '***** Convert incoming ascii to hex byte Routine *****
    find:
    Lookdown in_array[index],["0123456789abcdef"],hex_nibble
    return 
     
    '===============================
    ' **** BEGIN MAIN PROGRAM ******
    '===============================
     
    main:
     gosub init ' Initialize LCD
     gosub clearall ' Clear all pages
     serout2 out_pin,ser_baud,["Load image..."]
    goto term
    logo: gosub init ' Initialize LCD
     gosub clearall ' Clear all pages
     
    '**** DISPLAY IMAGES IN EXTERNAL 64KBit EEPROM VIA I2C *****
    ' Load opening screen from eeprom assuming a 64KBit eeprom
     byte_pos=0
     line =0
     for addr = 0 to 8192
            I2CREAD sda,scl,ctl,addr,[in_byte]
     gosub putbyte
            if (addr=1024) OR (addr=2048) OR (addr= 3072) OR (addr=4096) OR (addr=5120) OR (addr=6144) OR (addr=7168) OR (addr=8192) then
     pause 4000
     gosub init
     gosub clearall
     endif
     next
            pause 4000
     gosub init
     gosub clearall
    'goto logo  'Continue looping inifitum!
    '********************************************
    'Terminal Subroutine
    term:  'Assumes Home Position
    'Setup variables
    j=0
    index=0
    k=0
    'line=0
    addr=0
    in_ascii = 0
    buff_count = 32
    delay = 10
    'addr = 0
    'byte_pos = 0
    'Get the initial parameters
    get_param:
            addr = 0
            byte_pos = 0
            line=0
     serin2 in_pin,ser_baud,[wait ("*"),STR in_ctl\9]
     for index = 0 to 8
            Lookdown in_ctl[index],["0123456789abcdef"],hex_nibble
     in_ctl[index]=hex_nibble
     next
     delay = (in_ctl[7]<<4) | in_ctl[8]
     buff_count = (in_ctl[1]<<4) | in_ctl[2]
     addr.byte1 = (in_ctl[3] <<4) | in_ctl[4]
     addr.byte0 = (in_ctl[5] <<4) | in_ctl[6]
     buf_cnt = (buff_count - 1)
            eepaddr = addr
     j=in_ctl[0]
     if j = 3 then lcd_loop   'Display directly on LCD
     if j = 1 then eep_loop  'Load ext eeprom
     if j = 2 then logo  'Display images loop
     goto get_param     
     
     
    eep_loop:
     
      serin2 in_pin,ser_baud,5000,get_param,[wait ("]"),STR in_array\buff_count]  'Wait for ] and the load in_array
      for index = 0 to (buff_count - 1)
                    gosub find   'Get char and place in array
             in_array[index]=hex_nibble
      next
     for index = 0 to (buff_count - 1) step 2
      in_byte = (in_array[index]<<4) | (in_array[index+1]) 'Form a hex number MSB-LSB
             I2CWRITE sda,scl,ctl,addr,[in_byte]
             pause 5
                    addr=addr+1                
     next
    goto eep_loop
    lcd_loop:   
      serin2 in_pin,ser_baud,5000,get_param,[wait ("]"),STR in_array\buff_count]  'Wait for ] and the load in_array
      for index = 0 to (buff_count - 1)
                    gosub find   'Get char and place in array
             in_array[index]=hex_nibble
      next
     
     for index = 0 to (buff_count - 1) step 2
      in_byte = (in_array[index]<<4) | (in_array[index+1]) 'Form a hex number MSB-LSB
             gosub putbyte 
     
     
     next
     
    goto lcd_loop
    '*********** E N D ************
    end
    ' **** END OF MAIN PROGRAM ****
    Last edited by Demon; - 3rd May 2011 at 05:58.

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 : 0

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