MirceaM Postat Ianuarie 10, 2008 Partajează Postat Ianuarie 10, 2008 Ma gandesc la afisarea de caractere pe lcd grafic Ampire 128x64. Am in program definit generatorul de caractere (uzual, inspirat de la lcd alfanumeric) de 5x7 si totul functioneaza. Se poate afisa orice caracter, in orice loc de pe ecran (lcd), cu orice marime (in fine, daca incape). Exista un parametru, un factor. Factor=1 provoaca afisarea de caractere 5x7 (1 bit de 1 provenit din array generator de caractere) provoaca afisarea a 1 pixel in ecran.Factor=2 provoaca afisarea de caractere de 10x14 ( 1 bit de 1 provenit...) provoaca afisarea unui patrat de 2x2 pixeli in ecran.Factor=3 provoaca afisarea de caractere de 15x21 ( 1 bit de 1 provenit...) provoaca afisarea unui patrat de 3x3 pixeli in ecran. Acest mod de afisare ramane valabil. Dar, pe masura ce factorul este mai mare caracterele apar coltoase si urate, ar putea fi afisate mai bine. Cum s-ar face (suplimentar, fara a renunta la stilul descris mai sus) sa avem caractere:- vectoriale, desenate din segmente- sa aiba parametru de marime separat pe x, separat pe y- sa aiba grosimea liniei controlata- sa fie posibil sa avem caractere cu marime variabila (de-a lungul directiei de scriere, ne gandim numai la directiile de la stanga la dreapta si de sus in jos)? De exemplu litera m sa ocupe un numar de pixeli insa litera i sa ocupe un numar mai mic de pixeli - hai sa numim asta font Arial. Deci vreau sa pot sa am fonturile Courier si Arial cu marime caracter (pe x si pe y), grosime caracter, orientare caracter variabile. O rutina de afisare cara ar primi parametri printre care in primul rand codul caracterului 20-7E ar trebui sa realizeze mai intai multiramificatia pe 95 de directii dar mai bine, mai eficient decat cu switch case. Se poate defini un array (vector) de pointeri la functii in CCS? Apoi trebuie create niste functii de genul Move, Draw, rMove (relativ Move), rDraw (relativ Draw) sau poate ca la plotter penUp, penDown si Move. Exista ceva facut sau asemanator? Link spre comentariu
sofian Postat Ianuarie 10, 2008 Partajează Postat Ianuarie 10, 2008 Desi nu am vazut nimic specificat ca programul este ptr PIC, eu personal nu am vazut asa cevasi eu as fi interesat ptr asa cevaEu am un lcd PLED care nu are nici un font este practic o matrice 128x64 Link spre comentariu
Vizitator Postat Ianuarie 10, 2008 Partajează Postat Ianuarie 10, 2008 Din descrierea ta este exact ce se cheama TTF (True Type Fonts). Sunt fonturi definite vectorial, nu matriceal.Daca te intereseaza cauta algoritmi de transformare si randare pentru curbe Bezier sau, mai direct, cauta "ttf render algorithms".Nu e tocmai simplu de implementat pe un microcontroller, dar nici imposibil. Link spre comentariu
CristianC Postat Ianuarie 14, 2008 Partajează Postat Ianuarie 14, 2008 Ai putea sa memorezi diverse fonturi in memoria program in format bitmap. Am atasat un fisier exemplu pt Arial 8. Link spre comentariu
MirceaM Postat Ianuarie 14, 2008 Autor Partajează Postat Ianuarie 14, 2008 Frumos. Si util, probabil. Dar una din cerinte este ca daca afisez A cu o anumita marime pe x si pe x si daca afiseza a doua oara tot A insa de 3 ori mai mare si pe x si pe y atunci in al doilea caz sa NU se afiseze patrat de 3x3 puncte negre in loc de 1 singur pixel negru. Deci ma refer la o alta descriere in acel array, alta decat a pune acolo biti de 1 din care sa fie alcatuit caracterul , de exemplu sa existe acolo, in descrierea "elementara" a caracterului, vectori, segmente de dreapta. De exemplu chestia asta: ..., 0x8024484F,0xFFFFFFFF, 0x7202744F,0xFFFFFFFF ); sa insemne descrierea caracterului A, cu semnificatia: 1. pen up (bit 3=1 in acel prim 8) si move 0, 7 0123401234567 *2. pen down (bit 3=0) si draw 0, 2 01234012 *3 *4 *5 *6 *7 *3. draw 2, 0 012340 *1 *2 *3 *4 *5 *6 *7 *4. draw 4, 2 012340 *1 * *2 * *3 *4 *5 *6 *7 *5. draw 4, 7 012340 *1 * *2 * *3 * *4 * *5 * *6 * *7 * *6. pen up si move 0, 4 012340 *1 * *2 * *3 * *4 * *5 * *6 * *7 * *7. draw 4,4 012340 *1 * *2 * *3 * *4 *****5 * *6 * *7 * *8. terminare x=0xF si y=0xF 012340 *1 * *2 * *3 * *4 *****5 * *6 * *7 * * Deci x si y sunt intre 0 si 7 (pe 3 biti). Bitul 7 este rezervat pentru pen up / pen down. x=0xF si y=0xF sunt rezervate pentru sesizare termninare desenare. Orice caracter se deseneaza intr-un dreptunghi ale carui coordonate (top, left) = (0,0) sunt cunoscute, sunt passate rutinei de desenare caracter. Sigur ca se mai paseaza si niste coeficienti de multiplicare kx si ky. Descriptorul pasat rutinei se refera la cazul kx=1 si ky=1. Desenarea unui caracter prin acest procedeu cu kx=1 si ky=1 produce absolut acelasi rezultat ca si desenarea clasica, cu rutina de desenare obisnuita (folosind font matricial de 5x7). Acum ne gandim ca daca vectorii pot fi obtinuti prin analiza chiar a generatotului clasic (matricial) ar fi excelent. In caz ca se solicita (prin apel, prin precizarea coeficientilor kx si ky) desenarea unui caracter mai mare, hai sa spunem ca mai sus de 3 ori mai mare pe ambele axe, NU se va intampla transformarea unui pixel in patrat de 3x3 pixeli, ceea ce rezolva cazul dorit. Este drept ca pe masura ce caracterul este mai mare ar fi bine sa rezolvam ceva si referitor la grosimea liniei, ceea ce este alta treaba. La asa ceva ma gandesc. Nu prea conteaza ca arata precum Courier sau precum Arial, asa cum le intelege vreun standard. Esentiala este chestiunea vectoriala. Link spre comentariu
Abram Burel Postat Ianuarie 14, 2008 Partajează Postat Ianuarie 14, 2008 Si asta nu e totul. Daca luati o "lupa" si o plimbati pe ecran, o sa vedeti ca ceea ce pare caracter "negru", in cazul in care caracterul e mai mare decat o matrice 5x7 la rezolutia monitorului, are in fapt destule tonuri de gri pe la... colturi. Asta da caracterului "rotunjime". Deci vectorial+rendering rezulta in ceva frumos in scrierea alfanumerica.Sa-i intrebam de exemplu pe cei de la MS Link spre comentariu
MirceaM Postat Ianuarie 14, 2008 Autor Partajează Postat Ianuarie 14, 2008 Nu putem face asa ceva cu pixeli avand doar 2 culori (alb si negru) si rezolutie atat de mica 128x64. Sa consideram caracterul D. Acestia sunt pixelii lui, atunci cand caracterul este afisat cu factor 1 (nici un fel de marire, nici pe x, nici pe y) factor 10 ****1 * *2 * *3 * *4 * *5 * *6 ****7factor 3 / Nerotunjit. 1 pixel devine patrat de 3x3 ( arata urat )0 ************0 ************0 ************1 *** ***1 *** ***1 *** ***2 *** ***2 *** ***2 *** ***3 *** ***3 *** ***3 *** ***4 *** ***4 *** ***4 *** ***5 *** ***5 *** ***6 ************6 ************6 ************777factor 3 / Rotunjit. arata mai bine la colturi. 0 ************0 *************0 **************1 *** ***1 *** ***1 *** ***2 *** ***2 *** ***2 *** ***3 *** ***3 *** ***3 *** ***4 *** ***4 *** ***4 *** ***5 *** ***5 *** ***6 **************6 *************6 ************777 Pe masura ce factorul este mai mai mare, stilul clasic de afisare produce caractere din ce in ce mai urate. Acest stil de afisare nu stie sa beneficieze de faptul ca are la dispozitie puncte mai multe. Dimpotriva, pe masura ce factorul este mai mare, noul stil de afisare, dupa rezolvare aspecte legate de grosime linie, (va) permite afisarea de caractere din ce in ce mai aratoase. Link spre comentariu
CristianC Postat Ianuarie 15, 2008 Partajează Postat Ianuarie 15, 2008 O sa fie destul de greu sa faci "procesare grafica" cu PIC. Cred ca cea mai simpla solutie pt aceasta problema este memorarea mai multor fonturi bitmap in memoria program (ARIAL6,ARIAL8,ARIAL10,ARIAL16,ARIAL20,ARIAL36,...) Link spre comentariu
Vizitator cd-i Postat Ianuarie 27, 2008 Partajează Postat Ianuarie 27, 2008 Poate ar fi mai simplu sa ai definite strict caracterele care le folosesti fiindca nu are rost sa iti faci tabele cu toate simbolurile ASCII. Si daca chiar nu iti incap in pic poti folosi un eeprom extern pe i2c in care sa le stochezi. Pe de alta parte din cauza rezolutiei limitate a lcd-urilor disponibile pe piata care sunt capabile sa afiseze 2 culori (nici macar tonuri de gri) font-urile tale, oricat de bine calculate, vor arata diferit de la un lcd la altul.Ce vrei tu sa faci este o chestie eleganta si facila din punctul de vedere al implementarii si utilizarii dar nu cred ca se preteaza foarte bine la microcontrolerele pic (seria 16 si 18) care nu exceleaza in putere de calcul si memorie, mai degraba o poti implementa pentru pic-urile de 16 si 32 de biti.Eu mi-am facut un "tool" cu care imi generez tabele din font-urile care am nevoie sa le afisez. Ii dau ca data de intrare caracterul, font-ul (ttf), dimensiunea si tipul (undelined, bold sau italic). Si desi se genereaza automat unele mai trebuie periate de mana ca sa arate bine pe lcd.Am atasat o poza de la proiectul la care lucrez acum. Pentru afisare mi-am definit doua tipuri de cifre si clasicul font de 5x7 pixeli cu literele alfabetului. Pentru ce am eu nevoie e mai mult decat suficient. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum