version 0 27/09/2021
rev 06/10/2021

*
OLED 1,3 " Bleu , SPI1 Hw MikroC ....(2021-09)
* OLED 1,3 " Bleu , SPI1 Hw 18F26K22 ASM ....(2021-10)


Autres liens :
OLED_I2C 0_96" Jaune Bleu 128x32 25mmx16mm 18F26K22
Clicker_18F47J53 et OLED_I2C 0,96"
Mini OLED 128x32 I2C avec 16F1619



LCD OLED 1,3" grafique 128 x64 , PIC 18F26K22
(2021-0927) version MikroC 7.60

L'afficheur :

DM-OLED13-625
1.3” 128 X 64 BLUE GRAPHIC OLED
DISPLAY MODULE WITH SPI, I2C INTERFACE
* Lien sur datasheet
DM-OLED13-625_SH1106_Datasheet.pdf

DM-OLED13-625
1.3” 128 X 64 BLUE GRAPHIC OLED
DISPLAY MODULE WITH SPI, I2C INTERFACE

Diagonal Size 1.3 inch
Display Mode Passive Matrix OLED -
Display Colors Monochrome (Blue) Colors
Resolution 128 x 64 pixel
Controller IC SH1106 -
Duty 1/64
Interface SPI, I2C -
Active Area 29.42 x 14.7 mm
Panel Dimension 34.5 x 23.0 x 1.4 mm
Weight 2.18 g

configuré en SPI


Bizarre :
l'affichage est tronqué au depart sur 2 pixels, => debut de ligne à x=2
mais affiche OK à la position 124 (124+8=132!)
Le CLS de l'ecran , laisse une bande de 2 pixels sur la partie droite (cracra)
=> modif CLS éran, base sur 132 pixels au lieu de 128 .. l'ecran est BIEN COMPLETEMENT effacé!
La datasheet mentionne pourtant 128 pixels, mais des commentaires vus sur le WEB parlent aussi de 132:

(1) About control chip SSH1106:
SSG1106 compatible with SSD1306 basic, difference is that SSH1106 control chip RAM space is 132*64,
while SSD1306 space is 128*64.
The 1.3-inch OLED 128*64 dot matrix, so in the middle of the screen production took 128 row.
When using SSD1306 program point SSH1106 screen, only need to change address to 0x02 row to start.

(2) There is only one small difference between SSD1306 and SH1106:
The SH1106 controller has an internal RAM of 132x64 pixel.
The SSD1306 only has 128x64 pixel.

First problem for standard 128x64 OLEDs with SH1106 controller is:
How is the 128x64 window mapped into the 132x64 RAM?
It seems, that the 128x64 OLED is centered in most cases within the 132x64 area,
that means pixel (2,0) in ram is pixel (0,0) on the display.





L'init de cet OLED est tiré de l'ordinogramme de la datasheet OLED DM 13-625

unsigned char Init_A_Chaine[]={
// init page 14 datasheet DM-OLED13-625

0xD5,0x80,
0xA8,0x3F,
0xD3,0x00,
0x40,
0xAD,0x8B,
0xA1,
0xC8,
0xDA,0x12,
0x81,0xBF,
0xD9,0x22,
0xDB,0x40,
0x32,0xA6,
0xA4,0x3F,
0xAF,
0xFF

};

HARDWARE :


Pin 16 RC5 MOSI output -> OLED pin 4
Pin 15 RC4
Pin 14 RC3 SPI Clock ----> OLED pin 3
Pin 13 RC2 Reset ----> OLED pin 5
Pin 12 RC1 DC mode ----> OLED pin 6
Pin 11 RC0 Chip Select ---> OLED pin 7
OLED pin 1 GND
OLED pin 2 +Vcc

// SPI1

SOFTWARE 1:

Source MikroC du test avec Base 18F26K22 , FOSC=16MHz et SPI1 Hardware
OLED_SPI_DM13_625_18F26K22_2021_0928.html
projet Mikroc : OLED_SPI_DM13_625_18F26K22_2021-0928.zip
le resultat est PRESQUE OK au niveau de l'affichage BMP .. quelques points apparaissent en haut de la 1ere ligne ecran
Mystere autour de ces 2 pixels !

Initialisations:

#define FOSC_INTERNE
#define SH1106_SPI
#define NB_PAGES 8
#define X_Offset 2
#define SH1106_LCDWIDTH 130
#define SH1106_LCDHEIGHT 64


