Небольшие доработки библиотеки 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.