'**************************************************************************** 'GLIPICW.BAS Graphic application for use with a Samsung KS0108 (or compatible) 'graphic LCD controller connected to a Microchip(TM) PIC 16F877 microcontroller 'Written in MELabs PicBasicPro(TM) Ver 3.32 'Beta version 0.8.0 'GLiPIC.exe Beta 0.8.0 is an MS Windows based interface that is used in conjunction 'with GLIPICW.BAS '================== 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(s) 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 lcd_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 lcd_e VAR PORTC.0 'Enable pin on LCD lcd_cd VAR PORTC.1 'Data/Command Pin 4 on LCD lcd_rw VAR PORTC.2 'Read/Write Pin 5 on LCD lcd_cs1 VAR PORTB.1 'ChipSelect1 Pin 15 on LCD lcd_cs2 VAR PORTB.2 'ChipSelect2 Pin 16 on LCD 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 84 '9600 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 6 '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 lcd_dat = 0 ' Clear PORTD lcd_cd = 0 lcd_rw = 0 lcd_e = 0 lcd_cs1 = 1 lcd_cs2 = 0 lcd_rst = 1 pause 100 'Let things stabilize lcd_rst = 0 pause 10 ' Reset LCD lcd_rst = 1 pause 500 'Jump over subroutines to main program goto main ' **** (GO)SUB ROUTINES **** strobe: lcd_e = 1 pauseus e_pause lcd_e = 0 return clearall: lcd_cd = 0 ' Command mode lcd_dat = disp_off ' Display Off gosub strobe lcd_cs1=1 lcd_cs2=0 for index = 1 to 2 for j = row to last_row lcd_cd = 0 'Command mode gosub strobe ' Write the data lcd_dat = col ' Column address = 0 gosub strobe lcd_dat = j gosub strobe lcd_cd = 1 ' Write mode for k = first_col to last_col lcd_dat = blank gosub strobe next next swap lcd_cs1,lcd_cs2 next lcd_cs1=0 lcd_cs2=1 lcd_cd=0 lcd_dat=row gosub strobe lcd_dat = disp_ram ' Ram Line 0 gosub strobe lcd_dat=col gosub strobe lcd_cs1=1 lcd_cs2=0 lcd_dat=row gosub strobe lcd_dat = disp_ram ' Ram Line 0 gosub strobe lcd_dat=col gosub strobe lcd_dat = disp_on 'display on gosub strobe lcd_cd = 1 ' Set Data command lcd_cs1 = 1 ' Left side active lcd_cs2 = 0 return init: 'Initialization lcd_cd = 0 ' Set command mode lcd_cs1 = 1 ' Left Side on lcd_cs2 = 0 ' Right Side off for index = 1 to 2 lcd_dat = disp_off ' Display Off lcd_dat = disp_ram ' Ram Line 0 gosub strobe ' Write the data lcd_dat = col ' Y address = 0 gosub strobe lcd_dat = row ' Page = 0 gosub strobe lcd_dat = disp_on ' Display On gosub strobe swap lcd_cs1,lcd_cs2 next lcd_cs1=1 lcd_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: lcd_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 lcd_cs1=0 lcd_cs2=1 lcd_cd = 0 lcd_dat = col gosub strobe lcd_dat = disp_ram gosub strobe lcd_dat = row + line gosub strobe lcd_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 lcd_cs1=1 lcd_cs2=0 lcd_cd = 0 lcd_dat=col gosub strobe lcd_dat = row + line gosub strobe lcd_dat = disp_ram gosub strobe lcd_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 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 'Eight 1kbyte pages of eeprom 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 if addr=8192 then addr = 0 endif next 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: 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 = 0 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,[wait ("]"),STR in_array\buff_count] 'Wait for ] and the load in_array for index = 0 to buf_cnt 'Get char and place in array Lookdown in_array[index],["0123456789abcdef"],hex_nibble in_array[index]=hex_nibble next for index = 0 to buf_cnt step 2 in_byte = (in_array[index]<<4) | (in_array[index+1]) 'Form a hex number MSB-LSB I2CWRITE sda,scl,ctl,eepaddr,[in_byte] pause 10 eepaddr=eepaddr+1 next goto eep_loop lcd_loop: serin2 in_pin,ser_baud,[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 ****