sbit Chip_Sel at LATC0_bit; //RC0 active ou désactive la transmission
sbit DC_mode at LATC.B1; //RC1 sélection du mode : commande = 0 , donnée = 1
sbit RES at LATC.B2; //RC2 reset de l'écran
sbit Sck at LATC.B3; // RC3 horloge de synchronisation SPI
sbit MOSI at LATC.B5; // RC5 envoye les données sur écran oled 128x64

sbit Chip_Sel_Dir at TRISC.B0;
sbit DC_mode_dir at TRISC.B1;
sbit RES_dir at TRISC.B2;
sbit Sck_dir at TRISC.B3; // RC3 horloge de synchronisation SPI
sbit MOSI_dir at TRISC.B5; // RC5 MOSI Master Out -> Slave Input


Affichage TEXTE

Cet afficheur GRAPHIQUE nécessite AU MINIMUM une table de definition des caracteres en taille 1 (6x8)
const unsigned char font_regular_6x8[92][6] = ....
une 2em table pour affichage au format 8x16 , sert à l'affichage taille 2 :
unsigned char code F8X16[]=...


strConstRamCpy(CRam1,"L2 size1 ABCDEFGHijk") ;
OLED_ShowStr(X_Offset,1,CRam1,
1);
Delay_1sec();
CPrint("Display size2\r\n");
strConstRamCpy(CRam1,"L3 Display size2") ;
OLED_ShowStr(X_Offset,2,CRam1,
2);
Delay_1sec();


Affichage de 4 lettres consecutives de l'alphabet sur chaque ligne avec decalage de 1 char .
...


OLED_SetPos(0,0);
for (i=0;i<8;i++)
{
CPrint(" Ligne # "); UART1_Write(i+48);
OLED_SetPos(0,i);
for (j=0;j<4;j++)
{
Write_Char_At(
X_Offset+j*8+i*8,i,'A'+i*4+j);
UART1_Write(
'A'+i*4+j);
}
CRLF1();
Delay_1sec();
}


Lettre intercalée dans chaque ligne avec un pas de 2

OLED_CLS();
OLED_SetPos(0,0);
for (i=0;i<8;i++)
{
strConstRamCpy(CRam1,"123456789012345678901");
*(CRam1+i*2)='.';
*(CRam1+i*2+1)='A'+i;
*(CRam1+i*2+2) ='.';
Print(CRam1);CRLF1();
OLED_ShowStr(X_Offset,i,CRam1,1);
}
Delay_2sec();
on a bien 21 chars par ligne et 8 lignes



Test partie purement grafique

images/t_OLED_SH1106_fonctions_graphique.gif
Pixel, ligne, rectangle, Cercle
voir video

Les Fonctions et annexes

images/t_Projet_OLED_SH1106_18F26K22_Functions_et_Includes.gif


Probleme affichage image contourné :
RAZ taille memoire de (132*64)/8= 1056
Buffer dimensionné à 1060...
void SH1106_ClearDisplay(void)
{
unsigned int i;
for (i=0; i < sizeof(buffer); i++) buffer[i] = 0;
}
Affichage image BMP 128*64 avec offset X=2

void Display_Picture(unsigned const char * pic)
{
int k;
unsigned char i,j=0;
for(i=0; i<8; i++)
{
Set_Page_Address(i);
Set_Column_Address(0x04);
WriteCmd(0x40);
for(j=
X_Offset ; j<132; j++) // ... exploration à partir du 2em pixel de chaque ligne
{
k=i*128+j;
WriteDat(*(pic+k));
}
}
}


Affichage de 8 images BMP 128x64 en N&B
Declaration des images en Flash ROM
Tableau de pointeur sur chaque image et chaque titre d'image
avec Image #6 dedoublée,mais en video inverse

for (i=0;i<8;i++)
{
CPrint(" Image :"); UART1_Write(i+49);UART1_Write(' ');
CPrint(Tableau_Titre[i]); CRLF1();
SH1106_ClearDisplay();
p1=Tableau_BMP[i];
if(i==6) Display_Picture(p1,1) ; else Display_Picture(p1,0) ;
Delay_2sec();
}

Nota : Outils de conversion BMP
// http://en.radzio.dxp.pl/bitmap_converter/
// http://www.majer.ch/lcd/adf_bitmap.php

Les fichiers *.h contiennent les images BMP en N&B , de 1024 bytes ( pour 128x64= 8192 bits -> 8192/8=1024 Bytes)

