Вывод текста на дисплей ST7789

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

Есть дисплей 240 на 240 пикселей, на который вывожу текст.
Для этого взял один из примеров, в котором есть ряд шрифтов, максимальный 16 на 28 пикселей. Данные шрифты отображаются на дисплее нормально, но мне нужны более крупные шрифты, поэтому добавляю свои (вариант умножать уже имеющиеся шрифты не подходит, слишком пиксельно получается). В MatrixFont генерирую шрифт 32х48.

Далее пробую его выводить (умножая на 4) и наблюдается ряд проблем. Одна из которых это неполный вывод значения.
Для простоты оставил первый символ сгенерированного шрифта, а именно пробел - " ". Но заполнил его чередующимися 0 и 1. По сути на дисплей должен вывестись прямоугольник из полосок размером 32 на 48 пикселей (соотношение сторон 2 : 3).

Но на дисплее я получаю прямоугольник ровно в 2 раза уже, чем тот, что должен быть, соотношение сторон 1 : 3. Не могу найти причину данного поведения. Может у кого есть догадки?

Вывод символа:

Код: Выделить всё

ST7789_DrawChar( 10, 25, RGB565( 255, 255, 255 ) , RGB565( 0, 0, 0 ) , 0, &Font_32x48, 4, ' ');
Функция вывода:

Код: Выделить всё

void ST7789_DrawChar(uint16_t x, uint16_t y, uint16_t TextColor, uint16_t BgColor, uint8_t TransparentBg, FontDef_t* Font, uint8_t multiplier, unsigned char ch){
	
	uint32_t i, b, j;
	
	uint32_t X = x, Y = y;
	
	uint8_t xx, yy;
	
	if( multiplier < 1 ){
		multiplier = 1;
	}

	//Check available space in LCD
	if (ST7789_Width >= ( x + Font->FontWidth) || ST7789_Height >= ( y + Font->FontHeight)){

	
			//Go through font
			for (i = 0; i < Font->FontHeight; i++) {		
				
				if( ch < 127 ){			
					b = Font->data[(ch - 32) * Font->FontHeight + i];
				}
				
				else if( (uint8_t) ch > 191 ){
					// +96 это так как латинские символы и знаки в шрифтах занимают 96 позиций
					// и если в шрифте который содержит сперва латиницу и спец символы и потом 
					// только кирилицу то нужно добавлять 95 если шрифт 
					// содержит только кирилицу то +96 не нужно
					b = Font->data[((ch - 192) + 96) * Font->FontHeight + i];
				}
				
				else if( (uint8_t) ch == 168 ){	// 168 символ по ASCII - Ё
					// 160 эллемент ( символ Ё ) 
					b = Font->data[( 160 ) * Font->FontHeight + i];
				}
				
				else if( (uint8_t) ch == 184 ){	// 184 символ по ASCII - ё
					// 161 эллемент  ( символ ё ) 
					b = Font->data[( 161 ) * Font->FontHeight + i];
				}
				//-------------------------------------------------------------------
				
				//----  Украинская раскладка ----------------------------------------------------
				else if( (uint8_t) ch == 170 ){	// 168 символ по ASCII - Є
					// 162 эллемент ( символ Є )
					b = Font->data[( 162 ) * Font->FontHeight + i];
				}
				else if( (uint8_t) ch == 175 ){	// 184 символ по ASCII - Ї
					// 163 эллемент  ( символ Ї )
					b = Font->data[( 163 ) * Font->FontHeight + i];
				}
				else if( (uint8_t) ch == 178 ){	// 168 символ по ASCII - І
					// 164 эллемент ( символ І )
					b = Font->data[( 164 ) * Font->FontHeight + i];
				}
				else if( (uint8_t) ch == 179 ){	// 184 символ по ASCII - і
					// 165 эллемент  ( символ і )
					b = Font->data[( 165 ) * Font->FontHeight + i];
				}
				else if( (uint8_t) ch == 186 ){	// 184 символ по ASCII - є
					// 166 эллемент  ( символ є )
					b = Font->data[( 166 ) * Font->FontHeight + i];
				}
				else if( (uint8_t) ch == 191 ){	// 168 символ по ASCII - ї
					// 167 эллемент ( символ ї )
					b = Font->data[( 167 ) * Font->FontHeight + i];
				}
				//-----------------------------------------------------------------------------
			
				for (j = 0; j < Font->FontWidth; j++) {
					
					if ((b << j) & 0x8000) {
						
						for (yy = 0; yy < multiplier; yy++){
							for (xx = 0; xx < multiplier; xx++){
									ST7789_DrawPixel(X+xx, Y+yy, TextColor);
							}
						}
						
					} 
					else if( TransparentBg ){
						
						for (yy = 0; yy < multiplier; yy++){
							for (xx = 0; xx < multiplier; xx++){
									ST7789_DrawPixel(X+xx, Y+yy, BgColor);
							}
						}
						
					}
					X = X + multiplier;
				}
				X = x;
				Y = Y + multiplier;
			}
	}
}
Сам выводимый символ (48 значений):

