TMR0 Interferes with I2C GLCD


Closed Thread
Results 1 to 6 of 6
  1. #1
    Join Date
    Feb 2010
    Location
    USA, New England
    Posts
    164

    Default TMR0 Interferes with I2C GLCD

    I'm using this graphical LCD 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.
    LCD-T0.pdf
    Code:
    '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
    The way to avoid mistakes is to gain experience. The way to gain experience is to make mistakes.

  2. #2
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,115


    Did you find this post helpful? Yes | No

    Default Re: TMR0 Interferes with I2C GLCD

    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

  3. #3
    Join Date
    Feb 2010
    Location
    USA, New England
    Posts
    164


    Did you find this post helpful? Yes | No

    Default Re: TMR0 Interferes with I2C GLCD

    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
    The way to avoid mistakes is to gain experience. The way to gain experience is to make mistakes.

  4. #4
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,115


    Did you find this post helpful? Yes | No

    Default Re: TMR0 Interferes with I2C GLCD

    You are welcome Paul.

    Ioannis

  5. #5
    Join Date
    Feb 2010
    Location
    USA, New England
    Posts
    164


    Did you find this post helpful? Yes | No

    Default Re: TMR0 Interferes with I2C GLCD

    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
    The way to avoid mistakes is to gain experience. The way to gain experience is to make mistakes.

  6. #6
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,115


    Did you find this post helpful? Yes | No

    Default Re: TMR0 Interferes with I2C GLCD

    This is the spirit of the forum, isn't it?

    Glad you got it working.

    Ioannis

Similar Threads

  1. Interfacing with Arduino I2C LCD
    By norohs in forum Documentation
    Replies: 47
    Last Post: - 30th May 2017, 18:53
  2. PIC as I2C Slave
    By Mainul in forum General
    Replies: 4
    Last Post: - 5th January 2013, 13:23
  3. 16F1847 Usart and I2C
    By Seahound1 in forum Serial
    Replies: 6
    Last Post: - 18th December 2012, 20:41
  4. Strange I2C and serial behaviour.......
    By jimbostlawrence in forum General
    Replies: 4
    Last Post: - 30th October 2012, 01:02
  5. SSPWM interferes with debug out lcd data
    By retepsnikrep in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 31st January 2011, 15:36

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