#include "../__common/BMP_128x64_Cheval.h"
#include "../__common/BMP_128x64_Vumetre.h"
#include "../__common/BMP_128x64_Popeye.h"
#include "../__common/BMP_Truck.h"
#include "../__common/BMP_Bip_bip_Coyote_128x64.h"
#include "Symboles_128x64.inc"
ou en mémoire prog.ROM
unsigned char const Marilyn_Monroe[]=...
unsigned char const paulfjujo []=....

Déclaration des pointeurs ..

unsigned const char *p1;
unsigned const char *Tableau_BMP[]={cheval,Bip_bip_Coyote_128x64,Popeye_Olive,Vumetre,truck_bmp, Marilyn_Monroe , Marilyn_Monroe ,paulfjujo,Symboles} ;
unsigned const char *; Tableau_Titre[]={"cheval","Bip_bip_Coyote_128x64","Popeye_Olive","Vumetre","truck_bmp","Marilyn_Monroe_blanc","Marilyn_Monroe_blanc_reverse","paulfjujo","Symboles"}


rajout parametre , pour affichage inverse video , dans la fonction :
void Display_Picture(unsigned const char * pic, char Reverse)
...
cz= (*(pic+k));
if (Reverse==0) WriteDat(cz); else WriteDat(~cz);

normal inverse


sur terminal YAT :

MCU : 18F26K22 DIP28
Power supply: 3.6 V mini ! up to 5.0V
Directory : C:\_MikroC\_MesProjets_MikroC\OLED_SPI_DM13_625_18F26K22_2021
Projet : OLED_SPI_DM13_625_18F26K22_2021-10.mcppi
Source : OLED_SPI_DM13_625_18F26K22_ version 2021_1003
Autres : UART1 à 115200bds , usage SPI1 Hardware
Config : P18F26K22_Base_Fosc_interne_16MHz.cfgsch
FOSC : 16MHz
Hardware : Carte Base 18F26K22, LCD OLED SH1106 1.3P 128x64 en Bleu

Advanced SPI Hardware Init RC0=Cs RC3=SCKL RC5=MOSI
Init (A) OLED 1,3" SH1106 LCD 128x64

Ligne # 0ABCD
Ligne # 1EFGH
Ligne # 2IJKL
Ligne # 3MNOP
Ligne # 4QRST
Ligne # 5UVWX
Ligne # 6YZ[\
Ligne # 7]^_`

.A.456789012345678901
12.B.6789012345678901
1234.C.89012345678901
123456.D.012345678901
12345678.E.2345678901
1234567890.F.45678901
123456789012.G.678901
12345678901234.H.8901
Display taille 1
Display size2

Image :1 cheval
Image :2 Bip_bip_Coyote_128x64
Image :3 Popeye_Olive
Image :4 Vumetre
Image :5 truck_bmp
Image :6 Monroe_128x64_bmp
Image :7 paulfjujo
Image :8 Symboles
Image :9 Tigre
..etc ..



Tricks & Trip / Remarques:
Probleme pour inclure ces 2 fichiers ? Why ?
//#include "../__common/BMP_128x64_Monroe_blanc.h"
//#include "../__common/BMP_Tigre_128x64.h"

j'ai donc inclus directement le contenu dans le source
et No problemo ! existe-t-il une limite du nombre de fichier <Include> avec MikroC ?




Software :
Mikroc 7.60 pro
Projet : OLED_SPI_DM13_625_18F26K22_2021-10.mcppi
Zip mikroC : OLED_SPI_DM13_625_18F26K22_2021-1006.zip rev 06/10/2021
Source : OLED_SPI_DM13_625_18F26K22_2021_1006.c
Config : OLED_SPI_DM13_625_18F26K22_2021-10.cfg
Chargeur : OLED_SPI_DM13_625_18F26K22_2021-1006.hex

0 1144 Used RAM (bytes): 1410 (36%) Free RAM (bytes): 2465 (64%)
0 1144 Used ROM (bytes): 16696 (25%) Free ROM (bytes): 48840 (75%)

Video :
Test_OLED_1-3P_132x64_en_C_2021-1006.webm


....... to be continued with a 18F27K42 version !




Version 18F26K22 en ASM (MPLAB 8.92)

SOFTWARE

Rendons à César ce qui est à César
Réaménagement de la version originale de Temps_X
même config Hardware que appli en C , ci dessus

18F26K22_OLED_SH1106_SPI_128x64_2021-1003.asm
18F26K22_OLED_SH1106_SPI_128x64_2021-1003.HEX


même resultat qu'en C
voir discussion sur Forum Fantaspic section ASM

La plupart des images BMP sont de (C) TempsX















../common/mylogo_CI.jpg



Retour à l'index general