Håller för första gången i mitt liv på med en grafisk färg-LCD vilken jag fått igång och kan göra lite enkla grejer på (har gjort funktioner för att fylla hela displayen med någon färg, rita räta linjer och rutor) men ska nu börja göra något mer användbart, till att börja med några ikoner samt en teckenuppsättning.
Då kommer ju frågan, hur gör ni för att skapa dessa saker?
Någon som har tips på något lämpligt program för att rita i eller liknande och som kanske till och med spottar ur sig kod av något slag? Eller hårdkodar ni helt enkelt allt för hand?
Hittade Microchip Graphics Display Designer men den verkar ju begränsa till deras processorer, medan jag kör en STM32F103 (ARM Cortex M3).
Displayen är 320x240 pixlar med ST7781-kontroller.
Skapa grafik till grafisk LCD?
- Klas-Kenny
- Inlägg: 11839
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Skapa grafik till grafisk LCD?
Om du ska ha skalbara teckensnitt bör du adaptera TTF-sättet: alla tecken är grafisk beskrivit som kurvor, streck och fyllnad. Blir ganska mycket jobb men sedan kan du göra vad du vill.
Men oftast är det ju frågan om att du vill placera tecken av fasta storlekar, möjligen fler olika storlekar men likaväl fasta. Då kan man göra en tabell. Jag har gjort såhär: (lite avkortat)
Jag valde att göra på detta sätt, dels för enklare överblick och dels för att enkelt kunde ersätta definitionerna i ett senare skede, något som har visat sig vara nödvändigt.
Detta ger mig tillgång till de bitmönster som skapar dessa tecken, dom kan jag sedan placera som "sprites" på den grafiska yta med önskat färg om det är en flerfärgskärm. Nu är detta bara en 5*8 matris, man kan såklart enkelt expandera storleken om tecknen är för små men det blir en del pilljobb. Ett "enkelt" sätt kan vara att skriva ut tecknen i ett ritprogram utan vektorer. Når man får tecknen till rätt storlek kan man enkelt se vilka punkter som ska vara på och vilka som ska vara av. Vill man skriva ut med "EXOR"-funktionalitet är det ju fritt fram, precis som andra effekter.
Man kan även skriva ut med olika storlekar och typsnitt om man vill det, det blir ju en del pilljobb till att börja med men när det är avklarat har man såklart dessa värden/tabeller i separata filer till andra framtida projekt.
Min tabell definierar enbart tecknen, inte avståndet mellan dom. Det avstånd är i vissa projekt fast definierat och i andra variabelt. Likaså är alla tecken inritat proportionellt, vill jag ha fast teckenbredd kan jag helt enkelt centrera tecknet om jag vill, något som jag redan har rutiner för.
Men oftast är det ju frågan om att du vill placera tecken av fasta storlekar, möjligen fler olika storlekar men likaväl fasta. Då kan man göra en tabell. Jag har gjort såhär: (lite avkortat)
Kod: Markera allt
typedef struct
{
unsigned char Length;
unsigned char Data[5];
} T_CHARDEF_05x08;
#define Pattern_032 {2, 0x00, 0x00, 0x00, 0x00, 0x00} /* ASCII 0032 ' ' */
#define Pattern_033 {1, 0x7D, 0x00, 0x00, 0x00, 0x00} /* ASCII 0033 '!' */
#define Pattern_034 {3, 0x30, 0x00, 0x30, 0x00, 0x00} /* ASCII 0034 '"' */
#define Pattern_035 {5, 0x14, 0x3E, 0x14, 0x3E, 0x14} /* ASCII 0035 '#' */
#define Pattern_036 {5, 0x12, 0x2A, 0x7F, 0x2A, 0x24} /* ASCII 0036 '$' */
#define Pattern_037 {5, 0x22, 0x04, 0x08, 0x10, 0x22} /* ASCII 0037 '%' */
#define Pattern_038 {5, 0x36, 0x49, 0x35, 0x02, 0x05} /* ASCII 0038 '&' */
#define Pattern_039 {1, 0x60, 0x00, 0x00, 0x00, 0x00} /* ASCII 0039 ''' */
#define Pattern_040 {3, 0x1C, 0x22, 0x41, 0x00, 0x00} /* ASCII 0040 '(' */
#define Pattern_041 {3, 0x41, 0x22, 0x1C, 0x00, 0x00} /* ASCII 0041 ')' */
#define Pattern_042 {5, 0x2A, 0x1C, 0x08, 0x1C, 0x2A} /* ASCII 0042 '*' */
#define Pattern_043 {5, 0x08, 0x08, 0x3E, 0x08, 0x08} /* ASCII 0043 '+' */
#define Pattern_044 {2, 0x01, 0x02, 0x00, 0x00, 0x00} /* ASCII 0044 ',' */
#define Pattern_045 {3, 0x08, 0x08, 0x08, 0x08, 0x08} /* ASCII 0045 '-' */
#define Pattern_046 {1, 0x01, 0x00, 0x00, 0x00, 0x00} /* ASCII 0046 '.' */
#define Pattern_047 {5, 0x02, 0x04, 0x08, 0x10, 0x20} /* ASCII 0047 '/' */
#define Pattern_048 {5, 0x3E, 0x41, 0x41, 0x41, 0x3E} /* ASCII 0048 '0' */
#define Pattern_049 {3, 0x21, 0x7F, 0x01, 0x00, 0x00} /* ASCII 0049 '1' */
#define Pattern_050 {5, 0x21, 0x43, 0x45, 0x49, 0x31} /* ASCII 0050 '2' */
#define Pattern_051 {5, 0x22, 0x41, 0x49, 0x49, 0x36} /* ASCII 0051 '3' */
#define Pattern_052 {5, 0x0C, 0x14, 0x24, 0x7F, 0x04} /* ASCII 0052 '4' */
#define Pattern_053 {5, 0x72, 0x51, 0x51, 0x51, 0x4E} /* ASCII 0053 '5' */
#define Pattern_054 {5, 0x1E, 0x29, 0x49, 0x49, 0x06} /* ASCII 0054 '6' */
#define Pattern_055 {5, 0x40, 0x47, 0x48, 0x50, 0x60} /* ASCII 0055 '7' */
#define Pattern_056 {5, 0x36, 0x49, 0x49, 0x49, 0x36} /* ASCII 0056 '8' */
#define Pattern_057 {5, 0x30, 0x49, 0x49, 0x4A, 0x3C} /* ASCII 0057 '9' */
#define Pattern_058 {1, 0x12, 0x00, 0x00, 0x00, 0x00} /* ASCII 0058 ':' */
#define Pattern_059 {2, 0x01, 0x12, 0x00, 0x00, 0x00} /* ASCII 0059 ';' */
#define Pattern_060 {3, 0x08, 0x14, 0x22, 0x00, 0x00} /* ASCII 0060 '<' */
#define Pattern_061 {5, 0x14, 0x14, 0x14, 0x14, 0x14} /* ASCII 0061 '=' */
#define Pattern_062 {3, 0x22, 0x14, 0x08, 0x00, 0x00} /* ASCII 0062 '>' */
#define Pattern_063 {5, 0x20, 0x40, 0x45, 0x48, 0x30} /* ASCII 0063 '?' */
#define Pattern_064 {5, 0x3E, 0x41, 0x5D, 0x55, 0x3D} /* ASCII 0064 '@' */
#define Pattern_065 {5, 0x3F, 0x48, 0x48, 0x48, 0x3F} /* ASCII 0065 'A' */
#define Pattern_066 {5, 0x7F, 0x49, 0x49, 0x49, 0x36} /* ASCII 0066 'B' */
#define Pattern_067 {5, 0x3E, 0x41, 0x41, 0x41, 0x22} /* ASCII 0067 'C' */
... går från Pattern_000 till Pattern_255
const T_CHARDEF_05x08 Char_Tabel_05x08[] = {
Pattern_000,
Pattern_001,
Pattern_002,
Pattern_003,
Pattern_004,
Pattern_005,
Pattern_006,
Pattern_007,
Pattern_008,
Pattern_009,
Pattern_010,
Pattern_011,
Pattern_012,
Pattern_013,
Pattern_014,
Pattern_015,
Pattern_016,
Pattern_017,
Pattern_018,
Pattern_019,
Pattern_020,
Pattern_021,
Pattern_022,
Pattern_023,
Pattern_024,
Pattern_025,
Pattern_026,
Pattern_027,
Pattern_028,
Pattern_029,
Pattern_030,
Pattern_031,
Pattern_032, /* ASCII 0032 ' ' */
Pattern_033, /* ASCII 0033 '!' */
Pattern_034, /* ASCII 0034 '"' */
Pattern_035, /* ASCII 0035 '#' */
Pattern_036, /* ASCII 0036 '$' */
Pattern_037, /* ASCII 0037 '%' */
Pattern_038, /* ASCII 0038 '&' */
Pattern_039, /* ASCII 0039 ''' */
Pattern_040, /* ASCII 0040 '(' */
Pattern_041, /* ASCII 0041 ')' */
Pattern_042, /* ASCII 0042 '*' */
Pattern_043, /* ASCII 0043 '+' */
Pattern_044, /* ASCII 0044 ',' */
Pattern_045, /* ASCII 0045 '-' */
Pattern_046, /* ASCII 0046 '.' */
Pattern_047, /* ASCII 0047 '/' */
Pattern_048, /* ASCII 0048 '0' */
Pattern_049, /* ASCII 0049 '1' */
Pattern_050, /* ASCII 0050 '2' */
Pattern_051, /* ASCII 0051 '3' */
Pattern_052, /* ASCII 0052 '4' */
Pattern_053, /* ASCII 0053 '5' */
Pattern_054, /* ASCII 0054 '6' */
Pattern_055, /* ASCII 0055 '7' */
Pattern_056, /* ASCII 0056 '8' */
Pattern_057, /* ASCII 0057 '9' */
Pattern_058, /* ASCII 0058 ':' */
Pattern_059, /* ASCII 0059 ';' */
Pattern_060, /* ASCII 0060 '<' */
Pattern_061, /* ASCII 0061 '=' */
Pattern_062, /* ASCII 0062 '>' */
Pattern_063, /* ASCII 0063 '?' */
Pattern_064, /* ASCII 0064 '@' */
Pattern_065, /* ASCII 0065 'A' */
Pattern_066, /* ASCII 0066 'B' */
Pattern_067, /* ASCII 0067 'C' */
Pattern_068, /* ASCII 0068 'D' */
Pattern_069, /* ASCII 0069 'E' */
Pattern_070, /* ASCII 0070 'F' */
Pattern_071, /* ASCII 0071 'G' */
Pattern_072, /* ASCII 0072 'H' */
Pattern_073, /* ASCII 0073 'I' */
... går vidare till Pattern_255
Detta ger mig tillgång till de bitmönster som skapar dessa tecken, dom kan jag sedan placera som "sprites" på den grafiska yta med önskat färg om det är en flerfärgskärm. Nu är detta bara en 5*8 matris, man kan såklart enkelt expandera storleken om tecknen är för små men det blir en del pilljobb. Ett "enkelt" sätt kan vara att skriva ut tecknen i ett ritprogram utan vektorer. Når man får tecknen till rätt storlek kan man enkelt se vilka punkter som ska vara på och vilka som ska vara av. Vill man skriva ut med "EXOR"-funktionalitet är det ju fritt fram, precis som andra effekter.
Man kan även skriva ut med olika storlekar och typsnitt om man vill det, det blir ju en del pilljobb till att börja med men när det är avklarat har man såklart dessa värden/tabeller i separata filer till andra framtida projekt.
Min tabell definierar enbart tecknen, inte avståndet mellan dom. Det avstånd är i vissa projekt fast definierat och i andra variabelt. Likaså är alla tecken inritat proportionellt, vill jag ha fast teckenbredd kan jag helt enkelt centrera tecknet om jag vill, något som jag redan har rutiner för.
- Klas-Kenny
- Inlägg: 11839
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Skapa grafik till grafisk LCD?
Tack för input, har nu fått igång en fullt fungerande text-funktion! 
Återstår bara att definiera resten av tecknena. Säg, du vill inte vara hygglig och dela med dig av resten utav teckenuppsättningen?
Kan absolut göra det själv, men det är ju rätt mycket jobb så det vore skönt att slippa..
Edit: Nu var det gjort i alla fall.
Men jag vill fortfarande ha tips på hur ni skriver kod till grafik som ikoner och liknande på bästa och effektivaste vis!

Återstår bara att definiera resten av tecknena. Säg, du vill inte vara hygglig och dela med dig av resten utav teckenuppsättningen?
Kan absolut göra det själv, men det är ju rätt mycket jobb så det vore skönt att slippa..
Edit: Nu var det gjort i alla fall.

Men jag vill fortfarande ha tips på hur ni skriver kod till grafik som ikoner och liknande på bästa och effektivaste vis!
Re: Skapa grafik till grafisk LCD?
Jag skapade en teckenuppsättning i paint som en bitmapp. Enkelt att skriva in tecken med textfunktionen i paint. I bitmappen kan man även lägga in övriga grafikikoner.
Sen flyttar man all grafik (flyttar på dom) så att man utnyttjar ritytan optimalt. Så bitmappen blev inte så stor.
Sen gjorde jag ett C-program som läste in bitmap filen och konverterade den till en C array bestående av unsigned char.
Sen skapade jag en teckentabell som pekar ut var i bitmappen (x, y) tecken ligger och hur stora dessa är.
Så textritarfunktionen slår upp tecken i den tabellen och kopierar in rätt bitmönster från bitmap arrayen till skärmbufferten.
På det sättet kan man ha olika stora tecken. Funkar fint
Sen flyttar man all grafik (flyttar på dom) så att man utnyttjar ritytan optimalt. Så bitmappen blev inte så stor.
Sen gjorde jag ett C-program som läste in bitmap filen och konverterade den till en C array bestående av unsigned char.
Sen skapade jag en teckentabell som pekar ut var i bitmappen (x, y) tecken ligger och hur stora dessa är.
Så textritarfunktionen slår upp tecken i den tabellen och kopierar in rätt bitmönster från bitmap arrayen till skärmbufferten.
På det sättet kan man ha olika stora tecken. Funkar fint

Re: Skapa grafik till grafisk LCD?
I GIMP kan man rita bilder och spara som C-källkod direkt.
Re: Skapa grafik till grafisk LCD?
Tyvärr hanterar inte Gimp grafik på bit-nivå. Den kan inte trycka ihop 8 svartvita pixlar i en byte.
Men det drabbar inte dig med färgdisplayen. Men Gimp är bra grejjer.
MVH: Mikael
Men det drabbar inte dig med färgdisplayen. Men Gimp är bra grejjer.
MVH: Mikael
Re: Skapa grafik till grafisk LCD?
Bitmap till C-kod kan man lätt fixa med lite Perl-kod. .PPM/.PNM/.BMP filer brukar vara enklast att hantera.