Contador de pulsos en pantalla LCD 128X64 ST7920

Hola a todos escribo esto porque he visto aquí en el foro un proyecto de contador de pulsos que me ha parecido muy interesante el proyecto esta hecho para pantalla lcd 2004 pero yo tengo una pantalla de LCD 128X64 con controladora ST7920 y solo consigo ver el titulo de contadores que he puesto en el medio de la pantalla, quería decir que yo de programación no se nada, suelo buscar todo lo que encuentro del tema y voy cambiando hasta que suelo conseguirlo pero con este no sale. Gracias

#include "U8glib.h"
U8GLIB_ST7920_128X64_1X u8g(52, 51, 53); // SPI Com: (SCK, MOSI, CS)

struct {
 unsigned int pinBoton;
 unsigned int numPulsaciones;
 bool ultimoEstado;
} 
contador[12] = { {02, 0, LOW},
                {03, 0, LOW},
                {04, 0, LOW},
                {05, 0, LOW},
                {06, 0, LOW},
 {07, 0, LOW},
                {10, 0, LOW},
                {11, 0, LOW},
                {12, 0, LOW},
                {13, 0, LOW},
                {14, 0, LOW},
                {15, 0, LOW}
};
void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  u8g.setFont(u8g_font_courB08);

  u8g.drawStr( 5, 6, "  A  CONTADORES  B");
}

void setup(void) {{
  // flip screen, if required
  // u8g.setRot180();
  
  // set SPI backup if required
  //u8g.setHardwareBackup(u8g_backup_avr_spi);

  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
 for (int i=0; i<12; i++) {
 pinMode(contador[i].pinBoton, INPUT);
 
  }
}}}

void loop(void) {{
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(50);
}
for (int i=0; i<12; i++) {
 bool lectura = digitalRead(contador[i].pinBoton);
 if (lectura != contador[i].ultimoEstado) {
 if (lectura == HIGH) {
                                delay(10); // ajustar este valor PERFECTO
                                if (digitalRead(contador[i].pinBoton) == HIGH) { //confirmo x mseg después
            ++contador[i].numPulsaciones;
                                }
 }
 contador[i].ultimoEstado = lectura;
 }
 }

}
void draw(void){
 u8g.setFont(u8g_font_courB08);
  for (int i=0; i<1; i++) {
 u8g.drawStr( 0, 19,  "%d:%04d %d:%04d %d:%04d", i+01, contador[i+01].numPulsaciones, i+02, contador[i+02].numPulsaciones, i+03, contador[i+03].numPulsaciones);                                            

 u8g.drawStr( 0, 28,  "%d:%04d %d:%04d %d:%04d", i+04, contador[i+04].numPulsaciones, i+05, contador[i+05].numPulsaciones, i+06, contador[i+06].numPulsaciones);                                            

 u8g.drawStr( 0, 37,  "%d:%04d %d:%04d %d:%04d", i+07, contador[i+07].numPulsaciones, i+08, contador[i+08].numPulsaciones, i+09, contador[i+09].numPulsaciones); 
 
 u8g.drawStr( 0, 46,  "%d:%04d %d:%04d %d:%04d", i+10, contador[i+10].numPulsaciones, i+11, contador[i+11].numPulsaciones, i+12, contador[i+12].numPulsaciones);
}
}

Pero ves algo en la pantalla?

No te sale porque no lo tienes declarado como una pagina mas a dibujar en el LCD.
Si tengo tiempo a la tarde te modifico tu código.

Gracias por interesarte este que pongo aqui es el que he modificado otra vez y ahora si se compila bien pero no se ve nada en la pantalla y no se me ocurre otra cosa. Un saludo lightcalamar

#include "U8glib.h"
U8GLIB_ST7920_128X64_1X u8g(52, 51, 53); // SPI Com: (SCK, MOSI, CS)

struct {
 unsigned int pinBoton;
 unsigned int numPulsaciones;
 bool ultimoEstado;
}
contador[7] = { {02, 0, LOW},
                {03, 0, LOW},
                {04, 0, LOW},
                {05, 0, LOW},
                {06, 0, LOW},
                {07, 0, LOW},
                {10, 0, LOW}

};
void setup(){{
Serial.begin(115200);

  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
 
for (int i=0; i<7; i++) {
pinMode(contador[i].pinBoton, INPUT);
	}
draw();
}}}

