Software to control a 128x64 graphic LCD with KS0107B and KS0108B controller. Slight modification to Anders Hörnfeldts Code which increases framerate by up to 300%.
Revision 0:0cc7719c6d87, committed 2010-12-25
- Comitter:
- hapoo
- Date:
- Sat Dec 25 10:14:10 2010 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r 0cc7719c6d87 Display.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Display.cpp Sat Dec 25 10:14:10 2010 +0000 @@ -0,0 +1,124 @@ +#include "Display.h" +#include "font.h" + +Display::Display (PinName _RS, PinName _RW, PinName _E, PinName _CS1, PinName _CS2, PinName DB0, PinName DB1, PinName DB2, PinName DB3, PinName DB4, PinName DB5, PinName DB6, PinName DB7) + : DB(DB0,DB1,DB2,DB3,DB4,DB5,DB6,DB7), RS(_RS), RW(_RW), E(_E), CS1(_CS1), CS2(_CS2) { + DB.mode(PullNone); + E = 0; + SendCommand(0x3F, 4|8); + for (int c=0;c<128;c++) { + for (int r=0;r<8;r++) + { + write(r,c,0); + } + } + prevPage = -2; + prevY = -2; +} +DisplayTTY::DisplayTTY (Display *d, int _row, int _startY, int _numOfChars, int _numOfRows, int _charOffset, int _flags) +{ + kalle = d; + row = _row; + startY = _startY; + numOfChars = _numOfChars; + numOfRows = _numOfRows; + charOffset = _charOffset; + flags = _flags; + CursPosY = 0; + CursPosW = row; + cls(); +} +int Display::SendCommand(unsigned int Command, int f) { + int value = 1; + E = 0; + RS = 0; + RW = 0; + CS1 = 0; + CS2 = 0; + if (f&1) + RS = 1; + if (f&2) + RW = 1; + if (f&4) + CS1 = 1; + + if (f&8) + CS2 = 1; + //wait(0.0000003); // 300ns + E = 1; + if (f&2) + { + DB.input(); + //wait(0.0000003); + value = DB; + } + else + { + DB.output(); + DB = Command; + } + //wait(0.0000001); + E = 0; + return value; +} + +void Display::write (int page, int y, unsigned int data) { + int f = 0; + if (y<64) + f = 4; + else + f = 8; + CurCol = y; + if( ( page != prevPage ) || ( y != (prevY+1) ) || (y == 64) ) + { + SendCommand(0xB8+(page&0x07), f); + SendCommand(0x40+(y&0x3F),f); + prevPage = page; + } + SendCommand(data, f+1); + + prevY = y; +} + +void Display::writec (int row, int Y, int c) { + if (c>31 && c<127) + { + write(row,Y+0,font5x8[(c-32)*5+0]); + write(row,Y+1,font5x8[(c-32)*5+1]); + write(row,Y+2,font5x8[(c-32)*5+2]); + write(row,Y+3,font5x8[(c-32)*5+3]); + write(row,Y+4,font5x8[(c-32)*5+4]); + } +} +int DisplayTTY::_putc (int c) +{ + if (c == '\n') + newline(); + else + { + kalle->writec(CursPosW, startY+CursPosY*charOffset, c); + + if (++CursPosY>=numOfChars) + newline(); + } + + return 0; +} +int DisplayTTY::_getc() { + return 0; +} +void DisplayTTY::newline() { + CursPosY=0; + if ((++CursPosW-row)>=numOfRows) + { + CursPosW = row; + } +} +void DisplayTTY::cls() { + CursPosY=0; + CursPosW = row; + for (int c=0;c<numOfChars*numOfRows;c++) + { + _putc(' '); + } +} \ No newline at end of file
diff -r 000000000000 -r 0cc7719c6d87 Display.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Display.h Sat Dec 25 10:14:10 2010 +0000 @@ -0,0 +1,56 @@ +#ifndef DISPLAY_H +#define DISPLAY_H + +#define RS_f = 1 +#define RW_f = 2 +#define CS1_f = 4 +#define CS2_f = 8 + +#include "mbed.h" +#include "font.h" + +class Display { + public: + // Constructor: + Display (PinName _RS, PinName _RW, PinName _E, PinName _CS1, PinName _CS2, PinName DB0, PinName DB1, PinName DB2, PinName DB3, PinName DB4, PinName DB5, PinName DB6, PinName DB7); + // Send write command to Display + // Page 0-7, y 0-127 + void write (int page, int y, unsigned int data); + // + void SetAddress(int); + int SendCommand(unsigned int, int); + // Row 0-7, col 0-122 + void writec(int row, int Y, int c); + + private: + int prevPage; + int prevY; + BusInOut DB; + DigitalOut RS; + DigitalOut RW; + DigitalOut E; + DigitalOut CS1; + DigitalOut CS2; + int CurCol; +}; + +class DisplayTTY : public Stream { + public: + DisplayTTY (Display *d, int _row, int _startY, int _numOfChars=10, int _numOfRows=1, int _charOffset=6, int _flags=0); + void cls(); + protected: + virtual int _putc (int c); + virtual int _getc(); + virtual void newline(); + Display *kalle; + int row; + int startY; + int numOfChars; + int numOfRows; + int charOffset; + int flags; + int CursPosY; + int CursPosW; +}; + +#endif \ No newline at end of file
diff -r 000000000000 -r 0cc7719c6d87 font.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/font.h Sat Dec 25 10:14:10 2010 +0000 @@ -0,0 +1,102 @@ +#ifndef FONT_H +#define FONT_H +// (c) Radosław Kwiecień - http://en.radzio.dxp.pl/ks0108/ +static const char font5x8[] = { +0x00, 0x00, 0x00, 0x00, 0x00,// (spacja) +0x00, 0x00, 0x5F, 0x00, 0x00,// ! +0x00, 0x07, 0x00, 0x07, 0x00,// " +0x14, 0x7F, 0x14, 0x7F, 0x14,// # +0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ +0x23, 0x13, 0x08, 0x64, 0x62,// % +0x36, 0x49, 0x55, 0x22, 0x50,// & +0x00, 0x05, 0x03, 0x00, 0x00,// ' +0x00, 0x1C, 0x22, 0x41, 0x00,// ( +0x00, 0x41, 0x22, 0x1C, 0x00,// ) +0x08, 0x2A, 0x1C, 0x2A, 0x08,// * +0x08, 0x08, 0x3E, 0x08, 0x08,// + +0x00, 0x50, 0x30, 0x00, 0x00,// , +0x08, 0x08, 0x08, 0x08, 0x08,// - +0x00, 0x30, 0x30, 0x00, 0x00,// . +0x20, 0x10, 0x08, 0x04, 0x02,// / +0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 +0x00, 0x42, 0x7F, 0x40, 0x00,// 1 +0x42, 0x61, 0x51, 0x49, 0x46,// 2 +0x21, 0x41, 0x45, 0x4B, 0x31,// 3 +0x18, 0x14, 0x12, 0x7F, 0x10,// 4 +0x27, 0x45, 0x45, 0x45, 0x39,// 5 +0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 +0x01, 0x71, 0x09, 0x05, 0x03,// 7 +0x36, 0x49, 0x49, 0x49, 0x36,// 8 +0x06, 0x49, 0x49, 0x29, 0x1E,// 9 +0x00, 0x36, 0x36, 0x00, 0x00,// : +0x00, 0x56, 0x36, 0x00, 0x00,// ; +0x00, 0x08, 0x14, 0x22, 0x41,// < +0x14, 0x14, 0x14, 0x14, 0x14,// = +0x41, 0x22, 0x14, 0x08, 0x00,// > +0x02, 0x01, 0x51, 0x09, 0x06,// ? +0x32, 0x49, 0x79, 0x41, 0x3E,// @ +0x7E, 0x11, 0x11, 0x11, 0x7E,// A +0x7F, 0x49, 0x49, 0x49, 0x36,// B +0x3E, 0x41, 0x41, 0x41, 0x22,// C +0x7F, 0x41, 0x41, 0x22, 0x1C,// D +0x7F, 0x49, 0x49, 0x49, 0x41,// E +0x7F, 0x09, 0x09, 0x01, 0x01,// F +0x3E, 0x41, 0x41, 0x51, 0x32,// G +0x7F, 0x08, 0x08, 0x08, 0x7F,// H +0x00, 0x41, 0x7F, 0x41, 0x00,// I +0x20, 0x40, 0x41, 0x3F, 0x01,// J +0x7F, 0x08, 0x14, 0x22, 0x41,// K +0x7F, 0x40, 0x40, 0x40, 0x40,// L +0x7F, 0x02, 0x04, 0x02, 0x7F,// M +0x7F, 0x04, 0x08, 0x10, 0x7F,// N +0x3E, 0x41, 0x41, 0x41, 0x3E,// O +0x7F, 0x09, 0x09, 0x09, 0x06,// P +0x3E, 0x41, 0x51, 0x21, 0x5E,// Q +0x7F, 0x09, 0x19, 0x29, 0x46,// R +0x46, 0x49, 0x49, 0x49, 0x31,// S +0x01, 0x01, 0x7F, 0x01, 0x01,// T +0x3F, 0x40, 0x40, 0x40, 0x3F,// U +0x1F, 0x20, 0x40, 0x20, 0x1F,// V +0x7F, 0x20, 0x18, 0x20, 0x7F,// W +0x63, 0x14, 0x08, 0x14, 0x63,// X +0x03, 0x04, 0x78, 0x04, 0x03,// Y +0x61, 0x51, 0x49, 0x45, 0x43,// Z +0x00, 0x00, 0x7F, 0x41, 0x41,// [ +0x02, 0x04, 0x08, 0x10, 0x20,// "\" +0x41, 0x41, 0x7F, 0x00, 0x00,// ] +0x04, 0x02, 0x01, 0x02, 0x04,// ^ +0x40, 0x40, 0x40, 0x40, 0x40,// _ +0x00, 0x01, 0x02, 0x04, 0x00,// ` +0x20, 0x54, 0x54, 0x54, 0x78,// a +0x7F, 0x48, 0x44, 0x44, 0x38,// b +0x38, 0x44, 0x44, 0x44, 0x20,// c +0x38, 0x44, 0x44, 0x48, 0x7F,// d +0x38, 0x54, 0x54, 0x54, 0x18,// e +0x08, 0x7E, 0x09, 0x01, 0x02,// f +0x08, 0x14, 0x54, 0x54, 0x3C,// g +0x7F, 0x08, 0x04, 0x04, 0x78,// h +0x00, 0x44, 0x7D, 0x40, 0x00,// i +0x20, 0x40, 0x44, 0x3D, 0x00,// j +0x00, 0x7F, 0x10, 0x28, 0x44,// k +0x00, 0x41, 0x7F, 0x40, 0x00,// l +0x7C, 0x04, 0x18, 0x04, 0x78,// m +0x7C, 0x08, 0x04, 0x04, 0x78,// n +0x38, 0x44, 0x44, 0x44, 0x38,// o +0x7C, 0x14, 0x14, 0x14, 0x08,// p +0x08, 0x14, 0x14, 0x18, 0x7C,// q +0x7C, 0x08, 0x04, 0x04, 0x08,// r +0x48, 0x54, 0x54, 0x54, 0x20,// s +0x04, 0x3F, 0x44, 0x40, 0x20,// t +0x3C, 0x40, 0x40, 0x20, 0x7C,// u +0x1C, 0x20, 0x40, 0x20, 0x1C,// v +0x3C, 0x40, 0x30, 0x40, 0x3C,// w +0x44, 0x28, 0x10, 0x28, 0x44,// x +0x0C, 0x50, 0x50, 0x50, 0x3C,// y +0x44, 0x64, 0x54, 0x4C, 0x44,// z +0x00, 0x08, 0x36, 0x41, 0x00,// { +0x00, 0x00, 0x7F, 0x00, 0x00,// | +0x00, 0x41, 0x36, 0x08, 0x00,// } +0x08, 0x08, 0x2A, 0x1C, 0x08,// -> +0x08, 0x1C, 0x2A, 0x08, 0x08 // <- +}; +#endif \ No newline at end of file