Понимание принципа OLED-дисплея - различные способы использования OLED-модулей
Модуль OLED имеет четыре режима работы, а именно 6800 и 8080 параллельных интерфейсов, 4-проводной серийный режим интерфейса SPI и режим интерфейса IIC.Связь между настройками BS1/BS2 и режимом интерфейса модуля показана в следующей таблице::
По умолчанию настройка OLED-модуля SAEF Technology - BS0 до GND, BS1 и BS2 до VCC (режим 8080), если вы хотите настроить его на другие режимы,Вы должны изменить настройки BS0-BS2 с помощью паяльного железа на задней стороне OLED(Изменение оборудования)
Из схемы мы можем узнать, что в общей сложности 16 штифтов вытянуты, и из 16 линий мы использовали только 15 штифтов, и одна из них висит.и осталось 13. В разных режимах, количество сигнальных линий нам нужно различно, в режиме 8080, все 13 необходимы, один из которых является общим, то есть линия сброса RST (RES),который мы можем напрямую подключить к перезагрузке MCU (чтобы подтвердить, что метод перезагрузки является тем же)В режиме IIC, нужны только 2 строки!
Мы только что узнали об этом. Рабочий режим IIC требует только двух линий, и рабочий режим IIC состоит в том, чтобы использовать два провода для имитации IIC для получения данных.
OLED-контроллер является SSD1306, то есть: обнаженный экран управляется SSD1306, который также является более широко используемым чипом драйвера с светодиодом.
Видеопамять OLED-модуля
Сама OLED не имеет видеопамяти, и ее видеопамять зависит от SSD1306. Общая память SSD1306 составляет 128 * 64 бит, а SSD1306 делит память на 8 страниц.Каждая страница содержит 128 байтов, в общей сложности 8 страниц, что соответствует размеру матрицы из 128*64 точек.
Однако, поскольку OLED не может контролировать одну матрицу точек одновременно, он может контролировать только матрицу 8 точек; и это вертикальное управление стережкой;
Поскольку каждая запись записывается байтами, возникает проблема, если мы используем режим только записи для работы модуля, то мы должны писать 8 точек за раз, так что когда мы рисуем точку,мы должны выяснить текущее состояние каждого бита байта, где точка, которая должна быть установлена расположена (0/1В противном случае, записанные данные будут перезаписываться предыдущим состоянием, и результатом будет то, что некоторые точки, которые не должны быть отображены, отображаются,или те, которые должны быть отображены не отображаютсяВ читаемом режиме мы можем сначала прочитать байт, который нужно записать, получить текущую ситуацию, а затем записать его в грамм после модификации бита, который нужно переписать,чтобы не повлиять на прежнюю ситуацию.Однако для этого требуется возможность чтения GRAM, для 3-проводной или 4-проводной SPI-режима модуль не поддерживает чтение, а режим чтения->-to->-write также относительно медленный.
Итак, метод, который мы используем, это создать OLED GRAM (всего 128 байтов) внутри STM32, и при каждой модификации, только модифицировать GRAM на STM32 (на самом деле SRAM), и после модификации,записывать GRAM на STM32 на OLED GRAM одновременноКонечно, этот метод имеет и недостатки, т. е. для тех микроконтроллеров с очень маленькой SRAM (таких как 51 серия), он более проблематичен.
Видеопамять OLED
Формат хранения следующий:
1 2 3... 127
//[1]0 1 2 3... 127
//[2]0 1 2 3... 127
//[3]0 1 2 3... 127
//[4]0 1 2 3... 127
//[5]0 1 2 3... 127
//[6]0 1 2 3... 127
//[7]0 1 2 3... 127
u16 OLED_GRAM[128][8];
Обновление видеопамяти на ЖК-дисплей
void OLED_Refresh_Gram (недействительно)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Установите адрес страницы (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Установите положение отображения нижний адрес столбца
OLED_WR_Byte (0x10,OLED_CMD); Установите местоположение отображения
for ((n=0; n<128; n++)OLED_WR_Byte ((OLED_GRAM[n][i],OLED_DATA);
}
}
Команда SSD1306
1: команда 0X81: Установите контраст. Содержит два байта, первый 0X81 - это команда, а следующий один байт - это значение контраста, которое должно быть установлено. Чем больше это значение установлено,чем ярче будет экран.
2: команда 0XAE/0XAF: 0XAE для выключения команды отображения; 0XAF для включения команды отображения.
3: команда 0X8D: содержит 2 байта, первый - это командное слово, второй - это значение набора, второй байт BIT2 указывает на состояние переключения насоса зарядки, бит равен 1,зарядное насос включенКогда модуль инициируется, это должно быть включено, иначе вы не увидите дисплей.
4: команда 0XB0~B7: используется для установки адреса страницы, а три нижних цифры соответствуют адресу страницы GRAM.
5: команда 0X00~0X0F: используется для установки нижних четырех цифр адреса начальной колонки при отображении.
6: команда 0X10~0X1F: используется для установки адреса начальной колонки дисплея на четыре цифры выше.
Для получения дополнительных команд, пожалуйста, обратитесь к этому, это настоятельно рекомендуется посмотреть его, это очень подробно: SSD1306 (OLED драйвер чип) инструкции в деталях
После введения режима работы и драйвера чипа, мы можем начать использовать этот IIC OLED модуль
Подробный код
#define OLED_CMD 0 // запись команды
#define OLED_DATA 1 //Запишите данные
Инициализировать OLED
Инициализировать SSD1306
void OLED_Init (недействительный)
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); Включить часы на портах A
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; вывод подталкивания
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; скорость 50MHz
GPIO_Init ((GPIOA, &GPIO_InitStructure); инициировать GPIO
GPIO_SetBits ((GPIOA,GPIO_Pin_5 в соответствии с GPIO_Pin_7);
delay_ms(200);
OLED_WR_Byte ((0xAE,OLED_CMD);//-- отображение отключено
OLED_WR_Byte ((0x00,OLED_CMD);//---установить адрес низкой колонки
OLED_WR_Byte ((0x10,OLED_CMD);//---установить высокий адрес столбца
OLED_WR_Byte ((0x40,OLED_CMD);//--установить начальный адрес строки
OLED_WR_Byte ((0xB0,OLED_CMD);//--установите адрес страницы
OLED_WR_Byte ((0x81,OLED_CMD); // Контроль контракта
ОЛЕД_ВР_Байт ((0xFF,OLED_CMD);//--128
OLED_WR_Byte ((0xA1,OLED_CMD);//ремаркация набора сегментов
OLED_WR_Byte ((0xA6,OLED_CMD);//-- нормальный / обратный
OLED_WR_Byte ((0xA8,OLED_CMD);//--соотношение мультиплекса ((1 до 64)
OLED_WR_Byte ((0x3F,OLED_CMD);//--1/32 должность
OLED_WR_Byte ((0xC8,OLED_CMD);//Com направление сканирования
OLED_WR_Byte ((0xD3,OLED_CMD);//-set display offset
OLED_WR_Byte ((0x00,OLED_CMD);//
OLED_WR_Byte ((0xD5,OLED_CMD);//set osc division
OLED_WR_Byte ((0x80,OLED_CMD);//
OLED_WR_Byte ((0xD8,OLED_CMD);//заключить режим цвета области
OLED_WR_Byte ((0x05,OLED_CMD);//
OLED_WR_Byte ((0xD9,OLED_CMD);//Установите период предварительной зарядки
OLED_WR_Byte ((0xF1,OLED_CMD);//
OLED_WR_Byte ((0xDA,OLED_CMD);//создание конфигурации
OLED_WR_Byte ((0x12,OLED_CMD);//
OLED_WR_Byte ((0xDB,OLED_CMD);//set Vcomh
OLED_WR_Byte ((0x30,OLED_CMD);//
OLED_WR_Byte ((0x8D,OLED_CMD);//запустить насос зарядки
OLED_WR_Byte ((0x14,OLED_CMD);//
OLED_WR_Byte ((0xAF,OLED_CMD);//-- включить OLED-панель}
OLED_Clear ((); Очистить экран, рекомендуется очистить экран сначала после каждой инициализации завершена
Функция очистки экрана, после очистки экрана весь экран становится черным!
void OLED_Clear (недействительный)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Установите адрес страницы (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Установите положение отображения нижний адрес столбца
OLED_WR_Byte (0x10,OLED_CMD); Установите местоположение отображения
for ((n=0; n<128; n++)OLED_WR_Byte(0,OLED_DATA);
} // Обновить дисплей
}
В самомодуле, который мы обычно используем, есть два распространенных способа взять модульный, один из которых 6 * 8, а другой - 8 * 16,Первый из них - это извлечь нужные символы из прямоугольной таблицы с 8 рядами и 6 столбцами.Как написано в комментарии к коду ниже, поскольку в OLED есть только 8 строк на страницу,нужно использовать пространство для следующей страницыИтак, у нас есть размер шрифта, который мы обычно используем, конечно, это часто используемые размеры шрифта, мы также можем сделать свой любимый размер шрифта через программное обеспечение модуляции символов.
/* Показывает символ в указанном месте, включая некоторые символы
x:0~127
y:0~63
Размер: Выберите шрифт 16/12*/
void OLED_ShowChar ((u8 x,u8 y,u8 chr,u8 Char_Size)
{
не подписанный char c=0,i=0;
c=chr-' '; значение смещения можно получить из шаблона шрифта, первый из которых является " ", и соответствующий символ можно получить путем вычитания
if(x>Max_Column-1) {x=0; y=y+2; } //Max_Column: Максимальная колонка: 128; x: установить количество колонк; y: установить количество страниц
if(Char_Size ==16) // В этом случае требуется одна и та же колонка из двух страниц, и требуется матрица точек 8*16
{
OLED_Set_Pos(x,y); Если x = y = 2, то установить его в колонке 3 на странице 3, примечание: есть только восемь строк на странице
for ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i],OLED_DATA); увеличивая i, точки рисуются в петлю, и все 8 строк второй колонки на странице 2 записываются в данные
OLED_Set_Pos(x,y+1); Поскольку количество точек недостаточно, вам нужно продолжить точки в колонке 2 на странице 3
for ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i+8],OLED_DATA); Продолжайте завершать рисунок до конца пункта 16.
}
иное
{
OLED_Set_Pos ((x,y); матрица с точками 6x8, не требуется другие страницы для продолжения рисования
for ((i=0; i<6; i++)
OLED_WR_Byte ((F6x8[c][i],OLED_DATA); В двумерном массиве C управляет рядами, а I управляет столбцами, поэтому для завершения рисунка не требуются другие операции
}
}
Следующее if(x>120) не является ошибкой, потому что предыдущее x+=8; есть объяснение в следующих примечаниях, так что вы можете подумать об этом.
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // Показывает строку
{
не подписанный char j=0;
while (chr[j]!='0') // Проверьте, заканчивается ли строка
{
OLED_ShowChar ((x,y,chr[j],Char_Size); Нарисуйте символы один за другим
x + = 8; x установлен в столбце, размер символа 8 * 16, то есть ряд 16 и столбец 8, и каждый раз, когда он отображается как один, вы должны переместить 8 столбцов в более высокую колонку
if(x>120){x=0; y+=2; } // Максимальный размер 128 столбцов, если он превышен, вам нужно начать с нулевой колонки снова, потому что вам нужны другие страницы, чтобы продолжить рисование в это время,чтобы избежать перекрытия, вам нужно y + = 2.
j++; Нарисуйте строки в петле
}
}
2 числа отображаются, оба написаны в коде ниже, и следует отметить, что "" ниже представляет значение ASCII 32
m^n функция
u32 oled_pow ((u8 m,u8 n)
{
u32 результат=1;
в то время как n-- результат*=m;
результат возврата;
}
Показать 2 числа
x,y: стартовые координаты
len: количество цифр числа
размер: размер шрифта
режим: режим 0, режим заполнения; 1. режим наложения
num: числовое значение (0~4294967295);
void OLED_ShowNum ((u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
для t=0; t { temp=(num/oled_pow(10,len-t-1))%10; if(показать==0&&t<(len-1)) { если ((temp==0) { OLED_ShowChar ((x+(size2/2) *t,y,' ',size2); продолжать; }else показывает=1; } OLED Display Char ((x+(size2/2) *t,y,temp+'0',size2); } Выше несколько являются нашим наиболее основным использованием, некоторые Си хотят использовать его для завершения более различных операций, следующее, перед введением,Во-первых, представьте наше часто используемое программное обеспечение для моделирования.. ПК на LCD 2002 Вот как это работает! Когда мы используем его, мы сначала открываем файл в левом верхнем углу и создать новый. Введите нашу ширину и высоту, 6 * 8 или 8 * 16 основаны на этом, чтобы взять форму, вы можете установить размер самостоятельно.В верхнем углу есть что-то вроде передачи.Как показано на рисунке: Как только у вас есть все на вершине, вы можете нарисовать, что вы хотите. потому что OLED 128 * 64, наш максимальный размер это, мы можем написать на 128 * 64, рисовать, и т.д., что выходит целое изображение,что также способ заполнить экран, а сзади есть своего рода программное обеспечение для имитации, которое получается в виде изображения, например, некоторых аниме-персонажей. Теперь, когда мы представили инструменты, мы готовы перейти к нашим операциям! 1Нарисуй прямую линию. 2: Показывать фотографии (например, некоторых персонажей аниме) Это кажется немного длинным. Есть больше способов играть, чтобы обновить следующий.
Обычно мы используем ту же точку, что и на рисунке ниже, когда мы хотим нарисовать прямую линию, мы всегда получаем точку, это потому, что размер символа, который мы обычно используем, 6 * 8 или 8 * 16,и размер точки внутри не заполняет весь прямоугольник (объяснено выше)Нужно открыть программное обеспечение для персонажей и расширить тему!
Контактное лицо: Mrs. Christina
Телефон: +8618922869670
Факс: 86-755-2370-9419