version 0.0
11/01/2018
rev 19/01/2018
Test Ecran
LCD couleur 176x220 avec PIC 18F26K22
mode Graphique
usage d'un PIC18F26K22 en DIP28 et du Pickit2 Microchip
pour charger l'executable
Environnemen t: MikroC Pro 7.1.0
Testé avec oscillateur interne
PIC Fosc=32Mhz
Vendu sous la denomination 2.2 Inch SPI 240 x 320 TFT
Color LCD Module Compatible 5110 4 IO for Arduino
mais en réalité : afficheur TFT 2,2" 176x220 65K
couleurs,dialogue en SPI.
je me suis fait roulé !
![]() |
![]() |
![]() |
Back view | Front view | 3 types de fonte 6x8,12x16 et 16x21 |
la partie carte SD n'est pas (encore) utilisée.
Hardware :
Vcc alim PIC= 3,6 à 5V
Sortie RA4 sur Led rouge --2,2K--+VCC
#define _RS LATC1_bit //Command (RS=0) Parameter (RS=1)
#define _CS LATC2_bit // Chip Select
#define _SDI LATC5_Bit // MOSI
#define _CLK LATC3_Bit // SCK
#define _LED 0 // entre LED du LCD connectée au +VCC via R=2,7K
Liaison UART1 : Affichage sur Terminal .. (avec option: Reception de commande via Clavier)
Prototype:
RB7 et RB6 reste libres pour l' ICSP
MCLR au +Vcc via 6,8K et au ICSP Vpp
pour Usage avec Pickit2
RC6 = sortie Tx UART 19200,8,N,1-> Cordon PROLIC TTL/USB -> PC
RC7 =RX pour recevoir les commandes claviers .. se terminant toujours par un <CR>
Connectique et Schema :
hardware tres simple !
Utilisation du SPI1 Hardware du Pic 18F26K22.
RC4 SDI (ou MISO) coté MCU n'est pas utilsée.
Attention aux appellations et de quel coté on se situe: RC5 =MOSI=Master Output pour le Slave Input
Le Slave étant le LCD TFT. avec son entree SDI
d'ou la configuration :
// Control pins
#define _RST LATC0_bit
#define _RS LATC1_bit //Command (RS=0) Parameter (RS=1)
#define _CS LATC2_bit // Chip Select
#define _SDI LATC5_Bit // MOSI
#define _CLK LATC3_Bit // SCK
Software :
Compilateur MikroC 7.10.
Problematique :
Stockage des 3 fontes
Si situées en RAM, il faut 677+2405+642= 3724 bytes ... sur 3875
Taille RAM insuffisante, car il y a d'autres besoins en RAM (TEXTE ..80 , Buffer1 ..80 , CRam1 ..32 et autres variables)
d'ou l'usage d'une zone spéciale appelée HEAP ( ou Tas) destinée à un usage dynamique , permutable.
Cette Zone est definie par la taille de la plus grande Fonte , qui occupe 2405 bytes (arrondi à 2408)
Le mecanisme d'allocation memoire est géré par la librairie MemManager
Il faut definir cette taille maxi dans la configuration du projet
Project
--Edit Project
---cocher Heap
-------et mettre la valeur voulue (2408) dans l'emplacement Size.
fichier de config resultant : P18F26K22_FOSC_interne_8xPLL_32Mhz_with_Heap.cfgsch
Les 3 fontes sont definies dans l'espace Constant code ( en Memoire programe)
pour poiuoir les utiliser en RAM, il faudra donc, au prealable , les transferer dans l'espace alloué dans le HEAP.
et utiliser alors ce pointeur d'espace memoire.
La fonction void Select_Font_Type(int Type) s'en charge.
Apres usage ,on peut utiliser void Close_Font_Type(int Type) qui libere l'espace mémoire
Nota: on pourrait eventuellement toujours utiliser l'espace maxi pour les 3 fontes.. mais c'est aussi à but didacticiel.
Occupation memeoire RAM et ROM
// Used RAM (bytes): 534 (14%) Free RAM (bytes): 3341 (86%) Used RAM (bytes): 534 (14%) *Free RAM (bytes): 3341 (86%)
* Attention, Ce n'est vrai ,Tant qu'on utilise pas de fonte !, la vrai valeur à prendre en compte, c'est 401 bytes.
// HEAP RAM (bytes): 2410 HEAP RAM (bytes): 2410
// Used ROM (bytes): 18902 (29%) Free ROM (bytes): 46634 (71%) Used ROM (bytes): 18902 (29%) Free ROM (bytes): 46634 (71%)
Une autre façon de gerer l'espace serait d'utiliser la librairie FLASH
et lire en RAM, la ligne de bytes correspondant à la lettre à afficher
La zone RAM nessaire serait alors bien plus faible < 32 bytes ! .. mais quid de la vitesse d'affichage.
exemple testé sur la récup des bytes de la lettre A , fonte TerminaL12x16..
une fonte demarre generalement à partir du 32em char normalisé, soit l'espace=32
L'entete de fonte sur 5 bytes, contient des parametres sur la fonte ..( j'ai rajouté le 5em = Nb de char maxi par ligne)
Si on choisit la lettre A , l'adresse de debut du charactere A dans la fonte se trouve donc à :L1=TerminaL12x16+5 + ('A'-32)*25; // 25 bytes par caracteres
FLASH_Read_N_Bytes(L1, buffer1,25); // transfert des 25 bytes en RAM
LongWordToStr(L1+5,CRam1);
UART1_Write_Text(CRam1);
UART1_Write('=');
for (i=0;i<25;i++) // verification des Bytes récupérés
{
ByteToHex(buffer1[i],CRam1);
UART1_Write_Text(CRam1);
UART1_Write(' ');
}
Resultat sur terminal
font.width= 6 cfont.height= 8 cfont.nbrows= 1 cfont.MaxC= 25
6819=0B 00 38 00 3F E0 3F FC 07 FF 06 1F 06 FF 06 FC 07 E0 3F 00 3F 00 38 00 00
const unsigned char TerminaL12x16[] = {
0x0C, 0x10, 0x20, 0x60,14,
.... etc
0x0B, 0x00, 0x38, 0x00, 0x3F, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x06, 0x1F, 0x06, 0xFF, 0x06, 0xFC, 0x07, 0xE0, 0x3F, 0x00, 0x3F, 0x00, 0x38, // lettre A
Une 3em façon serait d'utiliser l'EEPROM du PIC, pour mettre une (petite) Font ( terminal6x8 =>677 bytes)
Ou carrement, une EEPROM Extern genre 24FC1026 ,pour mettre les 3 Fontes et d'autres..
une 4em façon: Carte SD
interressant pour les fontes 7segment, en differentes tailles, , ou en matrice de point
Reste ensuite à comparer les vitesses d'execution et faire des des compromis : le plus rapide sera toujours en RAM !
Bibliotheque ILI9225 :
Je n'ai trouvé aucune LIB , disponible pour PIC ! tout est basé sur ARDUINO ATMEL ( racheté par MicroChip!!)
Mais grace aux exemples fournis en simili C++ ( liens en fin de page.)
j'ai pu quand meme arriver à quelques chose..
Pas evident avec mon LCD TFT acheté en RPC , avec AUCUN MARQUAGE .
La face arriere étant differente des autres modeles touvés sur le WEB., je n'étais as sûr du type de LCD
J'y ai passé pas mal d'heures , surtout à cause des fontes ..
L'essentiel des fonctions sont OK., mais il reste des Bugs
Fonctions disponibles :
void TFT_Init(void);
void Clear_TFT(void);
void Invert(char flag);
void SetBackgroundColor(uint16_t color); //= COLOR_BLACK);
void SetOrientation(uint8_t orientation);
void SetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
void SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
void SetTextColor(uint16_t c) ;
uint16_t SetColor(uint8_t red, uint8_t green, uint8_t blue);
uint8_t GetOrientation(void);
void SetFont( unsigned char * font);
uint16_t maxX2(void);
uint16_t maxY2(void);
void DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
void DrawPixel(uint16_t x1, uint16_t y1, uint16_t color);
void DrawText(uint16_t x, uint16_t y, char * s, uint16_t color); // = COLOR_WHITE);
unsigned char DrawChar(uint16_t x, uint16_t y, unsigned char ch, uint16_t color);
void FillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
void DrawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);
void Swaping(uint16_t a, uint16_t b);
void OrientCoordinates(uint16_t x1, uint16_t y1);
void _writeRegister(uint16_t r, uint16_t d);
void _writeData(uint8_t HI, uint8_t LO);
void _writeData16(uint16_t W);
void _writeCommand(uint8_t HI, uint8_t LO);
void _spiWriteCommand(uint8_t c);
Projet complet en MikroC Pro registered V 7.1.0
LCD_rouge_2-2P_176x220_SPI_ILI9225_180112.zip .
_18F26K22_SPI_LCD_ILI9225_180113.c
TFT_ILI9225_SPI_2018.c
Result Dialogue terminal RS232 :
(sans le Debug des fontes)
Video : LCD_176x220_65Kcolor_SPI_18F26K22_2018.webm
Liens et docu, utilisés pour ce projet :
Nkawu_TFT_22_ILI9225_Wiki_GitHub.html
ILI9225B_DS_V0.5.pdf
https://os.mbed.com/users/Arman92/code/ILI9225_SPI_TFT/file/e97881aef140/TFT_22_ILI9225.h/
Video : LCD_176x220_65Kcolor_SPI_18F26K22_2018.
Rajout fontes 7 segment grande taille.
//18-01-2017 rajout fontes
(#1) Taille Font TerminaL6x8 = 677 cfont.MaxC= 25
(#2) Taille TerminaL12x16 = 2405 cfont.MaxC= 14
(#3) Taille Font Trebuchet_MS13x21 = 1045 cfont.MaxC= 13
(#4) Taille Font Terminal5x11 = 1061 cfont.MaxC= 32
(#5) Taille Font Trebuchet_MS16x23 = 1279 cfont.MaxC= 11
(#6) Taille Font Arial_Narrow22x32 = 2319 cfont.MaxC= 8
(#7) taille Font NI7SEG22x28 = 2319 cfot.MaxC = 8
(#8] Taille Font NI7SEG26x35 = 1708 cfont.MaxC = 6
(#9) Taille SevenSegNumFont_32x50 =2605 cfont.MaxC = 5
_18F26K22_SPI_LCD_ILI9225_DS18B20_180119.c
TFT_Fonts_2018.h
18F26k22_Test_LCD_Rouge_SPI_180119.hex
Fonctions Graphiques à debugger
* Drawline .. OK dans le sens X , mais limitée dans le sens Y autour de 200?*
alors qu'avec une commande via DrawPixel , la hauteur totale (219) est parcourue
*Rectangle : les lignes verticales ne sont pas tracées ? alors que FillRectangle est OK..
*FillCircle .. rien . mais DrawCircle ..OK
* Est-ce vraiment un modele ILI9225 176x220 ?
Envoyer vos remarques, suggestions,ameliorations, modifications ....