Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Все верно. Я думал чтобы ни писать одно и тоже условие выбора написать его один раз а в цикле switch просто определять переменную в соответствии с выбранным массивом, что и написал ниже. Но вот никак не получается присвоить переменной правильный адрес массива.

extern const uint8_t* const Font_16_array[]PROGMEM;
extern const uint8_t* const Font_32_var []PROGMEM;
void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size)
{	uint16_t h=size*8;
	uint8_t Width=0;
 определяем переменную adress

	while (*str)
	{	
		switch(size)
		{
			case 1: return;
			case 2: adress= /* здесь выбрать массив указателей Font_16_array*/		break;
			case 4: adress =/* здесь выбрать массив указателей Font_32_var*/		break;
		}
		if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word( adress/* здесь подставить выбранный массив*/[(uint8_t)*str-97]));}
					else	  { Width=pgm_read_byte(pgm_read_word(adress/* здесь подставить выбранный массив*/[(uint8_t)*str-32]));}
	
		if ((x+Width)>X_SIZE)//следим за окончанием строки
		{
			x = 0;
			y = y + h;
		}
		RM68140_Print_char(x,y,color,fon,*str,size,Width);
		x += Width;
		str++;
	}
}

Ну как то так.

Изменено пользователем Demonrostov
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

11 минуту назад, Demonrostov сказал:

определяем переменную adress

11 минуту назад, Demonrostov сказал:

pgm_read_word( adress

Ну так посмотреть что за тип принимает функция можно же :) и объявите свою переменную точно так.

43 минуты назад, Demonrostov сказал:

pgm_read_word(&Font_16_array[(uint8_t)*str-97])

и видимо присваивайте так

adddress = &Font_16_array[(uint8_t)*str-97];

 

ну то етсь ка кто так думаю 

uint8_t** address;

 

 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@DrobyshevAlex , в его случае не получится. Ибо принимается строка по указателю, который каждый символ модифицируется.
Вообще, подход в корень неверный. Чтение из таблицы нужно осуществлять в методе отрисовки символа. Тогда весь код вывода строки сведётся к простому циклу, перебирающему символы.

Ссылка на комментарий
Поделиться на другие сайты

10 минут назад, Alex сказал:

в его случае не получится.

 

16 минут назад, DrobyshevAlex сказал:

adddress = &Font_16_array[(uint8_t)*str-97];

компилятор ругается.

10 минут назад, Alex сказал:

Тогда весь код вывода строки сведётся к простому циклу, перебирающему символы.

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

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

Изменено пользователем Demonrostov
Ссылка на комментарий
Поделиться на другие сайты

@Demonrostov , сделайте чтение таблицы в функции вывода символа. Тогда вывод строки будет выглядеть только перебором всех символов по указателю и отправкой каждого в функцию вывода символа, без всякх чтений таблиц, кейсов, и прочей лабуды.

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Alex сказал:

@Demonrostov , сделайте чтение таблицы в функции вывода символа. Тогда вывод строки будет выглядеть только перебором всех символов по указателю и отправкой каждого в функцию вывода символа, без всякх чтений таблиц, кейсов, и прочей лабуды.

Все сделано вот так. Как по мне так даже универсально, любой шрифт с высотой кратной 8 пикселям выводит.

void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size)
{	uint16_t h=size*8;
	uint8_t Width=0;
	
	while (*str)
	{	
		switch(size)
		{
			case 1: return;
			case 2: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-97]));}
					else				  { Width=pgm_read_byte(pgm_read_word(&Font_16_array[(uint8_t)*str-32]));}		break;
			case 4: if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-97]));}
					else				  { Width=pgm_read_byte(pgm_read_word(&Font_32_var[(uint8_t)*str-32]));}		break;
		}
	
			if ((x+Width)>X_SIZE)//следим за окончанием строки
		{
			x = 0;
			y = y + h;
		}
		RM68140_Print_char(x,y,color,fon,*str,size,Width);
		x += Width;
		str++;
	}
}
void RM68140_Print_char (uint16_t x,uint16_t y, uint16_t color, uint16_t fon, uint8_t charcode,uint8_t size,uint8_t Width)
{
	uint8_t  n,n1,n2,n3;
	
	Address_set(x,y,Width+x-1,y+size*8-1);
	
	for ( n=0; n<size;n++)
	{	n3=n*Width;
		for( n1=0;n1<Width;n1++)
		{
			switch(size)
			{
				case 1:return;
				case 2:if(charcode>=192){ mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_16_array[charcode-97])+1+n1+n3);}
						else			{ mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_16_array[charcode-32])+1+n1+n3);}break;
				case 4:if(charcode>=192){ mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_32_var[charcode-97])+1+n1+n3);}
						else			{ mass[n1][n]=pgm_read_byte(pgm_read_word(&Font_32_var[charcode-32])+1+n1+n3);}break;
						
			}
			
		}
	}
	CS_LOW;
	Lcd_Write_Com(Memory_Write);
for ( n2=0;n2<size;n2++)
{
	for ( n=0;n<8;n++)
	{
		for( n1=0;n1<Width;n1++)
		{	
			if ((mass[n1][n2]<<n)&0b10000000)
			{
			Lcd_Write_Data(color >> 8);
			Lcd_Write_Data(color & 0xFF);
			}
			else
			{
			Lcd_Write_Data(fon >> 8);
			Lcd_Write_Data(fon & 0xFF);
			}
		}
	}
}
	CS_HIGH;
}

 

14 минуты назад, DrobyshevAlex сказал:

не совсем понял почему нельзя как то так


const uint8_t* const address[];

...
case :
	address = Font16;
case :
	address = Font32;

 

