Quote Originally Posted by Denner View Post
Hello,
To display the data you send through I2C or SPI, I have a problem and hope you can help me.
I have altered Joe's original code to use I2C for comms. I used PIC16F88 for the below code. I used a monochrome display running ssd1306 driver/controller.

Code:
;***************************CONFIG SETUP***************************
;__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_OFF & _WDT_OFF & _HS_OSC 
;__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V   
'*************************************************  ******************************
   #CONFIG     
    __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_ON & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO
    #ENDCONFIG
    
'==========================MCU SETUP============================================  
DEFINE OSC 8
DEFINE I2C_HOLD 1
'Include "modedefs.bas"
'DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
'DEFINE ADC_CLOCK 0     ' Work around that sets Vref bits in ADCON1
'DEFINE ADC_SAMPLEUS 50 ' ADC sampling time (uSec)
'ADCON0=ADCON0 | %11000000  ' Work around that sets ADCS in ADCON0
'CM1CON0 = 0
'CM2CON0 = 0
'ANSEL = 0 ' set ANx as analog 
'ANSELH = 0
'ADCON1 = %10000000 ' Right justified results for 10 bits
'ADCON0 = %10000001 ' Internal OSC, AN0, Configure and turn on A/D Module
'OPTION_REG=7
'INTCON = 0
 
    TrisB = %00010000
    CMCON = 7                       ' Turn Off Comparators
    ADCON1 = 7                      ' Disable A/D converter    
    ANSEL = %00000000               ' set all analog pins to digital
    OSCCON = %01110000              ' Set PIC16F88 to 4MHz = %01100000 or
                                    ' 8MHz = %01110000

'============================I/O SETUP==========================================
 BT var PortB.4
LED var PortB.3

'================================usuart========================================

'==============================BAUD SETUP=======================================

I2CDevice var byte
SCL var PortA.3         ' I2C Clock  PortB.4
SDA var PortA.2         ' I2C Data   PortB.1
TEXT VAR BYTE[20]
LENGTH VAR BYTE[2]
DC VAR Byte' "DATA OR COMMAND", $40=DATA; $0=COMMAND --> changed from bit to byte
LCD_DATA VAR BYTE
COM VAR BYTE'COMMAND
'PAGE VAR BYTE'LCD PAGE(B0 TO B7)

I VAR BYTE
J VAR BYTE
X VAR BYTE' LCD POSITION X(0 TO 127)
Y VAR BYTE'LCD POSITION Y(0 TO 7)
CLEAR
'=============================================================================
'PAGE = $B0

I2CDevice = $78      ' X/Y/Z = $3C, Display = $78,

PAUSE 20

GOSUB INIT
GOSUB CLEAR_LCD
GOSUB TITLE


MAIN:

COM=$A6:GOSUB SEND_COMMAND '$A6=NORMAL MODE;$A7=INVERSE MODE
'PAUSE 100
COM=$2E:GOSUB SEND_COMMAND
COM=$27:GOSUB SEND_COMMAND
COM=$00:GOSUB SEND_COMMAND
COM=$03:GOSUB SEND_COMMAND
COM=$04:GOSUB SEND_COMMAND
COM=$06:GOSUB SEND_COMMAND
COM=$00:GOSUB SEND_COMMAND
COM=$FF:GOSUB SEND_COMMAND
COM=$2F:GOSUB SEND_COMMAND
'PAUSE 10000

End
GOTO MAIN


'=========================lcd initialization====================================
INIT:

COM=$AE:GOSUB SEND_COMMAND' DISPALY OFF
COM=$20:GOSUB SEND_COMMAND' HORIZONTAL MODE
COM=$00:GOSUB SEND_COMMAND
COM=$40:GOSUB SEND_COMMAND' DISPLAY START AT 0
COM=$A1:GOSUB SEND_COMMAND' REMAP 0-127 ----> Mirror display
COM=$C8:GOSUB SEND_COMMAND' SCAN DIRECTION
'COM=$DA:GOSUB SEND_COMMAND' COM PINS ------> Not Sure what this does
'COM=$10:GOSUB SEND_COMMAND' COM PINS ------> Not Sure what this does
COM=$A4:GOSUB SEND_COMMAND' DISPLAY ON
COM=$A7:GOSUB SEND_COMMAND' $A6=NORMAL MODE;$A7=INVERSE MODE
COM=$AF:GOSUB SEND_COMMAND' DISPLAY ON

 return