Код: Выделить всё

const uint16_t Font32x48 [] = {
		0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	//	номер в Acii - 32   < >
};
Вложения
2024-06-28_14-22-55.png
(168.06 КБ) 162 скачивания
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

ST7789_DrawPixel(X+xx, Y+yy, BgColor);
он попиксельно собирается литеры отрисовывать на IPS дисплей :(
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Сообщение 240265 »

Потом научится области заполнять.
IVL ex UA6PJ
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596078#p4596078"]Да, начинающим так удобнее[/uquote]

С Вашим примером возникли трудности.
Других примеров особо нет. По-моему они все попиксельные
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596453#p4596453"]Согласитесь, гораздо легче видеть? Да и тестировать тоже.[/uquote]
Мне кажется Вы выкинули много. Код так перестает что-либо выводить.
Так работает

Код: Выделить всё

void ST7789_DrawChar(uint16_t x, uint16_t y, uint16_t TextColor, uint16_t BgColor, uint8_t TransparentBg, FontDef_t* Font, uint8_t multiplier, unsigned char ch){

	uint32_t i, b, j;

	uint32_t X = x, Y = y;

	uint8_t xx, yy;

	//Go through font
	for (i = 0; i < Font->FontHeight; i++) {

		b = Font->data[(ch - 32) * Font->FontHeight + i];

		for (j = 0; j < Font->FontWidth; j++) {

			if ((b << j) & 0x8000) {

				for (yy = 0; yy < multiplier; yy++){
					for (xx = 0; xx < multiplier; xx++){
						ST7789_DrawPixel(X+xx, Y+yy, TextColor);
					}
				}

			}
			else if( TransparentBg ){

				for (yy = 0; yy < multiplier; yy++){
					for (xx = 0; xx < multiplier; xx++){
						ST7789_DrawPixel(X+xx, Y+yy, BgColor);
					}
				}

			}
			X = X + multiplier;
		}
		X = x;
		Y = Y + multiplier;
	}
}
Но выводит так же, обрезано в 1/2.
Этот пример еще попробовал. https://github.com/Floyd-Fish/ST7789-ST ... /README.md
Тут, вроде, вывод не попиксельно. Но ситуация 1 в 1. Выводит 1/2. Если быть точным не выводит 1/2, а отображает. Например если вывести 2 области (Полностью закрашенные 0xFFFF) друг за другом, то будет как на рисунке. Т.е. область под элемент 32х48 он "выделяет", но отображает только 1/2
Вложения
123.png
(18.55 КБ) 141 скачивание
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596481#p4596481"]просто попиксельно можете залить весь экран? без умножения и прочего, просто от нуля до ширины и от нуля до высоты экрана прогнать ST7789_DrawPixel(x, y, Color);[/uquote]
Да, все отлично залилось

Код: Выделить всё

  for(uint8_t y = 0; y < 240; y++)
  {
	 for(uint8_t x = 0; x < 240; x++)
	 {
		 ST7789_DrawPixel(x, y, color);
	 }
  }
По всей видимости косяк где-то в массиве шрифта, но не знаю, там вроде все нормально. 16 битные данные, 0xFFFF и тд
Размер шрифта задаю тоже

Код: Выделить всё

#ifdef	FONT_32x48
FontDef_t Font_32x48 = {
	32,
	48,
	Font32x48
};
#endif
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596502#p4596502"]16-битные? а сдвигаете не 32 раза, случаем?[/uquote]

Базовые шрифты он выводит, они тоже заданы как 16 ьитные

Код: Выделить всё

const uint16_t Font6x8 [] = {
	
// --  English font with symbols  ----------------------------------------
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  // sp
0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x2000, 0x0000,  // !
....
};
Если его умножить в несколько раз, то он выведет одно число на весь экран, т.е. больше диапазоном, чем я сейчас пытаюсь
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596514#p4596514"]Добавлено after 3 minutes 35 seconds:
if ((b << j) & 0x80000000) // b = 32 бит[/code][/uquote]

Стала выводиться 2я половина, а первая перестала)))

