AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
30.03.2024, 22:50
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
AJScorp, AJScorp, Ну простите, у меня опыт обучения дай бог месяц в общей сложности по мере возможности. По этому делаю как могу, про магические числа понимаю) но с отальным беда.Я буквально коснулся этих дисплеев на днях. Все таки не яснов чем причина в обоих случаях битмапы имеют вертикальную укладку. Но с отображением беда(не пойму почему. просто шрифт 8х16 маловат(, я изменил функцию для увеличения шрифта на указанный множитель, но не смог ее заставить работь с числами двойной точности.
|
|
|
|
01.04.2024, 13:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,549
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Понятно, что опыта маловато. Но тут Вы пытаетесь методом тыка подобрать нужную комбинацию, это так не работает.
По коду, можно, например, задавать моноширинный шрифт не массивом, а структурой, тогда вся магия убирается в объявление шрифта.
Нажмите, чтобы открыть спойлер
PHP код:
|
typedef struct
{
uint8_t SizeX;
uint8_t SizeY;
uint8_t BytesPerChar;
uint8_t Data[];
} TFONT, *pFONT;
static TFONT const AsciiLib =
{
17, 24, 51,
{
// '0'
0xF8, 0xFE, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0xFE, 0xF8, 0x00,
0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00,
0x07, 0x1F, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x1F, 0x07, 0x00,
// '1'
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00
//...
}
};
|
По выводу на дисплей...
Пишете, что в шрифте биты расположены вертикально, а выбираете на вывод совершенно невообразимым образом. Всё намного проще.
Нажмите, чтобы открыть спойлер
PHP код:
|
void PutChar(uint16_t Xpos, uint16_t Ypos, uint8_t ASCI, uint16_t charColor, uint16_t bkColor)
{
uint8_t cx, cy, mask;
ASCI -= '0';
LCD_WriteReg(0x210, Xpos); // x start point
LCD_WriteReg(0x212, Ypos); // y start point
LCD_WriteReg(0x211, Xpos + AsciiLib.SizeX - 1); // x end point
LCD_WriteReg(0x213, Ypos + AsciiLib.SizeY - 1); // y end point
LCD_WriteReg(0x200, Xpos); // RAM X address
LCD_WriteReg(0x201, Ypos); // RAM Y address
LCD_WriteIndex(0x202); // RAM Write index
for(cy = 0; cy ‹ AsciiLib.SizeY; cy++)
{
uint8_t *pCharArrey;
if (!(cy & 0x07))
{
mask = 0x01;
pCharArrey = &AsciiLib.Data[AsciiLib.BytesPerChar * ASCI +
AsciiLib.SizeX * (cy ›› 3)];
}
for(cx = 0; cx ‹ AsciiLib.SizeX; cx++)
LCD_WriteData((pCharArrey[cx] & mask) ? charColor : bkColor);
mask ‹‹= 1;
}
}
|
|
|
|
|
02.04.2024, 06:44
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Сообщение от Devil Byte
|
Но получаю мусор на экране(как будто он гигантские пиксели рисует ...
void GUI_Text(uint16_t Xpos, uint16_t Ypos, uint8_t *str, uint16_t Color, uint16_t bkColor, uint8_t fontSize)
{
uint8_t TempChar;
uint16_t charWidth = 17 * fontSize; // Calculate the width of a character
uint16_t charHeight = 24 * fontSize; // Calculate the height of a character
|
Размер шрифта - 17х24 пикселя, а вы еще и умножаете на какую-то переменную, а потом думаете, откуда эти "гигантские пиксели".
Я ж говорю - осваивайте сам язык и его инструменты на простых примерах и вникайте в то, что делаете. Иначе вы ничего не поймете в более сложных задачах, таких как графика.
Последний раз редактировалось NewWriter; 02.04.2024 в 06:55.
|
|
|
|
02.04.2024, 09:26
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
NewWriter, если ставить единичку, то умножение не происходит...
|
|
|
|
02.04.2024, 09:36
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 821 раз(а) в 385 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Происходит умножение на единицу
|
|
|
|
02.04.2024, 20:54
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Ну я ж показывал, как в битах и байтах выглядит массив шрифта. Есть несколько вариантов расположения байтов и порядка их обхода: - Вертикальная ориентация байтов:
- обход по горизонтали слева направо
- обход по вертикали сверху вниз
- Горизонтальная ориентация байтов:
- обход по горизонтали слева направо
- обход по вертикали сверху вниз
И еще каждый из этих вариантов имеет два вида по порядку расположения битов в байте - младшим битом вначале (LSB) или старшим битом вначале (MSB), итого 8 вариантов представления. И массив для разных вариантов будет выглядеть по-разному. На практике используется один из вариантов.
Ниже на картинках показываю два варианта: вертикальная ориентация байтов, обход по горизонтали (1) и обход по вертикали (2). Порядок следования байтов будет разный. Причем, показал усложенный вариант, когда размер шрифта по вертикали не кратен 8, то есть, часть битов из полного байта не используется. Соответственно, этот факт будет влиять на построение программного цикла.
Вот вам задание для подумать: что такое остаток от деления на 8 (операция записывается как d = y % 8), каким свойством он обладает, как и для чего его применять в условном операторе if(y % 8 ) { }. Подсказка: остаток от деления на 8 не равен 0 только тогда, когда число y кратно 8, а значит условие if(y%8 ) { } будет выполняться только тогда, когда число y не кратно 8, то есть, когда остаток от деления не равен 0. И это условие можно применить для добавления одного байта в счетчике байтов. Ну это тогда, когда пишется универсальная функция под любой размер шрифта.
В общем, я разъяснил и показал, как всё это выглядит, а ваша задача - выразить это теперь в программном виде.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:55.
|
|