Вот мой код:
Код
u_char frame0[0xc00];
void disp_refresh(void)
{
u_int a;
u_char *fptr = frame0;
disp_write(0x00, 0x15); // Set Column Address
disp_write(0x00, 0x00); // 0
disp_write(0x00, 0x2f); // +1 = 96/2
disp_write(0x00, 0x75); // Set Row Address
disp_write(0x00, 0x00); // 0
disp_write(0x00, 0x3f); // +1 = 64
IOCLR = DISP_RW + DISP_E;
IOSET = DISP_RS;
IODIR |= DISP_DBUS;
a = 0x00;
do
{
IOCLR = DISP_DBUS + DISP_CS;
IOSET = ((*fptr++ & 0xff) << 0x10) + DISP_E;
IOCLR = DISP_E;
IOSET = DISP_CS;
} while(++a != 0xc00);
}
void disp_clear(void)
{
u_int a;
a = 0x00;
do
{
frame0[a] = 0x00;
} while(++a != 0xc00);
}
void disp_ini(void)
{
u_int a;
IOCLR = DISP_RS + DISP_RW + DISP_E + DISP_RST;
IOSET = DISP_CS + DISP_PEN;
IODIR |= DISP_CTL + DISP_DBUS;
// Delay
a = 0x00;
while(++a != 0x10000);
IOSET = DISP_RST;
// Delay
a = 0x00;
while(++a != 0x10000);
disp_write(0x00, 0xa8); // Set Multiplex Ratio
disp_write(0x00, 0x3f); // 64 Lines
disp_write(0x00, 0x15); // Set Column Address
disp_write(0x00, 0x00); // 0
disp_write(0x00, 0x2f); // +1 = 96/2
disp_write(0x00, 0x75); // Set Row Address
disp_write(0x00, 0x00); // 0
disp_write(0x00, 0x3f); // +1 = 64
disp_write(0x00, 0xa0); // Set Re-map
disp_write(0x00, 0x40); // Enable COM Split Odd Even
#ifdef HIGH_BRIGHTNESS
disp_write(0x00, 0x86); // Set Full Current
disp_write(0x00, 0x81); // Set contrast
disp_write(0x00, 0x7f); // 127
#endif
/*
disp_write(0x00, 0xb3); // Set freq.
disp_write(0x00, 0x02); //
*/
disp_clear(); // Clear Display Data
disp_refresh();
disp_write(0x00, 0xaf); // Display ON
}
void disp_write(u_int addr, u_int data)
{
IOCLR = DISP_DBUS + DISP_RS + DISP_RW + DISP_E;
if(addr) IOSET = DISP_RS;
IODIR |= DISP_DBUS;
IOCLR = DISP_CS;
IOSET = ((data & 0xff) << 0x10) + DISP_E;
IOCLR = DISP_E;
IOSET = DISP_CS;
}
Экран полностью хранился в ОЗУ, так что процедуры "нарисовать точку" нет, можно только обновить все.