'===============================================================================
'==============================clear lcd========================================
CLEAR_LCD:


   FOR J=0 TO 7 
    FOR I=0 TO 127
        LCD_DATA=$00:GOSUB SEND_DATA  ' was $00
    NEXT I
   NEXT J                             

RETURN 

'****************SEND COMMAND************************************************

SEND_COMMAND:
dc=$0
'SHIFTOUT SDA,SCL,1,[DC\1]'SEND COMMAND BIT(D/C=0)
'SHIFTOUT SDA,SCL,1,[COM\8]

high LED
I2CWrite SDA,SCL,I2CDevice,DC,[COM]

Low led
dc=$40
RETURN 
'*****************************************************************************

'======================Send data===============================================
SEND_DATA:
DC=$40
'SHIFTOUT SDA,SCL,1,[DC\1]'SEND DATA BIT(D/C=1)
'SHIFTOUT SDA,SCL,1,[LCD_DATA\8]

high LED
I2CWrite SDA,SCL,I2CDevice,DC,[LCD_DATA]

Low led
RETURN
'===============================================================================
'=============================FILL=============================================
FILL:
FOR J=0 TO 7
FOR I=0 TO 127
LCD_DATA=$FF:GOSUB SEND_DATA
NEXT I
NEXT J
RETURN
'===============================================================================
'=========================TITLE=================================================
TITLE:
X=0:Y=0 :GOSUB SET_XY
FOR I=0 TO 127
LOOKUP I,[$00,$40,$60,$50,$7E,$50,$60,$40,$02,$06,$0E,$1E,$3E,$00,$00,$00,_
$00,$00,$00,$00,$00,$1F,$3F,$60,$60,$60,$60,$60,$60,$3C,$1C,$00,_
$00,$7F,$7F,$61,$61,$61,$61,$61,$61,$3F,$1E,$00,$00,$1E,$3F,$61,_
$61,$61,$61,$61,$61,$38,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,_
$00,$00,$00,$00,$00,$00,$00,$1F,$3F,$60,$60,$60,$60,$60,$60,$3C,_
$1C,$00,$00,$1E,$3F,$61,$61,$61,$61,$61,$61,$38,$18,$00,$00,$3F,_
$7F,$60,$18,$06,$06,$18,$60,$7F,$3F,$00,$00,$00,$00,$00,$00,$00,_
$00,$00,$00,$1C,$63,$41,$5D,$41,$5D,$41,$5D,$41,$5D,$41,$7F,$00],LCD_DATA
lcd_data=lcd_data rev 8
GOSUB SEND_DATA
NEXT I

X=0:Y=1 :GOSUB SET_XY
for i=0 to 127
lookup i,[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,_
$00,$00,$00,$00,$00,$F8,$FC,$06,$06,$06,$C6,$C6,$C6,$FC,$F8,$00,_
$00,$FE,$FE,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$18,$1C,$86,_
$86,$86,$86,$86,$86,$FC,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00,_
$00,$00,$00,$00,$00,$00,$00,$F8,$FC,$06,$06,$06,$C6,$C6,$C6,$FC,_
$F8,$00,$00,$18,$1C,$86,$86,$86,$86,$86,$86,$FC,$78,$00,$00,$FE,_
$FE,$00,$00,$00,$00,$00,$00,$FE,$FE,$00,$00,$00,$00,$00,$00,$00,_
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00],lcd_data
lcd_data=lcd_data rev 8
GOSUB SEND_DATA
NEXT I

X=0:Y=3:GOSUB SET_XY
for i=0 to 127
lookup i,[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3C,$7E,$C3,$C3,$C3,$C3,_
$C3,$C3,$71,$30,$00,$00,$7F,$FF,$C3,$C3,$C3,$C3,$C3,$C3,$C3,$C3,_
$00,$00,$7F,$FF,$C1,$C1,$C1,$C1,$C1,$C1,$FF,$7F,$00,$00,$7F,$FF,_
$C3,$C3,$C3,$C3,$C3,$C3,$7E,$3C,$00,$00,$3F,$7F,$C0,$C0,$C0,$C0,_
$C0,$C0,$70,$30,$00,$00,$FF,$FF,$03,$03,$03,$03,$03,$03,$FF,$FF,_
$00,$00,$C0,$C0,$C0,$C0,$FF,$FF,$C0,$C0,$C0,$C0,$00,$00,$FF,$FF,_
$0C,$0C,$03,$03,$00,$00,$FF,$FF,$00,$00,$3F,$7F,$C0,$C0,$C0,$C1,_
$C1,$C1,$79,$39,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00],lcd_data
lcd_data=lcd_data rev 8
GOSUB SEND_DATA
NEXT I

