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%.

Files at this revision

API Documentation at this revision

Comitter:
hapoo
Date:
Sat Dec 25 10:14:10 2010 +0000
Commit message:

Changed in this revision

Display.cpp Show annotated file Show diff for this revision Revisions of this file
Display.h Show annotated file Show diff for this revision Revisions of this file
font.h Show annotated file Show diff for this revision Revisions of this file
--- /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
--- /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
--- /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&#322;aw Kwiecie&#324; - 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