Небольшие доработки библиотеки UTFT

starcomputer
Offline
Зарегистрирован: 19.10.2021

Для дисплеев с контроллерами SSD1963 (в UTFT модель SSD1963_800_ALT):

Включение / выключение дисплея:

void UTFT::lcdOn()
{
cbi(P_CS, B_CS);
switch (display_model)
{
case PCF8833:
case SSD1963_800ALT:
LCD_Write_COM(0x29);
break;
case CPLD:
LCD_Write_COM_DATA(0x01,0x0010);
LCD_Write_COM(0x0F);   
break;
}
sbi(P_CS, B_CS);
}
void UTFT::lcdOff()
{
cbi(P_CS, B_CS);
switch (display_model)
{
case PCF8833:
case SSD1963_800ALT:
LCD_Write_COM(0x28);
break;
case CPLD:
LCD_Write_COM_DATA(0x01,0x0000);
LCD_Write_COM(0x0F);   
break;
}
sbi(P_CS, B_CS);
}

Управление яркостью (через PWM):

void UTFT::setBrightness(byte br) //br = 0..255
{
cbi(P_CS, B_CS);
switch (display_model)
{
case SSD1963_800ALT:
LCD_Write_COM(0xBE);  //команда конфигурирования ШИМ
LCD_Write_DATA(0x0E); //частота ШИМ = PLL clock / (256*data) / 256
LCD_Write_DATA(br);   //длительность цикла ШИМ = br(0..255)/256
LCD_Write_DATA(0x01); //ШИМ разрешен, внешнее управление
LCD_Write_DATA(0x00); //Set the brightness level - Dimmest
LCD_Write_DATA(0x00); //Set the minimum brightness level - Dimmest
LCD_Write_DATA(0x00); //Set the brightness prescaler - Dimmest
break;
case CPLD:
if (br>16) br=16;
LCD_Write_COM_DATA(0x01,br);
LCD_Write_COM(0x0F);   
break;
}
sbi(P_CS, B_CS);
}

Печать русского шрифта (без дополнительных процедур, можно печатать и смешанными шрифтами, просто убираем из вывода байты 0xD0, 0xD1, если они есть):

void UTFT::printChar(byte c, int x, int y)
{
	byte i,ch;
	word j;
	word temp; 
	if(c<0xD0){

		cbi(P_CS, B_CS);
  
		if (!_transparent)
		{
			if (orient==PORTRAIT)
			{
				setXY(x,y,x+cfont.x_size-1,y+cfont.y_size-1);
	  
				temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4;
				for(j=0;j<((cfont.x_size/8)*cfont.y_size);j++)
				{
					ch=pgm_read_byte(&cfont.font[temp]);
					for(i=0;i<8;i++)
					{   
						if((ch&(1<<(7-i)))!=0)   
						{
						setPixel((fch<<8)|fcl);
						} 
						else
						{
						setPixel((bch<<8)|bcl);
						}   
					}
				temp++;
				}
			}
			else
			{
				temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4;

				for(j=0;j<((cfont.x_size/8)*cfont.y_size);j+=(cfont.x_size/8))
				{
					setXY(x,y+(j/(cfont.x_size/8)),x+cfont.x_size-1,y+(j/(cfont.x_size/8)));
					for (int zz=(cfont.x_size/8)-1; zz>=0; zz--)
					{
						ch=pgm_read_byte(&cfont.font[temp+zz]);
						for(i=0;i<8;i++)
						{   
							if((ch&(1<<i))!=0)   
							{
								setPixel((fch<<8)|fcl);
							} 
							else
							{
							setPixel((bch<<8)|bcl);
							}   
						}
					}
				temp+=(cfont.x_size/8);
				}
			}
		}
		else
		{
			temp=((c-cfont.offset)*((cfont.x_size/8)*cfont.y_size))+4;
			for(j=0;j<cfont.y_size;j++) 
			{
				for (int zz=0; zz<(cfont.x_size/8); zz++)
				{
					ch=pgm_read_byte(&cfont.font[temp+zz]); 
					for(i=0;i<8;i++)
					{   
				
						if((ch&(1<<(7-i)))!=0)   
						{
							setXY(x+i+(zz*8),y+j,x+i+(zz*8)+1,y+j+1);
							setPixel((fch<<8)|fcl);
						} 
					}
				}
				temp+=(cfont.x_size/8);
			}
		}

		sbi(P_CS, B_CS);
		clrXY();
	}
}
void UTFT::print(char *st, int x, int y, int deg)
{
	int stl, i,k;
	// for russian text
	String s="";
	stl = strlen(st);
	for(i=0;i<stl;i++) if(st[i]<0xD0) s+=st[i];
	stl = s.length();

	if (orient==PORTRAIT)
	{
	if (x==RIGHT)
		x=(disp_x_size+1)-(stl*cfont.x_size);
	if (x==CENTER)
		x=((disp_x_size+1)-(stl*cfont.x_size))/2;
	}
	else
	{
	if (x==RIGHT)
		x=(disp_y_size+1)-(stl*cfont.x_size);
	if (x==CENTER)
		x=((disp_y_size+1)-(stl*cfont.x_size))/2;
	}

	for (i=0; i<stl; i++)
		if (deg==0)
			printChar(s[i]++, x + (i*(cfont.x_size)), y);
		else
			rotateChar(s[i]++, x, y, i, deg);
}

