please dont rip this site
'****************************************************************************
'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 ****







file: /Techref/io/lcd/GLiPIC_bas.htm, 9KB, , updated: 2001/4/16 09:31, local time: 2024/12/23 10:54,
TOP NEW HELP FIND: 
18.217.26.8:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://techref.massmind.org/Techref/io/lcd/GLiPIC_bas.htm"> io lcd GLiPIC_bas</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.


Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?

 

Welcome to massmind.org!

 

Welcome to techref.massmind.org!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .