PDA

View Full Version : TMR0 Interferes with I2C GLCD



prstein
- 14th January 2013, 17:11
I'm using this graphical LCD (http://www.newhavendisplay.com/nhdc160100dizfswfbw-p-1223.html) with a PIC18F26K22. The application counts pulses coming in on TMR0 and, every two seconds, displays the number of counts received. The graphics code works great until I get a pulse rate greater that 5 or 10 per second. As the incoming pulse rate increases the GLCD gets more and more garbled, as if some bytes of data are being skipped or corrupted.

Here's the code. Sorry it's kind of long but most of it is the GLCD initialization and character generation functions. Much has been translated from the C example given in the datasheet. I've also attached a PDF of the schematic.
6816

'Using PIC18F26K22

disable

#CONFIG
CONFIG MCLRE = INTMCLR ;RE3 input pin enabled; MCLR disabled
CONFIG FOSC = INTIO67
CONFIG WDTEN = OFF ;Watch dog timer is always disabled. SWDTEN has no effect.
CONFIG CCP2MX = PORTB3 ;CCP2 input/output is multiplexed with RB3
CONFIG PBADEN = OFF ;PORTB ;<5:0> pins are configured as digital I/O on Reset
CONFIG T3CMX = PORTB5 ;T3CKI is on RB5
#ENDCONFIG

Define OSC 8

ANSELA = 0
ANSELB = 0
ANSELC = 0
ADCON0 = 0

OSCCON = %01100010 '8MHz

LATA = %00000000
TRISA = %00010000

LATB = %00000000
TRISB = %00000011

TRISC.2 = 1
'Start the I2C lines in the right states
LATC.3 = 1 'SCL high
TRISC.3 = 0 'SCL as output
LATC.4 = 0 'SDA low
TRISC.4 = 0 'SDA as output

LATC.5 = 1 'CSB starts high
TRISC.5 = 0 'CSB as output

T0CON = %10101000
' |||||000 - T0PS: (n/a)
' ||||1 - PSA: 1 = TImer0 prescaler is NOT assigned. Timer0 clock input bypasses prescaler.
' |||0 - T0SE: 0 = Increment on low-to-high transition on T0CKI pin
' ||1 - T0CS: 1 = Transition on T0CKI pin
' |0 - TMR0ON: 0 = Timer0 is configured as a 16-bit timer/counter
' 1 - TMR0ON: 1 Enables timer0

T1CON = %10001111
' |||||||1 - TMR1ON
' ||||||1 - TxRD16: 1 = Enables register read/write of Timer1/3/5 in one 16-bit operation
' |||||1 - TxSYNC: 1 = Do not synchronize external clock input
' ||||1 - TxSOSCEN: 1 = Dedicated Secondary oscillator circuit enabled
' ||00 - TxCKPS: 00 = 1:1 Prescale value
' 10 - TMRxCS: If TxSOSCEN = 1: Crystal oscillator on SOSCI/SOSCO pins


'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
'ALIASES
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
LCD_RST var LATB.3
SCL var LATC.3
SDA var LATC.4
SDA_Dir var TRISC.4

TMR1IF var PIR1.0 'TMR1 Overflow Interrupt Flag bit

CSB var LATC.5

GIE var INTCON.7
TMR1ON var T1CON.0

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
'Variables
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
nAddr var byte

nSlave var byte
nComSend var byte
nDataSend var byte
nSlave = $7E'
nComSend = 0
nDataSend = $40

i var byte
j var byte
w var word
nChar var byte
nPage var byte

wDisplay var word
nDig3 var byte
nDig2 var byte
nDig1 var byte
nDig0 var byte
nDPPos var byte ' 0 or 3 or 2 or 1
nDPPos = 0

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
while OSCCON.2 = 0 : wend
CSB = 0
LCD_RST = 0
pause 500
LCD_RST = 1

pause 500
gosub Init_LCD
pauseus 500
gosub clearscreen
pauseus 500

'Set up interrupts
INTCON = %11000000 'GIE, PIE
PIE1 = %00000001 'TMR1 Overflow Interrupt Enable bit
TMR1IF = 0

ON INTERRUPT GOTO IntHandler

enable
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
'Main Loop
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Main:
@ Nop
goto main
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
'End of Main Loop
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
disable

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
'HELPER FUNCTIONS
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
ClearScreen:
for nPage = $B0 to $BC
gosub I2C_Start
nChar = nSlave : gosub I2C_out
nChar = nComSend : gosub I2C_out
nChar = nPage : gosub I2C_out '(page);
nChar = $10 : gosub I2C_out 'I2C_out(0x10); //column address Y9:Y6
nChar = $01 : gosub I2C_out 'I2C_out(0x01);//column address Y5:Y2
gosub I2C_Stop
gosub I2C_Start
nChar = nSlave : gosub I2C_out
nChar = nDataSend : gosub I2C_out
for w = 0 to 159'2070
nChar = 0 : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next w
next nPage
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Zero:
'0 page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$00, $00, $80, $C0, $C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $C0,_
$C0, $80, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'0 page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$FC, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $03, $03, $03, $03,_
$03, $03, $03, $03, $03, $03, $03, $03, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FC],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'0 page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'0 page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'0 page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'0 page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $80, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $7F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'0 page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $01, $03, $07, $07, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $07,_
$07, $03, $01, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
One:
'1 page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80,_
$80, $C0, $C0, $C0, $E0, $E0, $E0, $E0, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'1 page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $7C, $7E, $7E, $7E, $7F, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'1 page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'1 page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'1 page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'1 page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'1 page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0C, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0C, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Two:
'2 page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $C0,_
$C0, $80, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'2 page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03,_
$03, $03, $03, $03, $03, $03, $03, $03, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FC],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'2 page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $80, $80, $C0, $C0, $C0,_
$C0, $E0, $E0, $E0, $E0, $F0, $F0, $F8, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'2 page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$00, $F0, $FC, $FC, $FE, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F, $7F, $7F, $7F, $3F, $3F, $3F,_
$1F, $0F, $03, $01],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'2 page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $07, $03, $03, $03,_
$03, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'2 page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80,_
$80, $80, $80, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'2 page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $03, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Three:
'page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $C0,_
$C0, $80, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03,_
$03, $03, $03, $03, $03, $03, $03, $03, $03, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FC],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $3E, $3E, $3E, $3E, $3E, $3E, $3E,_
$3E, $3E, $3E, $3E, $3E, $3E, $3E, $3E, $3E, $FF, $FF, $FF, $FF, $F7, $F7,_
$F7, $E3, $C3, $80],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$00, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $80, $80, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $FF, $7F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $07,_
$07, $03, $01, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Four:
'page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,_
$00, $80, $C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $C0, $E0, $F0, $F8, $FC,_
$FF, $7F, $1F, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $80, $C0, $E0, $F0, $F8, $FC, $FF, $FF, $7F, $1F, $0F, $07, $01,_
$00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$F8, $FC, $FE, $FF, $FF, $FF, $FF, $FF, $F7, $F1, $F0, $F0, $F0, $F0, $F0, $F0,_
$F0, $F0, $F0, $F0, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F0, $F0, $F0, $F0],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,_
$1F, $1F, $1F, $1F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $1F, $1F, $1F, $1F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $0C, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0C, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Five:
'page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $C0, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $03, $03, $03, $03, $03, $03,_
$03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,_
$1F, $1F, $1F, $1F, $1F, $1F, $1F, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FE, $FC, $F8, $E0],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$00, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $07, $07, $03, $01, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Six:
'page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$00, $00, $80, $C0, $C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$FC, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $03, $03, $03, $03, $03, $03,_
$03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE, $FC, $F0],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $80, $80, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $80, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $01, $03, $07, $07, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $07, $07, $03, $01, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Seven:
'page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$80, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03, $03,_
$03, $03, $83, $C3, $E3, $F3, $FB, $FF, $FF, $FF, $FF, $FF, $7F, $3F, $1F, $0F, $07, $03],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $E0,_
$F8, $FE, $FF, $FF, $FF, $FF, $FF, $FF, $3F, $0F, $03, $00, $00, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $E0, $F8, $FE, $FF, $FF,_
$FF, $FF, $FF, $FF, $7F, $0F, $03, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $F8, $FF, $FF, $FF, $FF, $FF, $FF,_
$FF, $FF, $3F, $03, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $00, $E0, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF,_
$7F, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $00, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Eight:
'page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$00, $80, $C0, $C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $C0, $C0, $80, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$FE, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $03, $03, $03, $03, $03, $03,_
$03, $03, $03, $03, $03, $03, $03, $03, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$00, $C1, $E1, $E3, $F3, $F7, $F7, $FF, $FF, $FF, $3E, $3E, $3E, $3E, $3E, $3E,_
$3E, $3E, $3E, $3E, $3E, $3E, $3E, $3E, $FF, $FF, $FF, $F7, $F7, $F3, $E3, $E1, $C1, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $80, $80, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $80, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $01, $03, $07, $07, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $07, $07, $03, $01, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Nine:
'page 0
if nPage = $B2 then
for i = 0 to 33
lookup i,[_
$00, $00, $80, $C0, $C0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0,_
$E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $E0, $C0, $C0, $80, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 1
elseif nPage = $B3 then
for i = 0 to 33
lookup i,[_
$FC, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $03, $03, $03, $03, $03, $03,_
$03, $03, $03, $03, $03, $03, $03, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FC],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 2
elseif nPage = $B4 then
for i = 0 to 33
lookup i,[_
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00,_
$00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 3
elseif nPage = $B5 then
for i = 0 to 33
lookup i,[_
$0F, $3F, $7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F0, $F0, $F0, $F0, $F0, $F0,_
$F0, $F0, $F0, $F0, $F0, $F0, $F0, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 4
elseif nPage = $B6 then
for i = 0 to 33
lookup i,[_
$00, $00, $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01,_
$01, $01, $01, $01, $01, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 5
elseif nPage = $B7 then
for i = 0 to 33
lookup i,[_
$00, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80,_
$80, $80, $80, $80, $80, $80, $80, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $7F],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

'page 6
elseif nPage = $B8 then
for i = 0 to 33
lookup i,[_
$00, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,_
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $07, $07, $03, $01, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
endif
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
DP:
Select case nPage
case 0,1,2,3,4
for i = 0 to 7
lookup i,[$00, $00, $00, $00, $00, $00, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

case 5
for i = 0 to 7
lookup i,[$00, $00, $80, $80, $80, $80, $00, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i

case 6
for i = 0 to 7
lookup i,[$00, $0F, $1F, $1F, $1F, $1F, $0F, $00],nChar
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
end select
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
DPNo:
for i = 0 to 7
nChar = 0
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Blank:
for i = 0 to 33
nChar = 0
gosub I2C_Out : gosub I2C_Out : gosub I2C_Out : gosub I2C_Out
next i
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''

DisplayVal:
for nPage = $B2 to $B8
'Set up display
gosub I2C_Start
nChar = nSlave : gosub I2C_out
'Set page and column
nChar = nComSend : gosub I2C_out
nChar = nPage : gosub I2C_out '(page);
nChar = $10 : gosub I2C_out 'I2C_out(0x10); //column address Y9:Y6
nChar = $00 : gosub I2C_out 'I2C_out(0x01); //column address Y5:Y2
'Set to recieve pixel data
gosub I2C_Stop
gosub I2C_Start
nChar = nSlave : gosub I2C_out
nChar = nDataSend : gosub I2C_out


'wDisplay can show up to four digits on the board
'put blanks instead of leading zeros
if wDisplay > 999 then
nDig3 = wDisplay dig 3
else
nDig3 = 11
endif
if wDisplay > 99 then
nDig2 = wDisplay dig 2
else
nDig2 = 11
endif
if wDisplay > 9 then
nDig1 = wDisplay dig 1
else
nDig1 = 11
endif
nDig0 = wDisplay dig 0

'Fourth digit
if nDig3 = 0 then
gosub zero
elseif nDig3 = 1 then
gosub one
elseif nDig3 = 2 then
gosub two
elseif nDig3 = 3 then
gosub three
elseif nDig3 = 4 then
gosub four
elseif nDig3 = 5 then
gosub five
elseif nDig3 = 6 then
gosub six
elseif nDig3 = 7 then
gosub seven
elseif nDig3 = 8 then
gosub Eight
elseif nDig3 = 9 then
gosub nine
else
gosub blank
endif

'Third DP
if nDPPos = 3 then
gosub DP
else
gosub DPno
endif

'third digit
if nDig2 = 0 then
gosub zero
elseif nDig2 = 1 then
gosub one
elseif nDig2 = 2 then
gosub two
elseif nDig2 = 3 then
gosub three
elseif nDig2 = 4 then
gosub four
elseif nDig2 = 5 then
gosub five
elseif nDig2 = 6 then
gosub six
elseif nDig2 = 7 then
gosub seven
elseif nDig2 = 8 then
gosub Eight
elseif nDig2 = 9 then
gosub nine
else
gosub blank
endif

'Second dp
if nDPPos = 2 then
gosub DP
else
gosub DPno
endif

'Second digit
if nDig1 = 0 then
gosub zero
elseif nDig1 = 1 then
gosub one
elseif nDig1 = 2 then
gosub two
elseif nDig1 = 3 then
gosub three
elseif nDig1 = 4 then
gosub four
elseif nDig1 = 5 then
gosub five
elseif nDig1 = 6 then
gosub six
elseif nDig1 = 7 then
gosub seven
elseif nDig1 = 8 then
gosub Eight
elseif nDig1 = 9 then
gosub nine
else
gosub blank
endif

'First DP
if nDPPos = 1 then
gosub DP
else
gosub DPno
endif

'First digit (rightmost)
if nDig0 = 0 then
gosub zero
elseif nDig0 = 1 then
gosub one
elseif nDig0 = 2 then
gosub two
elseif nDig0 = 3 then
gosub three
elseif nDig0 = 4 then
gosub four
elseif nDig0 = 5 then
gosub five
elseif nDig0 = 6 then
gosub six
elseif nDig0 = 7 then
gosub seven
elseif nDig0 = 8 then
gosub Eight
elseif nDig0 = 9 then
gosub nine
else
gosub blank
endif

gosub I2C_Stop
next nPage
return


'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
I2C_Start:
SCL=1
SDA=1
pauseus 1
SDA=0
SCL=0
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
I2C_Stop:
SDA=0
SCL=0
pauseus 1
SCL=1
SDA=1
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
I2C_Out:
SCL = 0

sda = nChar.bit7
SCL = 1 'clock in data
SCL = 0

sda = nChar.bit6
SCL = 1 'clock in data
SCL = 0

sda = nChar.bit5
SCL = 1 'clock in data
SCL = 0

sda = nChar.bit4
SCL = 1 'clock in data
SCL = 0

sda = nChar.bit3
SCL = 1 'clock in data
SCL = 0

sda = nChar.bit2
SCL = 1 'clock in data
SCL = 0

sda = nChar.bit1
SCL = 1 'clock in data
SCL = 0

sda = nChar.bit0
SCL = 1 'clock in data
SCL = 0

SDA_Dir = 1 'Make SDA an input
SCL = 1

while PORTA.4 = 1 'wait here until ACK
SCL=0
SCL=1
wend
SCL=0
SDA_Dir = 0 'Make SDA an output
return

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Init_LCD:
gosub I2C_Start
nChar = nSlave : gosub I2C_Out
nChar = nComSend : gosub I2C_Out 'we'll be sending commands
nChar = $48 : gosub I2C_Out' 0100 1000 //partial display duty ratio "Select partial display line"
nChar = $64 : gosub I2C_Out' 0110 0100 // 1/100 duty
nChar = $A0 : gosub I2C_Out' 1010 0000 //ADC select (normal or reverse)
nChar = $C8 : gosub I2C_Out' 1100 1000 //SHL select COM output scanning direction
nChar = $44 : gosub I2C_Out' //initial Com0 register
nChar = $00 : gosub I2C_Out' //scan from Com0
nChar = $AB : gosub I2C_Out' //OSC on
nChar = $26 : gosub I2C_Out' //
nChar = $81 : gosub I2C_Out' 1000 0001 //set electronic volume
nChar = $15 : gosub I2C_Out' 0001 0101 //vopcode=0x1C $15 LARGER = DARKER. No effect on Current
nChar = $56 : gosub I2C_Out' 0101 0110 //set 1/11 bias
nChar = $64 : gosub I2C_Out' 0110 0100 //3x "DC-DC Step-up" boosting circuit
pause 200
nChar = $2C : gosub I2C_Out' 0010 1100 // Power Control
nChar = $66 : gosub I2C_Out' 0110 0110 //5x Boosting circuit"
pause 200
nChar = $2E : gosub I2C_Out' 0010 1110 //
pause 200
nChar = $2F : gosub I2C_Out' 0010 1111 // power control, everything on
nChar = $F3 : gosub I2C_Out' 1111 0011 //bias save circuit
nChar = $00 : gosub I2C_Out' //
nChar = $96 : gosub I2C_Out' //frc and pwm
nChar = $38 : gosub I2C_Out' //external mode
nChar = $75 : gosub I2C_Out' //
nChar = $97 : gosub I2C_Out' //3frc, 45 pwm
nChar = $80 : gosub I2C_Out' //start 16-level grayscale settings
nChar = $00 : gosub I2C_Out' //
nChar = $81 : gosub I2C_Out' //
nChar = $00 : gosub I2C_Out' //
nChar = $82 : gosub I2C_Out' //
nChar = $00 : gosub I2C_Out' //
nChar = $83 : gosub I2C_Out' //
nChar = $00 : gosub I2C_Out' //
nChar = $84 : gosub I2C_Out' //
nChar = $06 : gosub I2C_Out' //
nChar = $85 : gosub I2C_Out' //
nChar = $06 : gosub I2C_Out' //
nChar = $86 : gosub I2C_Out' //
nChar = $06 : gosub I2C_Out' //
nChar = $87 : gosub I2C_Out' //
nChar = $06 : gosub I2C_Out' //
nChar = $88 : gosub I2C_Out' //
nChar = $0B : gosub I2C_Out' //
nChar = $89 : gosub I2C_Out' //
nChar = $0B : gosub I2C_Out' //
nChar = $8A : gosub I2C_Out' //
nChar = $0B : gosub I2C_Out' //
nChar = $8B : gosub I2C_Out' //
nChar = $0B : gosub I2C_Out' //
nChar = $8C : gosub I2C_Out' //
nChar = $10 : gosub I2C_Out' //
nChar = $8D : gosub I2C_Out' //
nChar = $10 : gosub I2C_Out' //
nChar = $8E : gosub I2C_Out' //
nChar = $10 : gosub I2C_Out' //
nChar = $8F : gosub I2C_Out' //
nChar = $10 : gosub I2C_Out' //
nChar = $90 : gosub I2C_Out' //
nChar = $15 : gosub I2C_Out' //
nChar = $91 : gosub I2C_Out' //
nChar = $15 : gosub I2C_Out' //
nChar = $92 : gosub I2C_Out' //
nChar = $15 : gosub I2C_Out' //
nChar = $93 : gosub I2C_Out' //
nChar = $15 : gosub I2C_Out' //
nChar = $94 : gosub I2C_Out' //
nChar = $1A : gosub I2C_Out' //
nChar = $95 : gosub I2C_Out' //
nChar = $1A : gosub I2C_Out' //
nChar = $96 : gosub I2C_Out' //
nChar = $1A : gosub I2C_Out' //
nChar = $97 : gosub I2C_Out' //
nChar = $1A : gosub I2C_Out' //
nChar = $98 : gosub I2C_Out' //
nChar = $1E : gosub I2C_Out' //
nChar = $99 : gosub I2C_Out' //
nChar = $1E : gosub I2C_Out' //
nChar = $9A : gosub I2C_Out' //
nChar = $1E : gosub I2C_Out' //
nChar = $9B : gosub I2C_Out' //
nChar = $1E : gosub I2C_Out' //
nChar = $9C : gosub I2C_Out' //
nChar = $23 : gosub I2C_Out' //
nChar = $9D : gosub I2C_Out' //
nChar = $23 : gosub I2C_Out' //
nChar = $9E : gosub I2C_Out' //
nChar = $23 : gosub I2C_Out' //
nChar = $9F : gosub I2C_Out' //
nChar = $23 : gosub I2C_Out' //
nChar = $A0 : gosub I2C_Out' //
nChar = $27 : gosub I2C_Out' //
nChar = $A1 : gosub I2C_Out' //
nChar = $27 : gosub I2C_Out' //
nChar = $A2 : gosub I2C_Out' //
nChar = $27 : gosub I2C_Out' //
nChar = $A3 : gosub I2C_Out' //
nChar = $27 : gosub I2C_Out' //
nChar = $A4 : gosub I2C_Out' //
nChar = $2B : gosub I2C_Out' //
nChar = $A5 : gosub I2C_Out' //
nChar = $2B : gosub I2C_Out' //
nChar = $A6 : gosub I2C_Out' //
nChar = $2B : gosub I2C_Out' //
nChar = $A7 : gosub I2C_Out' //
nChar = $2B : gosub I2C_Out' //
nChar = $A8 : gosub I2C_Out' //
nChar = $2F : gosub I2C_Out' //
nChar = $A9 : gosub I2C_Out' //
nChar = $2F : gosub I2C_Out' //
nChar = $AA : gosub I2C_Out' //
nChar = $2F : gosub I2C_Out' //
nChar = $AB : gosub I2C_Out' //
nChar = $2F : gosub I2C_Out' //
nChar = $AC : gosub I2C_Out' //
nChar = $32 : gosub I2C_Out' //
nChar = $AD : gosub I2C_Out' //
nChar = $32 : gosub I2C_Out' //
nChar = $AE : gosub I2C_Out' //
nChar = $32 : gosub I2C_Out' //
nChar = $AF : gosub I2C_Out' //
nChar = $32 : gosub I2C_Out' //
nChar = $B0 : gosub I2C_Out' //
nChar = $35 : gosub I2C_Out' //
nChar = $B1 : gosub I2C_Out' //
nChar = $35 : gosub I2C_Out' //
nChar = $B2 : gosub I2C_Out' //
nChar = $35 : gosub I2C_Out' //
nChar = $B3 : gosub I2C_Out' //
nChar = $35 : gosub I2C_Out' //
nChar = $B4 : gosub I2C_Out' //
nChar = $38 : gosub I2C_Out' //
nChar = $B5 : gosub I2C_Out' //
nChar = $38 : gosub I2C_Out' //
nChar = $B6 : gosub I2C_Out' //
nChar = $38 : gosub I2C_Out' //
nChar = $B7 : gosub I2C_Out' //
nChar = $38 : gosub I2C_Out' //
nChar = $B8 : gosub I2C_Out' //
nChar = $3A : gosub I2C_Out' //
nChar = $B9 : gosub I2C_Out' //
nChar = $3A : gosub I2C_Out' //
nChar = $BA : gosub I2C_Out' //
nChar = $3A : gosub I2C_Out' //
nChar = $BB : gosub I2C_Out' //
nChar = $3A : gosub I2C_Out' //
nChar = $BC : gosub I2C_Out' //
nChar = $3C : gosub I2C_Out' //
nChar = $BD : gosub I2C_Out' //
nChar = $3C : gosub I2C_Out' //
nChar = $BE : gosub I2C_Out' //
nChar = $3C : gosub I2C_Out' //
nChar = $BF : gosub I2C_Out' //
nChar = $3C : gosub I2C_Out' //end grayscale settings
nChar = $38 : gosub I2C_Out' //
nChar = $74 : gosub I2C_Out' //
nChar = $AF : gosub I2C_Out' //display on
gosub I2C_Stop
return

'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''
'INTERRUPT HANDLER
'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''
IntHandler:
disable
'Two seconds have elapsed
if TMR1IF = 1 then
TMR1ON = 0
wDisplay.lowBYTE = TMR0L
wDisplay.highBYTE = TMR0H
TMR0H = 0
TMR0L = 0
gosub displayval 'display
TMR1IF = 0
TMR1ON = 1
endif
resume

'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''
end


I have not been able to see any direct evidence of bad data watching the SDA and SCL lines with as oscilloscope. I'm not sure at this point where to look for the problem. Could be my PBP, could be a problem with the PIC. I have duplicated this behavior on three different '18F26K22s so at least it's consistent. I've taken the project off of the pcb to eliminate possible interferences from other components. I have it on a breadboard with only the connections shown in the schematic.

Any suggestions or advice would be appreciated.

Best Regards,
Paul

Ioannis
- 20th January 2013, 17:36
I would suggest to display the updated variable outside the ISR routine.

May be set a flag and at main check the flag and then display your variable.

To be honest I do not like the on interrupt. I 'd prefer DT-INTS18.

Ioannis

prstein
- 21st January 2013, 05:09
Thank you for your thoughtful reply, Ioannis. I managed to solve or, at least, work around the immediate problem.

I suppose you are completely correct about moving to DT interrupts. Old habits are hard to break... This is as good a project as any to give it a a shot.

Best Regards,
Paul

Ioannis
- 21st January 2013, 07:21
You are welcome Paul.

Ioannis

prstein
- 22nd January 2013, 03:45
Well that was easier than expected... Switched over to DT_INTS-18 interrupts. No problems, no hiccups. I have to admit this is pretty darned slick.

Thanks for giving me the push to dive in.

Best Regards,
Paul

Ioannis
- 22nd January 2013, 06:56
This is the spirit of the forum, isn't it?

Glad you got it working.

Ioannis