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%.
Display.cpp
- Committer:
- hapoo
- Date:
- 2010-12-25
- Revision:
- 0:0cc7719c6d87
File content as of revision 0:0cc7719c6d87:
#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(' '); } }