void loop(){{

    // picture loop
  u8g.firstPage();  
  do {

 draw(); 
    
  } while( u8g.nextPage() );
  
  
  for (int i=0; i<7; i++) {
		bool lectura = digitalRead(contador[i].pinBoton);
		if (lectura != contador[i].ultimoEstado) {
			if (lectura == HIGH) {
                                delay(10); // ajustar este valor PERFECTO
                                if (digitalRead(contador[i].pinBoton) == HIGH) { //confirmo x mseg después
		    	        ++contador[i].numPulsaciones;
			        draw();
                                }
			}
			contador[i].ultimoEstado = lectura;
		}
	}

}}
void draw(){
  u8g.setFont(u8g_font_courB08);
char myBuff[128];
	for (int i=0; i<1; i++) {
		sprintf(myBuff, "%d:%04d %d:%04d %d:%04d", i+1, contador[i+1].numPulsaciones, i+2, contador[i+2].numPulsaciones, i+3, contador[i+3].numPulsaciones);                                            
	        u8g.print(0,19);
                u8g.print(myBuff);
                sprintf(myBuff, "%d:%04d %d:%04d %d:%04d", i+4, contador[i+4].numPulsaciones, i+5, contador[i+5].numPulsaciones, i+6, contador[i+6].numPulsaciones);                                            
	        u8g.print(0,28);
                u8g.print(myBuff);	
}
}

Partimos desde tu segundo código. Donde tienes;

U8GLIB_ST7920_128X64_1X u8g(52, 51, 53); // SPI Com: (SCK, MOSI, CS)

subtituyelo por este y cambiando los pines del LCD (al lado te lo pongo desmarcado);

U8GLIB_ST7920_128X64_1X u8g(53, 51, 49 , 47); //Enable, RW, RS, RESET

Supongo que el pin PB lo tienes a nivel bajo es así?
Prueba y me dices.

Gracias por tu respuesta, lo he puesto como dices y sigue igual no se ve nada, si sirve de algo lo de "hola mundo" en esta pantalla funciona perfectamente con la lineas que mes has puesto y como yo la tenia. problema de pantalla no es tiene que ser del resto de programacion que no estara bien. Este codigo que pongo aqui abajo es el original de donde he partido funciona muy bien con la pantalla LCD 20X02, yo lo que he cambiado es todo lo referente a la pantalla LCD 128X64 ST7920 y sera en alguna parte del codigo donde estara mal.

#include <LiquidCrystal.h>
#include <Wire.h> 					// Librería comunicación I2C
#include <LiquidCrystal_I2C.h> 		// Librería LCD I2C
LiquidCrystal_I2C lcd(0x27,20,2);
struct {
	unsigned int pinBoton;
	unsigned int numPulsaciones;
	bool ultimoEstado;
} 
contador[7] = { {02, 0, LOW},
                {05, 0, LOW},
                {06, 0, LOW},
                {07, 0, LOW},
                {10, 0, LOW},
		{11, 0, LOW},
                {12, 0, LOW}
};
void setup(){
	Serial.begin(9600);
	lcd.begin(20,2);   // Inicializa el LCD para 20x4  
	lcd.backlight(); // LED de fondo encendido (backlight)
	lcd.init();
	for (int i=0; i<7; i++) {
		pinMode(contador[i].pinBoton, INPUT);
	}
	muestraLCD();
}
void loop(){
for (int i=0; i<7; i++) {
		bool lectura = digitalRead(contador[i].pinBoton);
		if (lectura != contador[i].ultimoEstado) {
			if (lectura == HIGH) {
                                delay(10); // ajustar este valor PERFECTO
                                if (digitalRead(contador[i].pinBoton) == HIGH) { //confirmo x mseg después
		    	        ++contador[i].numPulsaciones;
			        muestraLCD();
                                }
			}
			contador[i].ultimoEstado = lectura;
		}
	}

}
void muestraLCD(void){
	char myBuff[40];
	for (int i=0; i<1; i++) {
		sprintf(myBuff, "%d:%04d %d:%04d %d:%04d", i+1, contador[i+1].numPulsaciones, i+2, contador[i+2].numPulsaciones, i+3, contador[i+3].numPulsaciones);                                            
	        lcd.setCursor(0,0);
                lcd.print(myBuff);
                sprintf(myBuff, "%d:%04d %d:%04d %d:%04d", i+4, contador[i+4].numPulsaciones, i+5, contador[i+5].numPulsaciones, i+6, contador[i+6].numPulsaciones);                                            
	        lcd.setCursor(0,1);
                lcd.print(myBuff);	
}
}

Bien, entonces no te preocupes. Ahora mismo cojo una ST7920 que tengo y compruebo.

