'************************************************************************ '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: rsdiol@compsys1.com 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 ****