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;


Reply With Quote

Bookmarks