Может там в других функция проблема...
Вложения
LCD.rar
(26.54 КБ) 229 скачиваний
Последний раз редактировалось DmitryR Сб июн 29, 2024 16:47:38, всего редактировалось 1 раз.
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596517#p4596517"]Шрифт же остался 16-битным?[/uquote]
Да, конечно
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596519#p4596519"]ну и? ))
Смотрите, 16-бит - это как массив из 16 элементов. Как можно в массиве, размером 16 получить данные элементов, позиции которых 15...31 ? Их просто нет[/uquote]
Ну в Ваших словах есть логика, но если сделать массив 32 битным, то результат тот же, но расстояние между полосками (в массиве чередуются 0х0000 и 0хFFFF) увеличивается. Но область массива та же.
Есть ощущение, что где-то переполняется какая-то переменная, это не дает вывести область 32 на 48....
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596526#p4596526"]сколько здесь бит всего? 16х48=768? а сколько должно быть в шрифте 32х48? 1536? Ни на что не намекает? В 2 раза меньше, в ту самую невыводящуюся половину.[/uquote]

Не, я первым же делом увеличил массив в несколько раз

Код: Выделить всё

		0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	//	32	< >
		0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,
		0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,	0xFFFF,	0x0000,
...
Я заметил, что выводит он первые 48 элементов. Как раз это одна строка массива. Т.е. увеличение разрядности с 16 до 32 бит по сути должно было дать недостающую ширину, но происходит другой эффект:
- увеличиваю разрядность до 32х бит
0xFFFF увеличиваю до 0xFFFFFFFF
- на дисплее он одно значение 0xFFFFFFFF выводит в 2 строки. Т.е. если сделать разрядность в 2 раза больше, то я не получаю удлинение строки изображения, а получаю запись одного элемента в 2 строки. Т.е. теперь каждый элемент массива это 2 строки, а не одна, как должно быть
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596545#p4596545"]

Код: Выделить всё

 for (j = 0; j < Font->FontWidth; j++) {

         if ((b << j) & 0x8000) {
[/uquote]

Вы правильно указали на место, при таком исполнении массив выводится правильно:

Код: Выделить всё

			if ((b << j) & 0x8008000) {

				for (yy = 0; yy < multiplier; yy++){
					for (xx = 0; xx < multiplier; xx++){
						ST7789_DrawPixel(X+xx, Y+yy, TextColor);
					}
				}

			}
Если честно, я не до конца понял почему именно 8000 и 8008000. Почему, например не 0xFFFF. Если знаете, буду благодарен за объяснение. В любом случае Вам спасибо, что помогли. Я еще прогоню это на шрифте, чтобы убедиться, что все корректно работает. Так как это пока просто тест на 0x0000 и 0xFFFF. Как на шрифте он себя покажет надо пробовать.
Ну ввиду того, что ранее писали про попиксельный вывод. Я понимаю, что это не совсем хорошо. Ввиду этого есть ли смысл перейти на этот пример? https://github.com/Floyd-Fish/ST7789-ST ... 9/st7789.c
Там очень похожие функции
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="Martian",url="/forum/viewtopic.php?p=4596553#p4596553"]
DmitryR писал(а): почему именно 8000 и 8008000.
наверное, я опечатался. правильно 8000 и 80000000 - это просто маска для проверки старшего бита. 0х8000 для uint_16 и 0х80000000 для uint_32[/uquote]
не совсем, получается, что правильно будет 16 бит, и ((b << j) & 0x8008000)

Ну я его запускал, в целом там все так же. DMA не проблема
Мудрый кот
Сообщения: 1855
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="DmitryR",url="/forum/viewtopic.php?p=4595962#p4595962"]Для простоты оставил первый символ сгенерированного шрифта, а именно пробел - " ". Но заполнил его чередующимися 0 и 1. По сути на дисплей должен вывестись прямоугольник из полосок размером 32 на 48 пикселей (соотношение сторон 2 : 3).