Tuve problemas a la hora de dibujar en esta pantalla con la librería Ug8lib y me tiré una buena temporada hasta lograr entender de como representar multiples paginas. Espera mi proximo mensaje y a ver si te funciona. Es que he tenido algunos problemas con mi proyecto en pantalla FT800 y por ello no he podido antes.

Te dejo el código que funciona (al menos a mi)
Ten presente de poner los pines a tu Arduino MEGA según el objeto de contruir la pantalla es de decir los pines estos;

U8GLIB_ST7920_128X64_1X u8g(53, 51, 49 , 47); //Enable, RW, RS, RESET

Resultado:

El código usado es este:

#include <U8glib.h>
//U8GLIB_ST7920_128X64_1X u8g(52, 51, 53); // SPI Com: (SCK, MOSI, CS)

U8GLIB_ST7920_128X64_1X u8g(53, 51, 49 , 47); //Enable, RW, RS, RESET


struct {
 unsigned int pinBoton;
 unsigned int numPulsaciones;
 bool ultimoEstado;
}
contador[7] = { {02, 0, LOW},
                {03, 0, LOW},
                {04, 0, LOW},
                {05, 0, LOW},
                {06, 0, LOW},
                {07, 0, LOW},
                {10, 0, LOW}

};
void setup() {
   Serial.begin(115200);

for (int i=0; i<7; i++) {
pinMode(contador[i].pinBoton, INPUT);
  }

}

void loop(){

  u8g.firstPage(); 
  do {
  draw();
  logo();
     
  } 
  while( u8g.nextPage() );

    for (int i=0; i<7; i++) {
    bool lectura = digitalRead(contador[i].pinBoton);
    if (lectura != contador[i].ultimoEstado) {
      if (lectura == HIGH) {
                                delay(10); // ajustar este valor PERFECTO
                                if (digitalRead(contador[i].pinBoton) == HIGH) { //confirmo x mseg después
                  ++contador[i].numPulsaciones;
          //    draw();   // LO DESMARCAS O NO DEPENDE DE TUS PULSADORES
                                }
      }
      contador[i].ultimoEstado = lectura;
    }
  }
}


void draw(){
  u8g.setFont(u8g_font_courB08);
     //    u8g.setPrintPos(8, 1);
     //    u8g.setColorIndex(1);
char myBuff[128];
  for (int i=0; i<1; i++) {
    sprintf(myBuff, "%d:%04d %d:%04d %d:%04d", i+1, contador[i+1].numPulsaciones, i+2, contador[i+2].numPulsaciones, i+3, contador[i+3].numPulsaciones);                                           
       //   u8g.print(0,19);  // AQUI ERROR
          u8g.setPrintPos(4, 30);
                u8g.print(myBuff);
                sprintf(myBuff, "%d:%04d %d:%04d %d:%04d", i+4, contador[i+4].numPulsaciones, i+5, contador[i+5].numPulsaciones, i+6, contador[i+6].numPulsaciones);                                           
        //  u8g.print(0,28);   // AQUI ERROR
        u8g.setPrintPos(4, 40);
                u8g.print(myBuff);  
}
}

void logo() {
         u8g.setFont(u8g_font_courB08);
         u8g.setPrintPos(18, 11);
         u8g.setColorIndex(1);
         u8g.drawBox(14, 3, 102, 11);
         u8g.drawRFrame(17, 4, 102, 12, 2);
         u8g.setColorIndex(0);  
         u8g.print(" by LightCalamar");
         u8g.setColorIndex(1);
         u8g.drawRFrame(0, 0, 128, 64, 3); // Marco redondeado decorativo
         // Mi logo enmarcado para ST7920  by lightcalamar 
}

La librería U8glig es muy diferente en cuanto a poner una posición, tendrás que familiarizarte con ella, por ejemplo U8g.print() no hace nada pero si U8g.setPrintPos() y así etc... los comandos los tienes todos en la Wiki del autor

Muchas gracias por haberme hechado una mano llevo tiempo atrancado en eso y no daba con la tecla, lo dicho te debo una.
Cuando empiece a montarlo empesare a subir fotos de como va quedando el invento. Muchas gracias. Un saludo
Aqui va la foto de como a quedado he puesto algunos contadores mas.

Ha sido un placer ayudarte.

Si necesitas mas codigos sobre estas pantallas pasate por mi proyecto Radio FM con RDS donde encontraras muchos ya que tengo como principal un LCD ST7920 y pude poner cajas, marcos etc...

Suerte en tu proyecto! :slight_smile: