"Это 10-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."
Небольшой код фермера 12864 LCD снова атаковал микроконтроллер
Введение в LCD12864
Ненормальный ЖК-экран LCD12864, 3 стопки херни COB сзади, одна основная микросхема управления ST7920, а две другие микросхемы переключения ST7921
Основная микросхема управления ST7920 выполняет следующие функции:
1. Параллельная связь с нашим микроконтроллером
2. ПЗУ со шрифтами, CGROM, DDRAM
3. Линейное сканирование COM0-COM31
4. Сканирование столбца SEG0-SEG63
5. Последовательно отправьте данные на два чипа драйвера ST7921.
Функция микросхемы драйвера ST7921 заключается в следующем.
1. Получите последовательный сигнал от ST7920 и преобразуйте его в напряжение привода параллельного порта.
2. В соответствии с требованиями к сигналу два чипа управляют SEG64-SEG159, SEG160-SEG255 соответственно.
Схема
LCD12864 Временная диаграмма
параллельно
Функция команды записи LCD12864_Write_Cmd
void LCD12864_Write_Cmd(u8 add)//写命令,因为操作的是地址
{
LCD12864_RS = 0;
LCD12864_RW = 1;
LCD12864_E = 0;
LCD12864_RW = 0;
LCD12864_Delay(3);
LCD12864_E = 1;
LCD12864_DB = add;
LCD12864_E = 0;
}
Функция записи данных LCD12864_Write_Data
void LCD12864_Write_Data(u8 Dat)//写数据
{
LCD12864_RS = 1;
LCD12864_RW = 1;
LCD12864_E = 0;
LCD12864_RW = 0;
LCD12864_Delay(3);
LCD12864_E = 1;
LCD12864_DB = Dat;
LCD12864_E = 0;
}
Эти инструкции записи и функции записи данных такие же, как и в 1602, потому что их временные диаграммы такие же, поэтому процедуры такие же.
Процесс записи 12864-символьного ЖК-дисплея (W R/W земля низкий уровень):
- Процесс записи команды: RS находится на низком уровне, затем команда загружается в D0--D7, вывод E генерирует спадающий фронт, команда принимается и выполняется процессором 12864.
- Процесс записи содержимого: RS имеет высокий уровень, затем данные загружаются в D0--D7, вывод E генерирует спадающий фронт, данные принимаются и отображаются 12864.
Серийный (мы его не используем, просто проанализируйте диаграмму последовательности, если хотите его использовать)
Команды для LCD12864, CGRAM, DDRAM, DDROM, GDRAM
1. Базовая команда, диапазон адресов 0x00--0x3f. Основные функции, такие как аппаратная конфигурация для работы с ЖК-дисплеем
2. Расширенная инструкция, диапазон адресов 0x00--0x3f. Используется для расширенных функций, таких как рисование, перевернутое отображение и т. д.
3.CGRAM, диапазон адресов 0x40--0x7f. Используется для сохранения других пользовательских изображений, которых нет на самом ЖК-дисплее.
4.DDRAM, диапазон адресов 0x80--0x8f. Он используется для сохранения значения кода ASCII и указания на первый адрес данных пользовательского изображения CGRAM или на первый адрес данных изображения литографии CGRAM через код ASCII.
5.GDRAM, диапазон адресов 0x80--0xff. После разрешения расширенных инструкций используется для рисования
Предыдущий раздел инициализации может напрямую использовать 1602, эффект тот же, см. другую статью для этого изображения.
Функция инициализации LCD12864_Init
image-20211005145620692
void LCD12864_Init()
{
P4M1 = 0;
P4M0 = 0;//把P4全部设置为标准IO口,这里不讲究了
//这时候就根据时序图写时序
LCD12864_Delay(250); //上电后等待至少15ms,才能往LCD写指令
LCD12864_Delay(250); //上电后等待至少15ms,才能往LCD写指令
LCD12864_Write_Cmd(0x38);
LCD12864_Write_Cmd(0x01);
LCD12864_Delay(50);
LCD12864_Write_Cmd(0x02);
LCD12864_Delay(50);
LCD12864_Write_Cmd(0x06);
LCD12864_Write_Cmd(0x0c);
LCD12864_Write_Cmd(0x14);
}
Для того чтобы посмотреть как выглядит инициализация, давайте выведем символ посмотреть, просто пропишите его под инициализацией пока что, если не получается отобразить, давайте посмотрим, что не так с кодом
Отображение ошибок на китайском языке
Китайский отображается правильно
Для того, чтобы облегчить отображение китайских иероглифов, мы создаем массив кеша китайских иероглифов (конечно, следующая операция не является удобной, но для того, чтобы новички поняли принцип, это лучшая операция)
Очень важная вещь, показывающая недостатки китайских иероглифов
Обслуживание ЖК-дисплеев
//液晶显示服务
void LCD12864_Display_Ser()
{
LCD12864_Write_Cmd(0x80);
LCD12864_Write_Data(LCD12864_Write_Buffer[0]);
LCD12864_Write_Data(LCD12864_Write_Buffer[1]);
LCD12864_Write_Data(LCD12864_Write_Buffer[2]);
LCD12864_Write_Data(LCD12864_Write_Buffer[3]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[14]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[15]);//年
LCD12864_Write_Data(LCD12864_Write_Buffer[4]);
LCD12864_Write_Data(LCD12864_Write_Buffer[5]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[16]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[17]);//月
LCD12864_Write_Data(LCD12864_Write_Buffer[6]);
LCD12864_Write_Data(LCD12864_Write_Buffer[7]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[18]);
LCD12864_Write_Data(LCD12864_Chinese_Buffer[19]);//日
}
Распределение данных ЖК-дисплея
void LCD12864_Allot()//永远都要记住LCD是慢的模块
//不需要刷的很快(因为他放在main里面是快刷的)所以我们
//为了不影响其他器件,我们让他刷的次数降低就行
{
static xdata u16 count = 0;
count++;
if(count>500)
{
count = 0;
//两个字节一组数字
LCD12864_Write_Buffer[0] = 0x30+2;//不能直接2,要转成ASCII值
LCD12864_Write_Buffer[1] = 0x30+0;
LCD12864_Write_Buffer[2] = 0x30+2;
LCD12864_Write_Buffer[3] = 0x30+1;
LCD12864_Write_Buffer[4] = 0x30+1;
LCD12864_Write_Buffer[5] = 0x30+0;
LCD12864_Write_Buffer[6] = 0x30+0;
LCD12864_Write_Buffer[7] = 0x30+5;
}
LCD12864_Display_Ser();
}
Различные схемы памяти жидких кристаллов 12864
На следующем рисунке показана схема структуры адресов памяти DDRAM, здесь отображаются китайские иероглифы,Схема ЖК-дисплея представляет собой соединение левой и правой половины экрана, фактически дисплей представляет собой соединение верхней и нижней половины экрана., A0H--A7H, B0H--B7H, эти две строки находятся в верхней половине экрана, но не отображаются, они используются при прокрутке вверх и вниз. A8H--AFH, B8H--BFH — это кеш экрана прокрутки нижней половины экрана.
Если операция заключается в перемещении экрана влево и вправо, переместите экран влево, и 88H будет отображаться в позиции 87H. Однако номер адреса и содержимое не меняются, но изменяется позиция отображения.
Структура внутренней цепи
Фактическое положение на дисплее
1. Операция инициализации ЖК-дисплея
После сброса запишите команды (на дисплее 0x0c) и (очистить экран 0x01) последовательно, а затем задержите на некоторое время