图片
自带字库
#include <stdio.h>
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_rom_sys.h"
#define DATA0_GPIO 16
#define DATA1_GPIO 17
#define DATA2_GPIO 18
#define DATA3_GPIO 19
#define DATA4_GPIO 23
#define DATA5_GPIO 25
#define DATA6_GPIO 26
#define DATA7_GPIO 27
#define RS_GPIO 21 // 数据/命令选择引脚
#define RST_GPIO 15 // 复位引脚
#define EN_GPIO 22 // 使能引脚
#define RW 13
void pd(){ //判断lcd 忙
gpio_set_level(RW, 1);
gpio_set_level(RS_GPIO, 0);
while(gpio_get_level(27)!=0){
esp_rom_delay_us(10);
}
}
void lcd_write_command(uint8_t cmd) {
pd();
gpio_set_level(RS_GPIO, 0); // 设置为命令模式
gpio_set_level(RW, 0);
gpio_set_level(EN_GPIO, 0);
esp_rom_delay_us(50);
gpio_set_level(EN_GPIO, 1);
gpio_set_level(DATA0_GPIO, cmd & 0x01);
gpio_set_level(DATA1_GPIO, (cmd >> 1) & 0x01);
gpio_set_level(DATA2_GPIO, (cmd >> 2) & 0x01);
gpio_set_level(DATA3_GPIO, (cmd >> 3) & 0x01);
gpio_set_level(DATA4_GPIO, (cmd >> 4) & 0x01);
gpio_set_level(DATA5_GPIO, (cmd >> 5) & 0x01);
gpio_set_level(DATA6_GPIO, (cmd >> 6) & 0x01);
gpio_set_level(DATA7_GPIO, (cmd >> 7) & 0x01);
esp_rom_delay_us(500);
gpio_set_level(EN_GPIO, 0); // 使能低电
esp_rom_delay_us(50);
gpio_set_level(RS_GPIO, 1);
gpio_set_level(RW, 1);
esp_rom_delay_us(20);
}
void lcd_init() {
// 初始化引脚
gpio_set_direction(DATA0_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(DATA1_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(DATA2_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(DATA3_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(DATA4_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(DATA5_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(DATA6_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(DATA7_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(RS_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(RST_GPIO, GPIO_MODE_OUTPUT);
gpio_set_direction(EN_GPIO, GPIO_MODE_OUTPUT);
// 复位 LCD
gpio_set_level(RST_GPIO, 0);
esp_rom_delay_us(500);
gpio_set_level(RST_GPIO, 1);
}
void lcd_write_data(uint8_t data) {
pd();
gpio_set_level(RS_GPIO, 1); // 设置为数据模式
gpio_set_level(RW, 0);
gpio_set_level(EN_GPIO, 0); // 使能低电平
esp_rom_delay_us(50);
gpio_set_level(EN_GPIO, 1);
gpio_set_level(DATA0_GPIO, data & 0x01);
gpio_set_level(DATA1_GPIO, (data >> 1) & 0x01);
gpio_set_level(DATA2_GPIO, (data >> 2) & 0x01);
gpio_set_level(DATA3_GPIO, (data >> 3) & 0x01);
gpio_set_level(DATA4_GPIO, (data >> 4) & 0x01);
gpio_set_level(DATA5_GPIO, (data >> 5) & 0x01);
gpio_set_level(DATA6_GPIO, (data >> 6) & 0x01);
gpio_set_level(DATA7_GPIO, (data >> 7) & 0x01);
esp_rom_delay_us(500);
gpio_set_level(EN_GPIO, 0); // 使能低电平
esp_rom_delay_us(50);
gpio_set_level(RS_GPIO, 0);
gpio_set_level(RW, 1);
esp_rom_delay_us(20);
}
// 应用主函数
void app_main() {
lcd_init();
// 定义字符'请'并绘制
uint8_t z[]={
0x00,0x40,0x20,0x70,0x13,0xC0,0x10,0x70,0x01,0xC0,0x00,0x7C,0x77,0x80,0x10,0x70,
0x13,0x90,0x12,0x70,0x13,0x90,0x1A,0x70,0x13,0x90,0x02,0x30,0x02,0x10,0x00,0x00,
};
// 初始化 LCD 控制器(根据 LCD 模型设置命令)
lcd_write_command(0x30); // 8-bit模式,
// esp_rom_delay_us(200);
lcd_write_command(0x30); // 8-bit模式,
// esp_rom_delay_us(37);
lcd_write_command(0x0c); // 开启显示,不显示光标
// esp_rom_delay_us(100);
lcd_write_command(0x01);
// esp_rom_delay_us(10000);
lcd_write_command(0x06);
// esp_rom_delay_us(10000);
//上面各命令的延时经验证,可以不加
//----------------------------------
lcd_write_command(0x40);
for(int a=0;a<16;a++){
lcd_write_data(z[a*2]);
lcd_write_data(z[a*2+1]);
}
lcd_write_command(0x80); //第一行显示自定义字符
lcd_write_data(0x00);
lcd_write_data(0x00);
lcd_write_command(0x90); // 第二行显示字库0-9
lcd_write_data(0x30);
lcd_write_data(0x31);
lcd_write_data(0x32);
lcd_write_data(0x33);
lcd_write_data(0x34);
lcd_write_data(0x35);
lcd_write_data(0x36);
lcd_write_data(0x37);
lcd_write_data(0x38);
lcd_write_data(0x39);
lcd_write_command(0x88); // 显示字库
lcd_write_data(0x61);
lcd_write_data(0x62);
lcd_write_data(0x63);
lcd_write_data(0x64);
lcd_write_data(0x65);
lcd_write_data(0x66);
lcd_write_data(0x67);
lcd_write_data(0x68);
lcd_write_data(0x69);
lcd_write_data(0x6a);
lcd_write_command(0x98); //显示字库汉字
lcd_write_data(0xc0); //乐 0xc0d0 +6 =0xc0d6
lcd_write_data(0xd6);
}