/* 5x7 ASCII Character Font */
const unsigned char GLCD_Font[95][5] = {
{0x00, 0x00, 0x00, 0x00, 0x00}, // 0x20 Space
{0x00, 0x00, 0x4F, 0x00, 0x00}, // 0x21 !
{0x00, 0x07, 0x00, 0x07, 0x00}, // 0x22 "
{0x14, 0x7F, 0x14, 0x7F, 0x14}, // 0x23 #
{0x24, 0x2A, 0x7F, 0x2A, 0x12}, // 0x24 $
{0x23, 0x13, 0x08, 0x64, 0x62}, // 0x25 %
{0x36, 0x49, 0x55, 0x22, 0x50}, // 0x26 &
{0x00, 0x05, 0x03, 0x00, 0x00}, // 0x27 '
{0x00, 0x1C, 0x22, 0x41, 0x00}, // 0x28 (
{0x00, 0x41, 0x22, 0x1C, 0x00}, // 0x29 )
{0x14, 0x08, 0x3E, 0x08, 0x14}, // 0x2A *
{0x08, 0x08, 0x3E, 0x08, 0x08}, // 0x2B +
{0x00, 0x50, 0x30, 0x00, 0x00}, // 0x2C ,
{0x08, 0x08, 0x08, 0x08, 0x08}, // 0x2D -
{0x00, 0x60, 0x60, 0x00, 0x00}, // 0x2E .
{0x20, 0x10, 0x08, 0x04, 0x02}, // 0x2F /
{0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0x30 0
{0x00, 0x42, 0x7F, 0x40, 0x00}, // 0x31 1
{0x42, 0x61, 0x51, 0x49, 0x46}, // 0x32 2
{0x21, 0x41, 0x45, 0x4B, 0x31}, // 0x33 3
{0x18, 0x14, 0x12, 0x7F, 0x10}, // 0x34 4
{0x27, 0x45, 0x45, 0x45, 0x39}, // 0x35 5
{0x3C, 0x4A, 0x49, 0x49, 0x30}, // 0x36 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // 0x37 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // 0x38 8
{0x06, 0x49, 0x49, 0x29, 0x1E}, // 0x39 9
{0x00, 0x36, 0x36, 0x00, 0x00}, // 0x3A :
{0x00, 0x56, 0x36, 0x00, 0x00}, // 0x3B ;
{0x08, 0x14, 0x22, 0x41, 0x00}, // 0x3C <
{0x14, 0x14, 0x14, 0x14, 0x14}, // 0x3D =
{0x00, 0x41, 0x22, 0x14, 0x08}, // 0x3E >
{0x02, 0x01, 0x51, 0x09, 0x06}, // 0x3F ?
{0x32, 0x49, 0x79, 0x41, 0x3E}, // 0x40 @
{0x7E, 0x11, 0x11, 0x11, 0x7E}, // 0x41 A
{0x7F, 0x49, 0x49, 0x49, 0x36}, // 0x42 B
{0x3E, 0x41, 0x41, 0x41, 0x22}, // 0x43 C
{0x7F, 0x41, 0x41, 0x22, 0x1C}, // 0x44 D
{0x7F, 0x49, 0x49, 0x49, 0x41}, // 0x45 E
{0x7F, 0x09, 0x09, 0x09, 0x01}, // 0x46 F
{0x3E, 0x41, 0x49, 0x49, 0x7A}, // 0x47 G
{0x7F, 0x08, 0x08, 0x08, 0x7F}, // 0x48 H
{0x00, 0x41, 0x7F, 0x41, 0x00}, // 0x49 I
{0x20, 0x40, 0x41, 0x3F, 0x01}, // 0x4A J
{0x7F, 0x08, 0x14, 0x22, 0x41}, // 0x4B K
{0x7F, 0x40, 0x40, 0x40, 0x40}, // 0x4C L
{0x7F, 0x02, 0x0C, 0x02, 0x7F}, // 0x4E M
{0x7F, 0x04, 0x08, 0x10, 0x7F}, // 0x4E N
{0x3E, 0x41, 0x41, 0x41, 0x3E}, // 0x4F O
{0x7F, 0x09, 0x09, 0x09, 0x06}, // 0x50 P
{0x3E, 0x41, 0x51, 0x21, 0x5E}, // 0x51 Q
{0x7F, 0x09, 0x19, 0x29, 0x46}, // 0x52 R
{0x26, 0x49, 0x49, 0x49, 0x32}, // 0x53 S
{0x01, 0x01, 0x7F, 0x01, 0x01}, // 0x54 T
{0x3F, 0x40, 0x40, 0x40, 0x3F}, // 0x55 U
{0x1F, 0x20, 0x40, 0x20, 0x1F}, // 0x56 V
{0x3F, 0x40, 0x38, 0x40, 0x3F}, // 0x57 W
{0x63, 0x14, 0x08, 0x14, 0x63}, // 0x58 X
{0x07, 0x08, 0x70, 0x08, 0x07}, // 0x59 Y
{0x61, 0x51, 0x49, 0x45, 0x43}, // 0x5A Z
{0x00, 0x7F, 0x41, 0x41, 0x00}, // 0x5B [
{0x02, 0x04, 0x08, 0x10, 0x20}, // 0x5C (\)
{0x00, 0x41, 0x41, 0x7F, 0x00}, // 0x5D ]
{0x04, 0x02, 0x01, 0x02, 0x04}, // 0x5E ^
{0x40, 0x40, 0x40, 0x40, 0x40}, // 0x5F _
{0x00, 0x01, 0x02, 0x04, 0x00}, // 0x60 `
{0x20, 0x54, 0x54, 0x54, 0x78}, // 0x61 a
{0x7F, 0x48, 0x44, 0x44, 0x38}, // 0x62 b
{0x38, 0x44, 0x44, 0x44, 0x20}, // 0x63 c
{0x38, 0x44, 0x44, 0x48, 0x7F}, // 0x64 d
{0x38, 0x54, 0x54, 0x54, 0x18}, // 0x65 e
{0x08, 0x7E, 0x09, 0x01, 0x02}, // 0x66 f
{0x0C, 0x52, 0x52, 0x52, 0x3E}, // 0x67 g
{0x7F, 0x08, 0x04, 0x04, 0x78}, // 0x68 h
{0x00, 0x04, 0x7D, 0x00, 0x00}, // 0x69 i
{0x20, 0x40, 0x44, 0x3D, 0x00}, // 0x6A j
{0x7F, 0x10, 0x28, 0x44, 0x00}, // 0x6B k
{0x00, 0x41, 0x7F, 0x40, 0x00}, // 0x6C l
{0x7C, 0x04, 0x18, 0x04, 0x7C}, // 0x6D m
{0x7C, 0x08, 0x04, 0x04, 0x78}, // 0x6E n
{0x38, 0x44, 0x44, 0x44, 0x38}, // 0x6F o
{0x7C, 0x14, 0x14, 0x14, 0x08}, // 0x70 p
{0x08, 0x14, 0x14, 0x18, 0x7C}, // 0x71 q
{0x7C, 0x08, 0x04, 0x04, 0x08}, // 0x72 r
{0x48, 0x54, 0x54, 0x54, 0x20}, // 0x73 s
{0x04, 0x3F, 0x44, 0x40, 0x20}, // 0x74 t
{0x3C, 0x40, 0x40, 0x20, 0x7C}, // 0x75 u
{0x1C, 0x20, 0x40, 0x20, 0x1C}, // 0x76 v
{0x3C, 0x40, 0x30, 0x40, 0x3C}, // 0x77 w
{0x44, 0x28, 0x10, 0x28, 0x44}, // 0x78 x
{0x0C, 0x50, 0x50, 0x50, 0x3C}, // 0x79 y
{0x44, 0x64, 0x54, 0x4C, 0x44}, // 0x7A z
{0x00, 0x08, 0x36, 0x41, 0x00}, // 0x7B {
{0x00, 0x00, 0x77, 0x00, 0x00}, // 0x7C |
{0x00, 0x41, 0x36, 0x08, 0x00}, // 0x7D }
{0x08, 0x04, 0x08, 0x10, 0x08} // 0x7E ~
};
-------------------------------------------------------------------------------------------------------------------
#define GLCD_DATABUS PORTA
#define GLCD_CONTROL PORTF
// #define GLCD_CONTROL_RS 0
// #define GLCD_CONTROL_RW 1
// #define GLCD_CONTROL_EN 2
// #define GLCD_CONTROL_CS1 3
// #define GLCD_CONTROL_CS2 4
// #define GLCD_CONTROL_RSTB 5
unsigned char X_Char, Y_Char;
unsigned char Cursor = 0, X_Cursor, Y_Cursor;
void Device_Init (void) {
DDRA = 0xFF;
PORTA = 0x00;
DDRF = 0xFF;
PORTF = 0x00;
}
void GLCD_Instruction (unsigned char Inst, unsigned char Data) {
GLCD_CONTROL = Inst & 0x38; // RS 0, E 0
delay_us(10);
GLCD_DATABUS = Data;
GLCD_CONTROL = (Inst & 0x38) | 0x04; // RS 0, E 1
delay_us(10);
GLCD_CONTROL = Inst & 0x38; // RS 0, E 0
GLCD_CONTROL = 0x20; // All Clear
delay_us(100);
}
void GLCD_Data (unsigned char Inst, unsigned char Data) {
GLCD_CONTROL = (Inst & 0x38) | 0x01; // RS 1, E 0
delay_us(10);
GLCD_DATABUS = Data;
GLCD_CONTROL = (Inst & 0x38) | 0x05; // RS 1, E 1
delay_us(10);
GLCD_CONTROL = (Inst & 0x38) | 0x01; // RS 1, E 0
GLCD_CONTROL = 0x20; // All Clear
delay_us(100);
}
void GLCD_Init (void) {
unsigned char i, j, k;
GLCD_CONTROL = 0x00; // All Clear
GLCD_Instruction(0x38, 0x3F); // CS1, CS2 Display On
GLCD_Instruction(0x38, 0xC0); // CS1, CS2 Display Position
k = 0xB8;
for(i=0; i<=7; i++) {
GLCD_Instruction(0x38, k); // X Start Address
GLCD_Instruction(0x38, 0x40); // Y Start Address
for(j=0; j<=63; j++)
GLCD_Data(0x38, 0x00); // Clear CS1, CS2
k++;
}
}
void GLCD_X_Y (unsigned char X, unsigned char Y) {
X_Char = X; Y_Char = Y;
GLCD_Instruction(0x38, 0xB8 + X_Char);
// CS1 1, CS2 0
if(Y_Char <= 9) GLCD_Instruction(0x28, 0x40 + Y_Char * 6 + 4);
// CS1 0, CS2 1
else GLCD_Instruction(0x30, 0x40 + (Y_Char - 10) * 6);
}
void GLCD_Character (unsigned char Data) {
unsigned char i, Inst, Font_Data;
GLCD_X_Y(X_Char, Y_Char);
if(Y_Char <= 9) Inst = 0x28;
else Inst = 0x30;
for(i=0; i<=4; i++) {
Font_Data = GLCD_Font[Data - 0x20][i];
if((Cursor == 1) && (X_Char == X_Cursor) && (Y_Char == Y_Cursor))
GLCD_Data(Inst, Font_Data | 0x80);
else
GLCD_Data(Inst, Font_Data);
}
GLCD_Data(Inst, 0x00); Y_Char++;
if(Y_Char == 20) { Y_Char = 0; X_Char++; }
}
void GLCD_String (unsigned char X, unsigned char Y, unsigned char *Str) {
X_Char = X; Y_Char = Y;
while(*Str != '\0') {
GLCD_Character(*Str);
Str++;
}
}