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
Pixel, ligne, rectangle, Cercle
voir video
Les Fonctions et annexes
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
Retour à l'index general