Но на дисплее я получаю прямоугольник ровно в 2 раза уже, чем тот, что должен быть, соотношение сторон 1 : 3. Не могу найти причину данного поведения. Может у кого есть догадки?[/uquote]Шрифт какой - пропорциональный или моноширинный?
Если шрифт - пропорциональный, то где-то в нём для каждого символа должна задаваться ширина (а также: базовая линия и может ещё какая инфа). И чтобы изменить вид какого-то символа, недостаточно изменить его битмап. Нужно изменить ширину и базовую линию.
Символ пробела в пропорциональных шрифтах обычно бывает очень узким. Возможно у вас выводит новый битмап, но со старой шириной.
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

[uquote="jcxz",url="/forum/viewtopic.php?p=4596579#p4596579"]Шрифт какой - пропорциональный или моноширинный?[/uquote]
Моноширинный
jcxz писал(а):Полагаю, тому, кто легко справляется с DMA, мои детские подсказки не нужны и смешны.
Ну DMA попроще... Нет? Ну, возможно, это просто для меня так.
jcxz писал(а):ТС выводит uint_16t, сдвигая его 32 раза. До пропорциональный или моноширинный там далеко...
Ну смотрите, если взять 32 битный массив, то он все равно тогда отображает 1 значение массива в 2 строки. Если взять if ((b << j) & 0x8000000) то будет отображаться половина массива. Почему тогда так?
Я на тексте пока не пробовал, может там ошибки полезут. Но пока на массиве из полосок результат такой
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср авг 31, 2022 12:10:34

Сообщение DmitryR »

Кому надо будет вывести большой шрифт на данном дисплее, можно воспользоваться данным примером
https://github.com/Floyd-Fish/ST7789-ST ... 9/st7789.c
Только я добавил шрифты и совсем немного изменил функцию их вывода

Код: Выделить всё

#define BG_COLOR   				0x1234				
#define TEXT_COLOR   			0x5678				
#define NUM_COLOR   			0x5678	

#define BLK_Pin GPIO_PIN_11
#define BLK_GPIO_Port GPIOA
//#define DC_Pin GPIO_PIN_3
//#define DC_GPIO_Port GPIOA
//#define RES_Pin GPIO_PIN_2
//#define RES_GPIO_Port GPIOA	

Код: Выделить всё

// START DELAY
HAL_Delay(250);

// LCD BACKLIGHT RESET
HAL_GPIO_WritePin(BLK_GPIO_Port, BLK_Pin, GPIO_PIN_RESET);

// LCD START
ST7789_Init();
ST7789_Fill_Color(BG_COLOR);

ST7789_WriteChar_64_96(15, 15, '0', Font_64x96, NUM_COLOR, BG_COLOR);
ST7789_WriteChar_64_96(75, 15, '0', Font_64x96, NUM_COLOR, BG_COLOR);

ST7789_WriteChar_32_48(150, 20, '0', Font_32x48, NUM_COLOR, BG_COLOR);
ST7789_WriteChar_32_48(185, 20, '0', Font_32x48, NUM_COLOR, BG_COLOR);

ST7789_WriteChar_24_32(175, 70, '0', Font_24x32, TEXT_COLOR, BG_COLOR);
ST7789_WriteChar_24_32(150, 70, '0', Font_24x32, TEXT_COLOR, BG_COLOR);
ST7789_WriteChar_24_32(195, 70, '0', Font_24x32, TEXT_COLOR, BG_COLOR);

