Небольшой код фермера 12864 LCD снова атаковал микроконтроллер

задняя часть встроенный
Небольшой код фермера 12864 LCD снова атаковал микроконтроллер

"Это 10-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

Небольшой код фермера 12864 LCD снова атаковал микроконтроллер

Введение в LCD12864

Ненормальный ЖК-экран LCD12864, 3 стопки херни COB сзади, одна основная микросхема управления ST7920, а две другие микросхемы переключения ST7921

image-20211005080146245

Основная микросхема управления ST7920 выполняет следующие функции:

1. Параллельная связь с нашим микроконтроллером

2. ПЗУ со шрифтами, CGROM, DDRAM

3. Линейное сканирование COM0-COM31

4. Сканирование столбца SEG0-SEG63

5. Последовательно отправьте данные на два чипа драйвера ST7921.

Функция микросхемы драйвера ST7921 заключается в следующем.

1. Получите последовательный сигнал от ST7920 и преобразуйте его в напряжение привода параллельного порта.

2. В соответствии с требованиями к сигналу два чипа управляют SEG64-SEG159, SEG160-SEG255 соответственно.

image-20211005093951823

Схема

image-20211005133240359

LCD12864 Временная диаграмма

параллельно

image-20211005112719150

Функция команды записи 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 земля низкий уровень):

  1. Процесс записи команды: RS находится на низком уровне, затем команда загружается в D0--D7, вывод E генерирует спадающий фронт, команда принимается и выполняется процессором 12864.
  2. Процесс записи содержимого: RS имеет высокий уровень, затем данные загружаются в D0--D7, вывод E генерирует спадающий фронт, данные принимаются и отображаются 12864.

Серийный (мы его не используем, просто проанализируйте диаграмму последовательности, если хотите его использовать)

image-20211005112901724

Команды для 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. После разрешения расширенных инструкций используется для рисования

image-20211005143704693

Предыдущий раздел инициализации может напрямую использовать 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);
}

Для того чтобы посмотреть как выглядит инициализация, давайте выведем символ посмотреть, просто пропишите его под инициализацией пока что, если не получается отобразить, давайте посмотрим, что не так с кодом

image-20211005152046828

Отображение ошибок на китайском языке

image-20211005153931962

Китайский отображается правильно

image-20211005154351271

Для того, чтобы облегчить отображение китайских иероглифов, мы создаем массив кеша китайских иероглифов (конечно, следующая операция не является удобной, но для того, чтобы новички поняли принцип, это лучшая операция)

image-20211005155843390

Очень важная вещь, показывающая недостатки китайских иероглифов

image-20211005172226611

Обслуживание ЖК-дисплеев

//液晶显示服务
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();
}
image-20211005172054101

Различные схемы памяти жидких кристаллов 12864

image-20211005120729234

На следующем рисунке показана схема структуры адресов памяти DDRAM, здесь отображаются китайские иероглифы,Схема ЖК-дисплея представляет собой соединение левой и правой половины экрана, фактически дисплей представляет собой соединение верхней и нижней половины экрана., A0H--A7H, B0H--B7H, эти две строки находятся в верхней половине экрана, но не отображаются, они используются при прокрутке вверх и вниз. A8H--AFH, B8H--BFH — это кеш экрана прокрутки нижней половины экрана.

Если операция заключается в перемещении экрана влево и вправо, переместите экран влево, и 88H будет отображаться в позиции 87H. Однако номер адреса и содержимое не меняются, но изменяется позиция отображения.

Структура внутренней цепи

image-20211005121900412

Фактическое положение на дисплее

image-20211005123658502

1. Операция инициализации ЖК-дисплея

После сброса запишите команды (на дисплее 0x0c) и (очистить экран 0x01) последовательно, а затем задержите на некоторое время

2. Непосредственно отображать работу английских и китайских иероглифов

image-20211005124648092

image-20211005124938066

3. Операция отображения пользовательских символов

image-20211005125128849

image-20211005125154133

image-20211005181504476