Code: Untitled.c Select all
[code]#include <stdio.h>
#include "driver/i2c.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_intr_alloc.h"
#include "esp_rom_sys.h"
#define En 0b00000100 //Defining enable bit, 1<<2
void i2c_Scan();
void screen_init();
void command(uint8_t data);
void data_send(uint8_t data);
void write_to_expander(uint8_t data);
void strobe_enable(uint8_t data);
uint8_t blVAL= 0x00;
void app_main(void)
{
vTaskDelay(15 / portTICK_PERIOD_MS);
i2c_Scan();
}
void i2c_Scan(){
i2c_config_t conf = {0} ;
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = 21;
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_io_num = 22;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = 100000;
i2c_param_config(I2C_NUM_0,&conf);
i2c_driver_install(I2C_NUM_0,conf.mode,0,0,0);
printf("Let's start the i2c communication \n");
screen_init();
}
void screen_init(){
vTaskDelay(15 / portTICK_PERIOD_MS);
command(0x30); ///Interface is 8-bit
vTaskDelay(4.1/portTICK_PERIOD_MS);
command(0x30); //Interface is 8-bit
esp_rom_delay_us(100);
command(0x30); //Interface is 8-bit
esp_rom_delay_us(150);
command(0x20); //Interface is 4-bit
command(0x28); //Setting Display Line and font size
command(0x0c); //Display Set On, Cursor Off
command(0x01); //Clear Display
vTaskDelay(2/ portTICK_PERIOD_MS); //This extra delay is for Clearing
command(0x06); //Set moving direction of cursor
vTaskDelay(2/ portTICK_PERIOD_MS);
blVAL = 0x01; //Turning backlight On
command(0x02); //Cursor Return to Home.
vTaskDelay(2/ portTICK_PERIOD_MS);
}
void command(uint8_t data){
uint8_t top4 = (data & 0xf0);
uint8_t bottom4 = ((data & 0x0f)<<4);
//write_to_expander(top4);
strobe_enable(top4);
//write_to_expander(bottom4);
strobe_enable(bottom4);
}
void strobe_enable(uint8_t data){
write_to_expander(((data | En) | blVAL<<3));
esp_rom_delay_us(1);
write_to_expander(((data & (~En)) | blVAL<<3));
esp_rom_delay_us(50);
}
void write_to_expander(uint8_t data){
//Command is enable here and timed for 1000ns
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd,(0x27<<1)|0,true);
i2c_master_write_byte(cmd,data,true);
i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0,cmd,10/portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
if(ret == ESP_OK){
printf("The i2c command has begun.\n");
}
}
void data_send(uint8_t data){
uint8_t top4 = (data & 0xf0);
uint8_t bottom4 = ((data & 0x0f)<<4);
write_to_expander(top4 | 1<<0);
write_to_expander(bottom4 | 1<< 0);
}[/code]1.) ESP32 (I2C) : https://docs.espressif.com/projects/esp ... s/i2c.html
2.) PCF8574 Datasheet: "https://www.ti.com/lit/ds/symlink/pcf8574.pdf"
3.) LCD1602 Datasheet: "https://www.waveshare.com/datasheet/LCD ... CD1602.pdf"