Современная электроника №6/2024
ИНЖЕНЕРНЫЕ РЕШЕНИЯ 43 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 6 / 2024 грамма использует всего три цвета : синий (BLUE), зелёный (GREEN) и красный (RED), имеет смысл зара - нее перевернуть все байты этих цве - тов ( их всего 6 штук ). Автором это сделано вручную и представлено ниже . В этом случае обращение к п / п reverse_byte(byte_in) уже не потребу - ется , и указанные двухбайтные сло - ва побайтно будут выводиться напря - мую в порт P1. //#define BLUE 0x000f //синий #define BLUE 0x00f0 //синий инверсный //#define RED 0xF880 //крас- ный #define RED 0x1F01 //красный инверсный //#define GREEN 0x07E0 //зел ё - ный #define GREEN 0xE007 //зел ё - ный инверсный Во - вторых , чтобы не обращаться к п / п outbyte(uint8_t byte), процедура записи байта в дисплей ( манипуля - ции битами CS, WR и вывода байта в порт P1) внесена в само тело п / п выво - да двухбайтного кода цвета . Для это - го вначале установлено совмещение двухбайтного слова с массивом из двух однобайтных элементов : / / - - - - - - - - - - union { uint16_t US; // U.UB[ 0] - Ст.б. uint8_t UB[1]; // U.UB [1] - Мл.б. } U; // U.US - 2-байтное uint16_t число. //---------- С использованием этого совмещения п / п записи двух байтов цвета в каждый пиксель представлена на листинге 4. Как видно из этой п / п , запись каждо - го из двух байтов происходит за 5 так - тов ( начиная с CS = 0; по CS = 1;), каж - дый из которых при тактовой частоте 72 МГц занимает около 14 нс , т . е . все - го 14 нс × 5 = 70 нс . Если каждая гисто - грамма имеет ширину 40 пикселей и высоту 240 пикселей , т . е . состоит из 9600 пикселей , то для передачи двух байтов в каждый пиксел двух гисто - грамм потребуется передать 9600 × 2 × × 2 = 38 400 байтов ( см . выше ). Умно - жив это количество байтов на 70 нс , получим : 38 400 × 70 нс = 2 688 000 нс = = 2,688 мс 2,7 мс , что соответствует частоте обновления экрана дисплея F = 1/2,7 мс = 0,3704 кГц 370 Гц , что , как уже говорилось , в 2–4 раза пре - вышает частоту обновления экранов современных телевизоров и монито - ров (100–200 Гц ). Следующие три п / п ( листинг 5) определяют область экрана для запол - нения данными , заливку всего дисплея определённым цветом ( она входит в п / п инициализации дисплея ) и залив - ку определённой области экрана опре - делённым цветом . П / п АЦП в настоящей программе та же самая , что и в [1]; она подробно Листинг 3. Подпрограммы вывода однобайтных команд и данных в дисплей //---------------------- void outcmd(uint8_t byte_in) {//вывод команды uint8_t byte; byte = reverse_byte(byte_in); DC = 0; CS = 0; outbyte(byte); CS = 1; } //-------------------------------- void outdat(uint8_t byte_in) {//вывод данных uint8_t byte; byte = reverse_byte(byte_in); DC = 1; CS = 0; outbyte(byte); CS = 1; } Листинг 5. Подпрограммы работы с дисплеем //------------------ // определение области экрана для заполнения void SetWindow(uint8_t startX, uint8_t startY, uint8_t stopX, uint8_t stopY) { outcmd(0x2A); outdat(0x00); outdat(startX); outdat(0x00); outdat(stopX); outcmd(0x2B); outdat(0x00); outdat(startY); outdat(0x00); outdat(stopY); } //----------------------- //----------------------- // заливка всего дисплея цветом void LCD_Fill(uint16_t color) { uint16_t i; //16 SetWindow(0, 0, 239, 239); outcmd(0x2C); DC = 1; for (i = 0; i < 57600; i++) {//240*240=57600 outdat16(color); } outcmd(0x2C); outcmd(0x29); } //---------------------------- // заливка области экрана цветом void FillWin(uint8_t startX, uint8_t startY, uint8_t stopX, uint8_t stopY, uint16_t color) { uint16_t i, j; SetWindow(startX, startY, stopX, stopY); outcmd(0x2C); j = ((stopX - startX) + 1) * ((stopY - startY) + 1); DC = 1; for (i = 0; i < j; i++) { outdat16(color); } outcmd(0x2C); // запись в память дисплея } Листинг 4. Подпрограмма записи двух байтов цвета //----outdat16------------- void outdat16(uint16_t wor) { U.US = wor; CS = 0; P1 = U.UB[ 0]; //Ст.б. WR = 1; WR = 0; CS = 1; CS = 0; P1 = U.UB[ 1]; //Мл.б. WR = 1; WR = 0; CS = 1; } //------------------
RkJQdWJsaXNoZXIy MTQ4NjUy