User manual
135 136
// x,y
// dabei row col organisation
// 132 x 64 pixel dabei 8 pixel in y-richtung mit 0 beginnend auf einem byte
// x horizontal y vertikal
// 64 x 48 pixel !!
//
void disp_setpixel(int x, int y, unsigned short col1) {
// COL =0 dunke =1hell
// 1 pixel setzen (little endian)
// col1 =0 hell =1 dunkel
// Tabelle 8 bytes per zeile
// eintrag 0 ist rechte pixelgruppe
// y=0 ist unten links aber physicalisch von oben nach unten (row 7 bit 7 -> y=0)
unsigned char *dest; // zielpointer lcdbuffer
int yoff = 0;
int ymod = 0;
if (x < 0) return; // CLIP
if (x >= LCDWIDTH) return; // CLIP
if (y < 0) return;
if (y >= LCDHEIGHT) return;
#ifdef XXXX
// SPEZIELL x-achse 0..63 aber y-achse abh von gerade oder ungerader zeile
if ((y & 1) == 0) {
// Gerade zeilen
ymod = y & 0x7; // bitposition 0..7
yoff = y >> 3; // offset der rows zeilen 0..7 (y>0 !!) bit 0..2 weg
} else {
// ungerade zeilen
}
#endif
// berechnen row col und byte pos.
// y = 63 - y; // damit y=0 gedreht y=0 link oben !!
ymod = y & 0x7; // bitposition 0..7
yoff = y >> 3; // offset der rows zeilen 0..7 (y>0 !!) bit 0..2 weg
dest = &lcdbuffer[yoff * LCDWIDTH + x]; // DAMIT Byte deniert
// nun bit 0..7 moeglichs efzienz austauschen
if (col1 == 0) { // bit loeschen
*dest &= ~(1<<ymod);
} else { // bit setzen
*dest |= (1<<ymod);
}
//
}
unsigned short disp_setchar(int x, int y, unsigned char chidx1, unsigned short color)
{ // breite als ergebnis fuer propschrift
unsigned char chidx;
chidx = chidx1;
if (chidx <= 0x20) chidx = 0x20;
chidx -= 0x20; // erster index
unsigned short w = pgm_read_word_near(fontArial14h_width_tablep+chidx);
unsigned long offset = pgm_read_word_near(fontArial14h_offset_tablep+chidx);
int maxh = 14; // anzahl der zeilen
int i = 0, v1 = 0, v2 = 0;
int b1;
//
// breite <= 8 pixel dann ein byte >=8 dann zwei bytes (max width = 16 pixel)
if (w <= 8) { // 1 byte max
for (i = 0; i<14; i++) { // alle zeilen abarbeiten
v1 = pgm_read_byte_near(fontArial14h_data_tablep+offset + i); // 1 byte pro font
durchlaufen
// alle bits durchlaufen
for (b1 = 0; b1<w; b1++) {
if (v1 & (1 << (7 - b1))) { // big endian bits
disp_setpixel(x + b1, y + i, color);
}
} // alle bits durchlaufen
}
} else { // 2 byte zeichen
for (i = 0; i<14; i++) { // alle zeilen abarbeiten
v1 = pgm_read_byte_near(fontArial14h_data_tablep+offset + i * 2); // 1 byte pro
font durchlaufen
v2 = pgm_read_byte_near(fontArial14h_data_tablep+offset + i * 2 + 1); // 1 byte
pro font durchlaufen
// alle bits durchlaufen
for (b1 = 0; b1<8; b1++) { // erste haelfte rst
if (v1 & (1 << (7 - b1))) { // big endian bits
disp_setpixel(x + b1, y + i, color);
}
} // alle bits durchlaufen
for (b1 = 0; b1<w; b1++) { // restl bits
if (v2 & (1 << (7 - b1))) { // big endian bits
disp_setpixel(x + 8 + b1, y + i, color);
}
} // alle bits durchlaufen
}
}
return(w);
}
int disp_print_xy_lcd(int x, int y, unsigned char *text, unsigned short color, int
chset) { // 0=14 1=27
int x1;
x1 = x;
if (text == 0) return(x);
while (*text != 0) {
x1 = x1 + disp_setchar(x1, y, *text++, color);
}










