a portrait version

Code:
'*******************************************************************
'* Name : SSD1306p.pbpmod *
'* Author : richard *
'* Notice : Copyright (c) 2021 *
'* : *
'* Date : 28/12/2023 *
'* Version : 1.1 *
'* Notes : generic GRX graphics DRIVER FOR SSD1306 *
'* : HW I2C PIC18 ONLY *
'* : 40x72 disp added *
'* : portrait version *
'* : *
'* : *
'**********************************************************************
;set these to match display IN MAIN
' ssd1306_addr con $78
' #DEFINE colours 1 ;1 mono 2 rg or 3 rgb
' width con 128
' height con 32
' h_offset con 0 ;28 for 40x72
glrot var byte[8]
glrb var byte[8]
gltmp var byte[3]
glcd_rad var WORD
glcdData VAR byte 'DATA
glcdBC VAR BYTE 'gca var
page VAR WORD 'gca var
gy var byte 'gca pg address
gy_ var byte 'gca pg address
gx var byte 'gca row address
gx_ var byte 'gca row address
ssd_add var byte
USERCOMMAND "SENDBYTE" ;BYTE
USERCOMMAND "SSDC" ;cmd BYTE TO SSD1306
ssdheight con WIDTH/8-1 ; 7 = 8 PAGES 64*128 , 3 = 4 pages 32*128
ssdwidth con HEIGHT-1 ; 128 PIXELS WIDE
goto overssd
ASM
SSDC?C macro Cin
MOVE?CB Cin , _glcdData
L?CALL _cmd_byte
endm
SSDC?B macro Cin
MOVE?BB Cin , _glcdData
L?CALL _cmd_byte
endm
SENDBYTE?B macro Dat
MOVE?BB Dat ,_glcdData
L?CALL _send_byte
endm
SENDBYTE?W macro Dat
MOVE?WB Dat ,_glcdData
L?CALL _send_byte
endm
SENDBYTE?C macro Dat
MOVE?CB Dat ,_glcdData
L?CALL _send_byte
endm
ENDASM
glcd_init:
bgcolour = 0
colour = 1
SSPSTAT = 0 'High Speed Filter
SSPADD = $14'400 kHz @64 MHz ?
SSPCON1 = 101000 'I2C Master Mode Enable
SSPCON3 = 0
ssd_add = ssd1306_addr
SSDc $AE ' Display OFF
SSDc $d5
SSDc $80
SSDc $a8 : SSDc $3f
SSDc $D3 : SSDc $00 ; Set Display Offset Mode Set 0
if ssdheight > 4 then
SSDc $40 ' Set display start line 0
elseif ssdheight > 3 then
SSDc $68 ' Set display start line
else
SSDc $60 ' Set display start line 4
endif
SSDc $8D : SSDc $14 ' Set Charge Pump Internal
SSDc $20 : SSDc $01 ' Adressing mode Horizontal
SSDc $A1 ' set segment remap column 127 as start
SSDc $C0 ' Com Scan Direction, Flip display vertically
SSDc $DA ' set COM pins
if ssdheight > 3 then
SSDc$12 ' set COM pins = 128x64=$12
else
SSDc$02 ' set COM pins = 128x32=$02
endif
SSDc $81 : SSDc$7F ' Set brightness to $01 to $FF ($7F is default, $01 is faint)
SSDc $DB : SSDc$40 ' Set VCOM Deselect Level
SSDc $B0 ' Set Page Address From $B0 to $B7
SSDc $2e ; scroll off
SSDc $A4 ' display ON continue
SSDc $A6 ' $A6=NORMAL MODE; $A7=INVERSE MODE
SSDc $AF ' Display ON
return
show:
' gosub flip
SSDc $22
SSDc 0
SSDc ssdheight
SSDc $21
SSDc h_offset
SSDc ssdwidth + h_offset
SSPCON2.0 = 1 ; SEN - Start Condition Enable Bit
WHILE SSPCON2.0 = 1 : WEND ; Wait for Start to complete
SSPBUF = ssd_add ; Move data to SSPBUF
WHILE SSP1STAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
While SSP1CON2.6 = 1 : WEND ; Wait for Acknowledge from slave
SSPBUF = $40 ; Move data to SSPBUF
WHILE SSPSTAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
While SSPCON2.6 = 1 : WEND ; Wait for Acknowledge from slave
for glcd_rad = 0 to width/8 * height -1
SENDBYTE fbr[glcd_rad ]
next
SSPCON2.2 = 1
' gosub flip
return
send_byte : 'DATA
SSPBUF = glcdData; Move data to SSPBUF
WHILE SSPSTAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
While SSPCON2.6 = 1 : WEND ; Wait for Acknowledge from slave
return
cmd_byte: 'send command sequence "glcdData "
SSPCON2.0 = 1 ; SEN - Start Condition Enable Bit
WHILE SSPCON2.0 = 1 : WEND ; Wait for Start to complete
SSPBUF = ssd_add ; Move data to SSPBUF
WHILE SSPSTAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
While SSPCON2.6 = 1 : WEND ; Wait for Acknowledge from slave
SSPBUF = 0 ; Move data to SSPBUF
WHILE SSPSTAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
While SSPCON2.6 = 1 : WEND ; Wait for Acknowledge from slave
SSPBUF = glcdData ; Move data to SSPBUF
WHILE SSPSTAT.2 = 1 : WEND ; SSPSTAT = 1 Transmit in progress
While SSPCON2.6 = 1 : WEND ; Wait for Acknowledge from slave
SSPCON2.2 = 1 ; PEN - send stop bit
While SSP1CON2.2 = 1 : Wend ; Wait for SSP to complete
return
overssd:
with demo
Code:
'PIC18F26K22#CONFIG
CONFIG FOSC = INTIO67
CONFIG PLLCFG = ON
CONFIG PRICLKEN = ON
CONFIG FCMEN = OFF
CONFIG IESO = OFF
CONFIG PWRTEN = ON
CONFIG BOREN = SBORDIS
CONFIG BORV = 190
CONFIG WDTEN = ON
CONFIG WDTPS = 32768
CONFIG CCP2MX = PORTC1
CONFIG PBADEN = OFF
CONFIG CCP3MX = PORTB5
CONFIG T3CMX = PORTC0
CONFIG HFOFST = ON
CONFIG P2BMX = PORTB5
CONFIG MCLRE = EXTMCLR
CONFIG STVREN = ON
CONFIG LVP = OFF
CONFIG XINST = OFF
CONFIG DEBUG = OFF
CONFIG CP0 = OFF
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF
CONFIG CPD = OFF
CONFIG WRT0 = OFF
CONFIG WRT1 = OFF
CONFIG WRT2 = OFF
CONFIG WRT3 = OFF
CONFIG WRTC = OFF
CONFIG WRTB = OFF
CONFIG WRTD = OFF
CONFIG EBTR0 = OFF
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTR3 = OFF
CONFIG EBTRB = OFF
#ENDCONFIG
DEFINE OSC 64
clear
ssd1306_addr con $78
#DEFINE colours 1 ;1 mono 2 rg or 3 rgb
width con 64
height con 128
h_offset con 0
DEFINE DEBUG_REG PORTB
DEFINE DEBUG_BIT 7
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 0
LATB.7=1
trisb.7=0
include "grx.pbpMOD"
include "SSD1306p.pbpMOD"
include "font.bas"
BUFF VAR BYTE[32]
ANSELB=0
ANSELC=0
ANSELA=0
OSCCON=$70
OSCTUNE.6=1
SETFONT FONT5x7
gosub glcd_init
main:
gosub grf_clr
gosub show
ARRAYWRITE BUFF,["GLCD",0]
DMDSTR 3,75,buff,1
DMDBMP 0,0,TestIcon
gosub show
pause 5000
goto main
end
TestIcon:
@ db 0x10,0x10 ;16x16
@ db 0xFF,0xFF;
@ db 0xC0,0x03;
@ db 0xA0,0x05;
@ db 0x90,0x09;
@ db 0x88,0x11;
@ db 0x84,0x21;
@ db 0x82,0x41;
@ db 0x81,0x81;
@ db 0x81,0x81;
@ db 0x82,0x41;
@ db 0x84,0x21;
@ db 0x88,0x11;
@ db 0x90,0x09;
@ db 0xA0,0x05;
@ db 0xC0,0x03;
@ db 0xFF,0xFF;
Bookmarks