Небольшие доработки библиотеки UTFT
- Войдите на сайт для отправки комментариев
Для дисплеев с контроллерами 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() будет работать некорректно (если кто знает, в какой библиотеке ее найти - буду весьма благодарен).
Не научился я еще тут код вставлять :(
А в чем проблема с length? Если вы научились при печати выкидывать верхний байт utf - что мешает при вычислении длины строки делать так же?
Ну я не смог найти в какой библиотеке находится функция String.length() :(
Так напишите свою и пользуйтесь ей вместо стандартной
Я так и сделал, но мне такой подход не нравится. Зачем плодить лишние функции.
Менять функции чужих библиотек - подход еще худший, ибо нарушает переносимость и ломает схему обновления. Будете заново переписывать свою функцию на каждую новую версию??
А зачем мне переносимость и обновления ? :)
А зачем мне переносимость и обновления ? :)
а зачем вы тогда это сюда выложили, если это частное решение только для вашего проекта?
Возможно это решение пригодится кому-то в его частном проекте. Каждый сам решает, использовать его или нет.
А зачем рекомендовать пользователям безграмотное решение?
Во-первых я никому ничего не рекомендую.
Во-вторых почему Вы считаете, что оно безграмотное ?
Во-вторых почему Вы считаете, что оно безграмотное ?
Пошли по кругу?
Перечитайте сообщение №6.