void UTFT::print(String st, int x, int y, int deg)
{
	String s;
	uint8_t i;
	for(i=0;i<st.length();i++) if(st[i]<0xD0) s+=st[i];
	char buf[s.length()+1];
	s.toCharArray(buf, s.length()+1);
	print(buf, x, y, deg);
}

Сам шрифт (англо-русский) делается так (на примере DefaultFonts.c):

После последнего английского символа "~", которая имеет код 0x7E, добавляем еще один (любой) символ, у него будет код 0x7F.

Далее идут русские буквы, в порядке "р"..."я" "А"..."Я" "а"..."п".

Младший байт кода у них будет соответствовать младшему байту кодировки UTF-8, старший уберется при выводе.

Конечно функция String.length() будет работать некорректно (если кто знает, в какой библиотеке ее найти - буду весьма благодарен).

starcomputer
Offline
Зарегистрирован: 19.10.2021

Не научился я еще тут код вставлять :(

b707
Offline
Зарегистрирован: 26.05.2017

А в чем проблема с length? Если вы научились при печати выкидывать верхний байт utf - что мешает при вычислении длины строки делать так же?

starcomputer
Offline
Зарегистрирован: 19.10.2021

Ну я не смог найти в какой библиотеке находится функция String.length() :(

b707
Offline
Зарегистрирован: 26.05.2017

Так напишите свою и пользуйтесь ей вместо стандартной

starcomputer
Offline
Зарегистрирован: 19.10.2021

Я так и сделал, но мне такой подход не нравится. Зачем плодить лишние функции.

b707
Offline
Зарегистрирован: 26.05.2017

Менять функции чужих библиотек - подход еще худший, ибо нарушает переносимость и ломает схему обновления. Будете заново переписывать свою функцию на каждую новую версию??

starcomputer
Offline
Зарегистрирован: 19.10.2021

А зачем мне переносимость и обновления ? :)

b707
Offline
Зарегистрирован: 26.05.2017

starcomputer пишет:

А зачем мне переносимость и обновления ? :)


а зачем вы тогда это сюда выложили, если это частное решение только для вашего проекта?

starcomputer
Offline
Зарегистрирован: 19.10.2021

Возможно это решение пригодится кому-то в его частном проекте. Каждый сам решает, использовать его или нет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А зачем рекомендовать пользователям безграмотное решение?

starcomputer
Offline
Зарегистрирован: 19.10.2021

Во-первых я никому ничего не рекомендую.

Во-вторых почему Вы считаете, что оно безграмотное ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

starcomputer пишет:

Во-вторых почему Вы считаете, что оно безграмотное ?

Пошли по кругу?

Перечитайте сообщение №6.