cancel
Showing results for 
Search instead for 
Did you mean: 

using stm32f051 disco+ lcd2004 I2C connection, Between 30min~3 hours after booting, lcd has no indication on the screen or letters, but the indication does not change (count No) Which part is good to look at? Is there any particular problem with lcd?

Kse.1
Associate

#include "i2c-lcd.h"
 
extern I2C_HandleTypeDef hi2c1; // change your handler here accordingly
 
 
 
#define SLAVE_ADDRESS_LCD 0x4E // change this according to ur setup
 
 
 
 
 
long ErrCnt_ERR=0;
 
long ErrCnt_Tout=0;
 
long ErrCnt_Busy=0;
 
HAL_StatusTypeDef lcd_send_cmd (char cmd)
 
{
 
 char data_u, data_l;
 
	uint8_t data_t[4];
 
	data_u = (cmd&0xf0);
 
	data_l = ((cmd<<4)&0xf0);
 
	data_t[0] = data_u|0x0C; //en=1, rs=0
 
	data_t[1] = data_u|0x08; //en=0, rs=0
 
	data_t[2] = data_l|0x0C; //en=1, rs=0
 
	data_t[3] = data_l|0x08; //en=0, rs=0
 
	return HAL_I2C_Master_Transmit (&hi2c1, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100);
 
}
 
 
 
HAL_StatusTypeDef lcd_send_data (char data)
 
{
 
	char data_u, data_l;
 
	uint8_t data_t[4];
 
	data_u = (data&0xf0);
 
	data_l = ((data<<4)&0xf0);
 
	data_t[0] = data_u|0x0D; //en=1, rs=1
 
	data_t[1] = data_u|0x09; //en=0, rs=1
 
	data_t[2] = data_l|0x0D; //en=1, rs=1
 
	data_t[3] = data_l|0x09; //en=0, rs=1
 
	return HAL_I2C_Master_Transmit (&hi2c1, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100);
 
}
 
 
 
 
 
void LCDErrEscape(HAL_StatusTypeDef er_type)
 
{
 
	lcd_init();
 
	if (er_type==HAL_ERROR) ErrCnt_ERR++;
 
	if (er_type==HAL_TIMEOUT) ErrCnt_Tout++;
 
	if (er_type==HAL_BUSY) ErrCnt_Busy++;
 
	
 
	HAL_Delay(100);
 
}
 
 
 
 
 
void lcd_clear (void)
 
{
 
	HAL_StatusTypeDef err;
 
	
 
	//err=lcd_send_cmd (0x00);
 
	err=lcd_send_cmd (0x01);
 
	if (err!=HAL_OK) LCDErrEscape(err);
 
 
 
	for (int i=0; i<100; i++)
 
	{
 
 err=lcd_send_data (' ');
 
 if (err!=HAL_OK) 
 
 {
 
 LCDErrEscape(err);
 
 //HAL_Delay(100);
 
 break; 
 
 }
 
	}
 
	
 
}
 
 
 
void lcd_init (void)
 
{
 
	// 4 bit initialisation
 
	HAL_Delay(50); // wait for >40ms
 
	lcd_send_cmd (0x30);
 
	HAL_Delay(5); // wait for >4.1ms
 
	lcd_send_cmd (0x30);
 
	HAL_Delay(1); // wait for >100us
 
	lcd_send_cmd (0x30);
 
	HAL_Delay(10);
 
	lcd_send_cmd (0x20); // 4bit mode
 
	HAL_Delay(10);
 
 
 
 // dislay initialisation
 
	lcd_send_cmd (0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters)
 
	HAL_Delay(1);
 
	lcd_send_cmd (0x08); //Display on/off control --> D=0,C=0, B=0 ---> display off
 
	HAL_Delay(1);
 
	lcd_send_cmd (0x01); // clear display
 
	HAL_Delay(1);
 
	HAL_Delay(1);
 
	lcd_send_cmd (0x06); //Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift)
 
	HAL_Delay(1);
 
	lcd_send_cmd (0x0C); //Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits)
 
}
 
 
 
void lcd_send_string(char* str)
 
{     
 
	HAL_StatusTypeDef err;
 
   
 
	for (int i = 0; *str && i<20; i++) //LCD limit 20char
 
  {    
 
 err=lcd_send_data(*str++);
 
 if (err !=HAL_OK) 
 
 {
 
 LCDErrEscape(err);
 
 return ;
 
 }
 
  }
 
 
 
}
 
 
 
void LCD_Data_Location(uint8_t x, uint8_t y)
 
{
 
	HAL_StatusTypeDef err;
 
	
 
	if(y == 0){
 
 //lcd_send_cmd ((0x80|0x00)+x);//Cmd_Write(0x80 + x);
 
 err=lcd_send_cmd ((0x80|0x00)+x);
 
 if (err !=HAL_OK) 
 
 {
 
 LCDErrEscape(err);	
 
 }
 
	}
 
	else if(y == 1){
 
 err=lcd_send_cmd ((0x80|0x40)+x);
 
 if (err !=HAL_OK) 
 
 {
 
 LCDErrEscape(err);
 
 //return false; 
 
 }
 
	}
 
	else if(y == 2){
 
 err=lcd_send_cmd ((0x80|0x14)+x);
 
 
 
 if (err !=HAL_OK) 
 
 {
 
 LCDErrEscape(err);
 
 }
 
	}
 
	else if(y == 3){
 
 err=lcd_send_cmd ((0x80|0x54)+x);
 
 if (err !=HAL_OK) 
 
 {
 
 LCDErrEscape(err);
 
 }
 
	}
 
 
 
}

0 REPLIES 0