Display 12864RSPI

Ciao a tutti e complimenti ai più esperti che aiutano tutta la community!!

Sto facendo un progettino con un display LCD12864 collegato in seriale, il display funziona e riesco a scrivere alcune funzioni, tuttavia ho un problema, alcuni comandi non vengono riconoscuti quali LCDA.DrawBrLine o DrawRectangle, DrawCircle..- così ho aperto la libreria che sto usando LCD12864RSPI di tonylabs, e ho visto che le funzioni che trovo nella libreria funzionano mentre quelle che ho citato sopra no,non ci sono

La domanda è, ho una libreria sbagliata? ce n'è una completa? non riesco e trovarla... ho la LCD12864 dove vedo tutti i comandi, ma non capisco bene come risolvere il problema

Grazie a tutti della collaborazione

Se ci fornisci i link al prodotto e alla libreria forse evitiamo incomprensioni.

Inoltre in ogni libreria che si rispetti ci sono dei demo, se ci sono prova prima con quelli.

Ciao.

https://m.ebay.it/itm/Display-grafico-128x64-lcd-retroilluminato-BLU-arduino-pic-ART-Z007-/330864242314?_mwBanner=1

questo è il display, la libreria non ce l ho sotto mano al momento ma l esempio incluso non ha le funzioni che vorrei... c’è solo un generic hello world. Io ho capito come usare e programmare il display, ma la libreria è priva dei comandi

Non si capisce nulla. "L'esempio incluso" dove ? Di quale esempio parli ? Se non ci dai info possiamo fare poco. Dal link DOVE leggi che è spi ? Parla di Parallelo o Seriale. Non dice quale chip usa.
La lib che citi la trovo qui: https://github.com/wxx9248/LCD12864RSPI/blob/master/src/LCD12864RSPI.h
Mi pare povera e veramente fatta male. Per sapere quali comandi accetta, basta che apri il file .h

Prova qui per il chip ST7920:
https://playground.arduino.cc/Code/LCD12864
oppure qui:

per vedere se è lo stesso display
oppure qui, il learn di Adafruit: Overview | 1.5" & 2.4" Monochrome 128x64 OLED Display Module | Adafruit Learning System

Ripeto: chi vende DEVE dirti che chip usa

Una lib grafica per molti display, incluso il chip ST7920: https://github.com/olikraus/u8glib
Una lib per molti TFT: https://github.com/olikraus/ucglib

Scusate, aggiungo alcune info:

ho riletto un pò di info e il collegamento è SERIALE (il display può funzionare sia in seriale che in parallelo)

Questo è il codice di esempio e mi funziona

/*
@Author:TONYLABS
@PIN1 = GND
@PIN2 = 5V
@RS(CS) = 8; 
@RW(SID)= 9; 
@EN(CLK) = 3;
@PIN15 PSB = GND;
*/
 
#include "LCD12864RSPI.h"
#define AR_SIZE( a ) sizeof( a ) * sizeof( a[0] )

unsigned char show1[]="TONYLABS";

void setup()
{
  LCDA.Initialise(); //@Initialize
  delay(100);
}
 
void loop()
{
  LCDA.CLEAR();//@Clear Screen
  delay(100);
  LCDA.DisplayString(0,0,show1,AR_SIZE(show1));
  delay(5000);
  LCDA.CLEAR();//@Clear Screen
  delay(100);
}

Questa è la libreria in usi, a me sembra che manchino dei comandi:

/* 
@Author:TONYLABS
@Date:2012/12/21
@Function: Driver 12864 LCD Module
*/

#include "LCD12864RSPI.h"

extern "C" 
{
#include "Arduino.h"
#include <wiring.h> 
#include <inttypes.h>
#include <stdio.h>  //not needed yet
#include <string.h> //needed for strlen()
#include <avr/pgmspace.h>
}



LCD12864RSPI::LCD12864RSPI() 
{
this->DEFAULTTIME = 80; // 80 ms default time
this->delaytime = DEFAULTTIME;
} 

//*********************ÑÓʱº¯Êý************************//
void LCD12864RSPI::delayns(void)
{   
delayMicroseconds(delaytime);
 }


void LCD12864RSPI::WriteByte(int dat)
{
    digitalWrite(latchPin, HIGH);
    delayns();
    shiftOut(dataPin, clockPin, MSBFIRST, dat);
    digitalWrite(latchPin, LOW);
}


void LCD12864RSPI::WriteCommand(int CMD)
{
   int H_data,L_data;
   H_data = CMD;
   H_data &= 0xf0;           //ÆÁ±ÎµÍ4λµÄÊý¾Ý
   L_data = CMD;             //xxxx0000¸ñʽ
   L_data &= 0x0f;           //ÆÁ±Î¸ß4λµÄÊý¾Ý
   L_data <<= 4;             //xxxx0000¸ñʽ
   WriteByte(0xf8);          //RS=0£¬Ð´ÈëµÄÊÇÖ¸Á
   WriteByte(H_data);
   WriteByte(L_data);
}


void LCD12864RSPI::WriteData(int CMD)
{
   int H_data,L_data;
   H_data = CMD;
   H_data &= 0xf0;           //ÆÁ±ÎµÍ4λµÄÊý¾Ý
   L_data = CMD;             //xxxx0000¸ñʽ
   L_data &= 0x0f;           //ÆÁ±Î¸ß4λµÄÊý¾Ý
   L_data <<= 4;             //xxxx0000¸ñʽ
   WriteByte(0xfa);          //RS=1£¬Ð´ÈëµÄÊÇÊý¾Ý
   WriteByte(H_data);
   WriteByte(L_data);
}



void LCD12864RSPI::Initialise()
{
    pinMode(latchPin, OUTPUT);     
    pinMode(clockPin, OUTPUT);    
    pinMode(dataPin, OUTPUT);
    digitalWrite(latchPin, LOW);
    delayns();

    WriteCommand(0x30);        //¹¦ÄÜÉ趨¿ØÖÆ×Ö
    WriteCommand(0x0c);        //ÏÔʾ¿ª¹Ø¿ØÖÆ×Ö
    WriteCommand(0x01);        //Çå³ýÆÁÄ»¿ØÖÆ×Ö
    WriteCommand(0x06);        //½øÈëÉ趨µã¿ØÖÆ×Ö
}


void LCD12864RSPI::CLEAR(void)
{  
    WriteCommand(0x30);//
    WriteCommand(0x01);//Çå³ýÏÔʾ
}


void LCD12864RSPI::DisplayString(int X,int Y,uchar *ptr,int dat)
{
  int i;

  switch(X)
   {
     case 0:  Y|=0x80;break;

     case 1:  Y|=0x90;break;

     case 2:  Y|=0x88;break;

     case 3:  Y|=0x98;break;

     default: break;
   }
  WriteCommand(Y); // ¶¨Î»ÏÔʾÆðʼµØÖ·

  for(i=0;i<dat;i++)
    { 
      WriteData(ptr[i]);//ÏÔʾºº×ÖʱעÒâÂëÖµ£¬Á¬ÐøÁ½¸öÂë±íʾһ¸öºº×Ö
    }
}



void LCD12864RSPI::DisplaySig(int M,int N,int sig)
{
  switch(M)
   {
     case 0:  N|=0x80;break;

     case 1:  N|=0x90;break;

     case 2:  N|=0x88;break;

     case 3:  N|=0x98;break;

     default: break;
   }
  WriteCommand(N);
  WriteData(sig);
 }




void LCD12864RSPI::DrawFullScreen(uchar *p)
{
      int ygroup,x,y,i;
      int temp;
      int tmp;
             
      for(ygroup=0;ygroup<64;ygroup++)
      {
           if(ygroup<32)
            {
             x=0x80;
             y=ygroup+0x80;
            }
           else 
            {
              x=0x88;
              y=ygroup-32+0x80;    
            }         
           WriteCommand(0x34);        //дÈëÀ©³äÖ¸ÁîÃüÁî
           WriteCommand(y);           //дÈëyÖá×ø±ê
           WriteCommand(x);           //дÈëxÖá×ø±ê
           WriteCommand(0x30);        //дÈë»ù±¾Ö¸ÁîÃüÁî
           tmp=ygroup*16;
           for(i=0;i<16;i++)
		 {
		    temp=p[tmp++];
		    WriteData(temp);
               }
          }
        WriteCommand(0x34);        //дÈëÀ©³äÖ¸ÁîÃüÁî
        WriteCommand(0x36);        //ÏÔʾͼÏó
}


LCD12864RSPI LCDA = LCD12864RSPI();

Ora ho un altro dubbio, magari ho semplicemente sbagliato perchè potevo usare anche la libreria LCD12864 “standard” che trovo sul sito arduino?

Riassumendo, il display mi funziona, con questa libreria riesco a fargli fare le funzioni che vedo nella libreria, anche loghi ecc, ma mancano e varie funzioni DrawBrLine o DrawRectangle ecc

Oggi volevo provare con la libreria normale, non ho ben capito se supporta il collegamento seriale o solo parallalelo.

Grazie della collaborazione