// LCD BACKLIGHT SET
HAL_GPIO_WritePin(BLK_GPIO_Port, BLK_Pin, GPIO_PIN_SET);
Для генерации шрифтов использовал matrixFont-x64-Portable, для правильного вывода шрифта надо подобрать настройки генерации.

Была некая проблема, дисплей не всегда запускался, уменьшение скорости SPI и увеличение задержек при запуске результатов не дало. Помогло дублирование функции инициализации ST7789_Init(); через задержку. Как это можно исправить не знаю.

С SPI тоже есть неоднозначность, настройки из большинства примеров не подошли, их тоже надо подбирать под дисплей. По-моему какая-то одна, вроде на какой фронт клока считывать байты
Вложения
St7789.rar
(12.44 КБ) 145 скачиваний
Прорезались зубы
Аватара пользователя
Сообщения: 240
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Сообщение AlanDrakes »

[uquote="DmitryR",url="/forum/viewtopic.php?p=4614827#p4614827"]Была некая проблема, дисплей не всегда запускался, уменьшение скорости SPI и увеличение задержек при запуске результатов не дало. Помогло дублирование функции инициализации ST7789_Init(); через задержку. Как это можно исправить не знаю.[/uquote]

Рабочая инициализация для вот этого дисплея:
Спойлер

Код: Выделить всё

const uint16_t LCD_regValues[] = {
	0x0111,				// Sleep out
	0xF80C,				// Delay ~12ms
	0x013A, 0x0055,			// Set interface mode: 65k RGB color / 16 bit/px
	0x0136, 0x0000,			// Memory write control
// 	0x012B, 0x0000, 0x0014, 0x0001, 0x002B,		// Row address set: 0..279 (20..299) - Full screen
	0x012B, 0x0000, 0x0000, 0x0000, 0x00EF,		// Row address set: 0..239 - Full screen
	0x0130, 0x0000, 0x0000, 0x0000, 0x00EF,		// Display area is 0..239
	0x0121,				// Inversion: ON
// 	0x0113,				// Normal display on
	0x0112,				// Partial display on
	0x0129				// Display on
};

void SPI_Send_8(uint8_t Value) {
	*(volatile uint8_t *)&(SPI1->DR) = Value;
	while (!(SPI1->SR & SPI_SR_TXE)) {};
	while (SPI1->SR & SPI_SR_BSY) {};
}


void LCD_Init(void) {
	unsigned int i;
	uint16_t v;
	
	GPIOF->BSRR = GPIO_BSRR_BR_1; // LCD /RST pin Down
	delay_ms(2);
	GPIOF->BSRR = GPIO_BSRR_BS_1; // LCD /RST pin UP
	delay_ms(20);
	
	for (i=0;i<sizeof(LCD_regValues)/2;i++) {
		v = LCD_regValues[i];
		if (v >= 0xF800) {
			delay_ms(v & 0x7FF);
		} else {
			if (v & 0x0100) {
				LCD_DC_SET();
			} else {
				LCD_DC_UNSET();
			}
			SPI_Send_8(v & 0xFF);
		}
	}
}
Дисплей в даташите ТРЕБУЕТ задержки после Soft-Reset'а Ну и аппаратный сброс выполняется тоже по таймингам. Инициализируется каждый раз.
Закомментированные строки - от другого дисплея на этом же чипе.

После функции LCD_Init() в памяти дисплея мусор и его нужно переписать своим изображением. Лично я заливаю нулями для получения чёрного фона.

SPI инициализируется минимально:

Код: Выделить всё

<...>
	RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_ADC1EN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_SYSCFGEN;
	SPI1->CR1 = SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE | SPI_CR1_MSTR;
	SPI1->CR2 = SPI_CR2_NSSP | SPI_CR2_SSOE | (7 << 8);	// 8 bit, NO DMA, SSE pin enable, output.
	SPI1->CR1 |= SPI_CR1_SPE;		// + Channel enabled.
<...>
Ответить

Вернуться в «ARM»