X=0:Y=4:GOSUB SET_XY
for i=0 to 127
lookup i,[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$30,$38,$0C,$0C,$0C,$0C,_
$0C,$0C,$F8,$F0,$00,$00,$F8,$FC,$0C,$0C,$0C,$0C,$0C,$0C,$0C,$0C,_
$00,$00,$FC,$FC,$80,$80,$80,$80,$80,$80,$FC,$FC,$00,$00,$FC,$FC,_
$80,$C0,$60,$30,$18,$0C,$04,$00,$00,$00,$F0,$F8,$0C,$0C,$0C,$0C,_
$0C,$0C,$38,$30,$00,$00,$FC,$FC,$00,$00,$00,$00,$00,$00,$FC,$FC,_
$00,$00,$0C,$0C,$0C,$0C,$FC,$FC,$0C,$0C,$0C,$0C,$00,$00,$FC,$FC,_
$00,$00,$00,$00,$C0,$C0,$FC,$FC,$00,$00,$F0,$F8,$0C,$0C,$0C,$8C,_
$8C,$8C,$F8,$F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00],lcd_data
lcd_data=lcd_data rev 8
GOSUB SEND_DATA
NEXT I

X=0:Y=5:GOSUB SET_XY
for i=0 to 127
lookup i,[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1F,$3F,$30,$30,$30,$30,_
$30,$30,$30,$30,$00,$00,$0F,$1F,$30,$30,$30,$30,$30,$30,$1F,$0F,_
$00,$00,$1F,$3F,$30,$30,$30,$30,$30,$30,$1F,$0F,$00,$00,$00,$00,_
$00,$00,$00,$0F,$1F,$30,$30,$30,$30,$30,$30,$1C,$0C,$00,$00,$30,_
$30,$30,$30,$3F,$3F,$30,$30,$30,$30,$00,$00,$0F,$1F,$30,$30,$30,_
$30,$30,$30,$1E,$0E,$00,$00,$3F,$3F,$03,$03,$00,$00,$00,$00,$3F,_
$3F,$00,$00,$1F,$3F,$30,$30,$30,$30,$30,$30,$3F,$1F,$00,$00,$3F,_
$3F,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00],lcd_data
lcd_data=lcd_data rev 8
GOSUB SEND_DATA
NEXT I

X=0:Y=6:GOSUB SET_XY
for i=0 to 127
lookup i,[$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$C0,$C0,$C0,$C0,_
$C0,$C0,$00,$00,$00,$00,$FC,$FE,$03,$03,$03,$03,$03,$03,$FE,$FC,_
$00,$00,$FF,$FF,$E0,$F0,$D8,$CC,$C6,$C3,$81,$00,$00,$00,$00,$00,_
$00,$00,$00,$0C,$8E,$C3,$C3,$C3,$C3,$C3,$C3,$7E,$3C,$00,$00,$03,_
$03,$03,$03,$FF,$FF,$03,$03,$03,$03,$00,$00,$FC,$FE,$03,$03,$03,_
$63,$63,$63,$7E,$7C,$00,$00,$FF,$FF,$00,$00,$C0,$C0,$30,$30,$FF,_
$FF,$00,$00,$FF,$FF,$60,$60,$60,$60,$60,$60,$FF,$FF,$00,$00,$FF,_
$FF,$03,$03,$03,$03,$03,$03,$03,$03,$00,$00,$00,$00,$00,$00,$00],lcd_data
lcd_data=lcd_data rev 8
GOSUB SEND_DATA
NEXT I

RETURN
'===========================================SET X AND Y=========================
SET_XY:
COM=$21:GOSUB SEND_COMMAND
COM=X:GOSUB SEND_COMMAND
COM=127:GOSUB SEND_COMMAND
COM=$22:GOSUB SEND_COMMAND
COM=Y:GOSUB SEND_COMMAND
COM=Y:GOSUB SEND_COMMAND
RETURN
'===============================================================================
END