Secondo me il collegamento non c'entra nulla con la lib. Io fossi in te userei la LCD12864 "standard"

P.S. seriale secondo me non vuol dire nulla. A volte per seriale si intende rx/tx a 2 fili (esempio i display Nextion) oppure a volte seriale si intende SPI (ma i fili sono 4)

Grazie nid, è il dubbio che mi è venuto stanotte e che volevo tentare oggi, faccio uno sketch con libreria standard e vedo se funziona... il collegamento seriale in questione ha 3 cavi di comunicazione, più ovviamente alimentazione e backlight

anche se mi pare di aver già provato ed era per questo che avevo scaricato l'altra libreria di tony labs

Molto brutto che al link ebay non dice quale chip usa e inoltre se clicco su immagine del retro display, dove ci sono le indicazioni dei pin, NON si vede. Pessime info dal venditore. Io proverei anche a mandarli un msg e chiedergli quale chip usa.

voi dove comprate di solito? io compro da gaetano_f principalmente perchè è velocissimo nelle spedizioni, purtroppo con l'hardware sono ancora in fase di apprendimento e tante cose non le so finché non trovo un problema da risolvere...

Secondo me quel venditore è affidabile, su quel display però da poche info e già sul forum qualcuno aveva fatto domande di info. Meglio chiedere a lui, invitandolo magari ad aggiornare le info sul suo ebay. Tieni conto che gli stessi oggetti li trovi anche dai venditori cinesi, quindi la qualità è quella.
Se non ricordo male anche io ho quel display (preso anni) fa da gaetano_f. Mi pare è un display con chip ST7920
Quindi molte lib fatte per quel chip dovebbero funzionare. Esempio la u8glib che ti ho messo sopra dovrebbe funzionare (forse è un pò pesante)
Ti allego una immagine di come risultavano a me i collegamenti SPI
VSS=GND VDD=5V RS=CS(10) RW=MOSI(11) E=SCK(12) PSB=GND BLA=5V BLK=GND
MOSI, SCK e CS sono SPI (manca il MISO che non serve)

glcd-pinout_spi.jpg

Il mio piano è andato tragicamente, ho provato a caricare solo la libreria LCD12864 dal sito arduino e solo con la libreria caricata mi da errore :frowning:

Arduino:1.8.4 (Windows 8), Scheda:"Arduino/Genuino Uno"

In file included from C:\Users\xxxxocuments\Arduino\TEST_LCD12864\TEST_LCD12864.ino:2:0:

C:\Users\xxxxxx\libraries\LCD12864/LCDSprite.h:10:14: error: 'prog_char' does not name a type

 static const prog_char header_data[] PROGMEM = { 

              ^

exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

abilitando la descrizione dettagliata:

Arduino:1.8.4 (Windows 8), Scheda:"Arduino/Genuino Uno"

In file included from C:\Usersxxxxs\Arduino\TEST_LCD12864\TEST_LCD12864.ino:2:0:

C:\Users\xxxnts\Arduino\libraries\LCD12864/LCDSprite.h:10:14: error: 'prog_char' does not name a type

 static const prog_char header_data[] PROGMEM = { 

              ^

C:\Users\xxxxArduino\libraries\LCD12864/LCDSprite.h:6:12: warning: 'swidth' defined but not used [-Wunused-variable]

 static int swidth = 20; // change these

            ^

C:\Users\xxxxxnts\Arduino\libraries\LCD12864/LCDSprite.h:7:12: warning: 'sheight' defined but not used [-Wunused-variable]

 static int sheight = 20; // change these

            ^

exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Consigli?

ho trovato altre librerie che sembrano compatibili, provo con quelle e vi aggiorno

Aggiornamento:

dal link del display datasheet: http://www.ebmstore.it/ebay/download/display12864_V1.pdf

ho trovato il chip ST7920 ho caricato una libreria trovata tramite la ricerca librerie di arduino e ho notato che il cablaggio (definizione interna dei PIN) era diversa, l’ho modificata secondo il collegamento che ho fatto io e finalmente ho visualizzato “Hello World!”

Libreria funzionante: <U8g2lib.h>

con questa stringa funziona U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 3, /* data=*/ 9, /* CS=*/ 8, /* reset=*/ U8X8_PIN_NONE);

Adesso riesco a fare tutte le varie funzioni, nonostante il code sia diverso da quello della pagina su arduino.cc

La libreria è abbastanza completa, sto cercando di capire come caricare i file bitmap sul bisplay perchè lo visualizzo ma sotto all’immagine il display disegna qualcosa che sembra non avere senso…