chatgpt 给出的程序不能运行,所以也不要迷信chatgpt,现在是参照 12864指令时序写的程序,能正常显示自定义字符“请”。
因为找不到自定义字符资料,从网上下的请的自定义数组。
照片
硬件连接:
Lcd esp32
RS d21
rw d13
E 22
db0-db3 d16-d19
db4-db7 d23-d27
PSB vcc(并行)
RST d15
#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);
}