Создаем неизменяемый  массив и пытаемся в него записать? правильно я понимаю....?

Ссылка на комментарий
Поделиться на другие сайты

Только что, Alex сказал:

Дак у Вас уже в Print_char есть чтение таблицы. Зачем Вы ещё и в String делаете тоже самое ?

В String я читаю ширину и определяю положение символа чтобы влезло в поле экрана, Print_char вывод самого символа. В массиве символа первый байт его ширина, дальше данные самого символа. Шрифт с переменной шириной.

Ссылка на комментарий
Поделиться на другие сайты

#include <stdio.h>

const char* const arr1[2] = { "a", "b" };
const char* const arr2[2] = { "c", "d" };

void p(char v) {
    printf("%i\n", v);
}

int main(void) {
    char* ptr;
    
    p(&arr1[0]);
    ptr = arr1;
    p(&ptr[0]);
    
    p(&arr2[0]);
    ptr = arr2;
    p(&ptr[0]);
    
    return 0;
}

даже тест набросал

вывод 

32
32
48
48

то есть одинаковый адрес он выводит. так что должно работать

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, DrobyshevAlex сказал:

#include <stdio.h>

const char* const arr1[2] = { "a", "b" };
const char* const arr2[2] = { "c", "d" };

void p(char v) {
    printf("%i\n", v);
}

int main(void) {
    char* ptr;
    
    p(&arr1[0]);
    ptr = arr1;
    p(&ptr[0]);
    
    p(&arr2[0]);
    ptr = arr2;
    p(&ptr[0]);
    
    return 0;
}

даже тест набрсоал

вывод 


32
32
48
48

то есть одинаковый адрес он выводит. так что должно работать

В AVRStudio 6 не канает(

Ну так и не сказали как это реализовать и нужно ли вообще.

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, Demonrostov сказал:

В AVRStudio 6 не канает(

покажите ошибку которую пишет студия

extern const uint8_t* const Font_16_array[]PROGMEM;
extern const uint8_t* const Font_32_var []PROGMEM;
void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size)
{	uint16_t h=size*8;
	uint8_t Width=0;
	const uint8_t* const tmp;

	while (*str)
	{	
		switch(size)
		{
			case 1: return;
			case 2: tmp = Font_16_array;		break;
			case 4: tmp = Font_32_var;		break;
		}
		if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&tmp[(uint8_t)*str-97]));}
					else	  { Width=pgm_read_byte(pgm_read_word(&tmp[(uint8_t)*str-32]));}
	
		if ((x+Width)>X_SIZE)//следим за окончанием строки
		{
			x = 0;
			y = y + h;
		}
		RM68140_Print_char(x,y,color,fon,*str,size,Width);
		x += Width;
		str++;
	}
}

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, DrobyshevAlex сказал:

const uint8_t* const Font_16_array[]

У Вас Font_16_array это массив указателей на unsigned char.

По сути Font_16_array ссылается на начало массива.

const uint8_t** tmp;

то вы можете присвоить этой переменной как раз указатель на свой массив.

как то так

tmp = &Font_16_array;

Ну и юзать тогда pgm_read_word(&tmp[...

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, DrobyshevAlex сказал:

tmp = &Font_16_array;

Warning    1    assignment from incompatible pointer type [enabled by default]    
 

Изменено пользователем Demonrostov
Ссылка на комментарий
Поделиться на другие сайты

16 минут назад, Demonrostov сказал:

tmp = &Font_16_array;

ой, тут по идеи без & :)

а так это варининг говорящий о том что ти был [] а стал * по сути то же самое

 

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, DrobyshevAlex сказал:

ой, тут по идеи без &

Warning    1    assignment discards 'const' qualifier from pointer target type [enabled by default]   

Еще есть варианты:)

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, Demonrostov сказал:

Еще есть варианты

оно что не работает?)

 

3 минуты назад, Demonrostov сказал:

Еще есть варианты

const uint8_t* const* tmp;

...

tmp = &Font[0];

а так?)

Ссылка на комментарий
Поделиться на другие сайты

ну и что на скрине?) два примечания, которые не влияют на работу, а первое говорит о том что вы переменную не юзаете вообще)

 

extern const uint8_t* const Font_16_array[]PROGMEM;
extern const uint8_t* const Font_32_var []PROGMEM;
void TFT_String(uint16_t x, uint16_t y, uint16_t color, uint16_t fon,char *str, uint8_t size)
{	uint16_t h=size*8;
	uint8_t Width=0;
	const uint8_t* const* tmp;
    
	
	while (*str)
	{	
		switch(size)
		{
			case 1: return;
			case 2: tmp = &Font_16_array[0];		break;
			case 4: tmp = &Font_32_var[0]; break;
		}

		if((uint8_t)*str>=192){ Width=pgm_read_byte(pgm_read_word(&tmp[(uint8_t)*str-97]));}
					else				  { Width=pgm_read_byte(pgm_read_word(&tmp[(uint8_t)*str-32]));}
		
	
		if ((x+Width)>X_SIZE)//следим за окончанием строки
		{
			x = 0;
			y = y + h;
		}
		RM68140_Print_char(x,y,color,fon,*str,size,Width);
		x += Width;
		str++;
	}
}

как то так думаю должно быть

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, DrobyshevAlex сказал:

первое говорит о том что вы переменную не юзаете вообще

я в курсе. написал вам варнинг но вы наверно не поверили я прислал скрин. Таким образом вы предлагаете забить на варнинг?

Ссылка на комментарий
Поделиться на другие сайты

Только что, Demonrostov сказал:

Таким образом вы предлагаете забить на варнинг?

ну я б забил) а так дело ваше)

кстати у ласт варианта такой же варнинг?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...