Commit d34472c2 authored by Philippe Kalaf's avatar Philippe Kalaf

First Commit!

parents
File added
File added
ROOT=.
http://mbed.org/users/dreschpe/code/C12832_lcd/#8f86576007d6
This diff is collapsed.
/* mbed library for the mbed Lab Board 128*32 pixel LCD
* use C12832 controller
* Copyright (c) 2012 Peter Drescher - DC2PD
* Released under the MIT License: http://mbed.org/license/mit
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef C12832_H
#define C12832_H
#include "mbed.h"
#include "GraphicsDisplay.h"
/** optional Defines :
* #define debug_lcd 1 enable infos to PC_USB
*/
// some defines for the DMA use
#define DMA_CHANNEL_ENABLE 1
#define DMA_TRANSFER_TYPE_M2P (1UL << 11)
#define DMA_CHANNEL_TCIE (1UL << 31)
#define DMA_CHANNEL_SRC_INC (1UL << 26)
#define DMA_MASK_IE (1UL << 14)
#define DMA_MASK_ITC (1UL << 15)
#define DMA_SSP1_TX (1UL << 2)
#define DMA_SSP0_TX (0)
#define DMA_DEST_SSP1_TX (2UL << 6)
#define DMA_DEST_SSP0_TX (0UL << 6)
/** Draw mode
* NORMAl
* XOR set pixel by xor the screen
*/
enum {NORMAL,XOR};
/** Bitmap
*/
struct Bitmap{
int xSize;
int ySize;
int Byte_in_Line;
char* data;
};
class C12832_LCD : public GraphicsDisplay
{
public:
/** Create a C12832_LCD object connected to SPI1
*
*/
C12832_LCD(const char* name = "LCD");
/** Get the width of the screen in pixel
*
* @param
* @returns width of screen in pixel
*
*/
virtual int width();
/** Get the height of the screen in pixel
*
* @returns height of screen in pixel
*
*/
virtual int height();
/** Draw a pixel at x,y black or white
*
* @param x horizontal position
* @param y vertical position
* @param colour ,1 set pixel ,0 erase pixel
*/
virtual void pixel(int x, int y,int colour);
/** draw a circle
*
* @param x0,y0 center
* @param r radius
* @param colour ,1 set pixel ,0 erase pixel
*
*/
void circle(int x, int y, int r, int colour);
/** draw a filled circle
*
* @param x0,y0 center
* @param r radius
* @param color ,1 set pixel ,0 erase pixel
*
* use circle with different radius,
* can miss some pixel
*/
void fillcircle(int x, int y, int r, int colour);
/** draw a 1 pixel line
*
* @param x0,y0 start point
* @param x1,y1 stop point
* @param color ,1 set pixel ,0 erase pixel
*
*/
void line(int x0, int y0, int x1, int y1, int colour);
/** draw a rect
*
* @param x0,y0 top left corner
* @param x1,y1 down right corner
* @param color 1 set pixel ,0 erase pixel
* *
*/
void rect(int x0, int y0, int x1, int y1, int colour);
/** draw a filled rect
*
* @param x0,y0 top left corner
* @param x1,y1 down right corner
* @param color 1 set pixel ,0 erase pixel
*
*/
void fillrect(int x0, int y0, int x1, int y1, int colour);
/** copy display buffer to lcd
*
*/
void copy_to_lcd(void);
/** set the orienation of the screen
*
*/
//void set_orientation(unsigned int o);
/** set the contrast of the screen
*
* @param o contrast 0-63
*/
void set_contrast(unsigned int o);
/** read the contrast level
*
*/
unsigned int get_contrast(void);
/** invert the screen
*
* @param o = 0 normal, 1 invert
*/
void invert(unsigned int o);
/** clear the screen
*
*/
virtual void cls(void);
/** set the drawing mode
*
* @param mode NORMAl or XOR
*/
void setmode(int mode);
virtual int columns(void);
/** calculate the max number of columns
*
* @returns max column
* depends on actual font size
*
*/
virtual int rows(void);
/** put a char on the screen
*
* @param value char to print
* @returns printed char
*
*/
virtual int _putc(int value);
/** draw a character on given position out of the active font to the LCD
*
* @param x x-position of char (top left)
* @param y y-position
* @param c char to print
*
*/
virtual void character(int x, int y, int c);
/** setup cursor position
*
* @param x x-position (top left)
* @param y y-position
*/
virtual void locate(int x, int y);
/** setup auto update of screen
*
* @param up 1 = on , 0 = off
* if switched off the program has to call copy_to_lcd()
* to update screen from framebuffer
*/
void set_auto_up(unsigned int up);
/** get status of the auto update function
*
* @returns if auto update is on
*/
unsigned int get_auto_up(void);
/** Vars */
SPI _spi;
DigitalOut _reset;
DigitalOut _A0;
DigitalOut _CS;
unsigned char* font;
unsigned int draw_mode;
/** select the font to use
*
* @param f pointer to font array
*
* font array can created with GLCD Font Creator from http://www.mikroe.com
* you have to add 4 parameter at the beginning of the font array to use:
* - the number of byte / char
* - the vertial size in pixel
* - the horizontal size in pixel
* - the number of byte per vertical line
* you also have to change the array to char[]
*
*/
void set_font(unsigned char* f);
/** print bitmap to buffer
*
* @param bm Bitmap in flash
* @param x x start
* @param y y start
*
*/
void print_bm(Bitmap bm, int x, int y);
protected:
/** draw a horizontal line
*
* @param x0 horizontal start
* @param x1 horizontal stop
* @param y vertical position
* @param ,1 set pixel ,0 erase pixel
*
*/
void hline(int x0, int x1, int y, int colour);
/** draw a vertical line
*
* @param x horizontal position
* @param y0 vertical start
* @param y1 vertical stop
* @param ,1 set pixel ,0 erase pixel
*/
void vline(int y0, int y1, int x, int colour);
/** Init the C12832 LCD controller
*
*/
void lcd_reset();
/** Write data to the LCD controller
*
* @param dat data written to LCD controller
*
*/
void wr_dat(unsigned char value);
/** Write a command the LCD controller
*
* @param cmd: command to be written
*
*/
void wr_cmd(unsigned char value);
void wr_cnt(unsigned char cmd);
unsigned int orientation;
unsigned int char_x;
unsigned int char_y;
unsigned char buffer[512];
unsigned int contrast;
unsigned int auto_up;
};
#endif
/* mbed GraphicsDisplay Display Library Base Class
* Copyright (c) 2007-2009 sford
* Released under the MIT License: http://mbed.org/license/mit
*/
#include "GraphicsDisplay.h"
const unsigned char FONT8x8[97][8] = {
0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p
0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}; // DEL
GraphicsDisplay::GraphicsDisplay(const char *name):TextDisplay(name) {
foreground(0xFFFF);
background(0x0000);
}
void GraphicsDisplay::character(int column, int row, int value) {
blitbit(column * 8, row * 8, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
}
void GraphicsDisplay::window(int x, int y, int w, int h) {
// current pixel location
_x = x;
_y = y;
// window settings
_x1 = x;
_x2 = x + w - 1;
_y1 = y;
_y2 = y + h - 1;
}
void GraphicsDisplay::putp(int colour) {
// put pixel at current pixel location
pixel(_x, _y, colour);
// update pixel location based on window settings
_x++;
if(_x > _x2) {
_x = _x1;
_y++;
if(_y > _y2) {
_y = _y1;
}
}
}
void GraphicsDisplay::fill(int x, int y, int w, int h, int colour) {
window(x, y, w, h);
for(int i=0; i<w*h; i++) {
putp(colour);
}
}
void GraphicsDisplay::cls() {
fill(0, 0, width(), height(), _background);
}
void GraphicsDisplay::blit(int x, int y, int w, int h, const int *colour) {
window(x, y, w, h);
for(int i=0; i<w*h; i++) {
putp(colour[i]);
}
}
void GraphicsDisplay::blitbit(int x, int y, int w, int h, const char* colour) {
window(x, y, w, h);
for(int i = 0; i < w*h; i++) {
char byte = colour[i >> 3];
int offset = i & 0x7;
int c = ((byte << offset) & 0x80) ? _foreground : _background;
putp(c);
}
}
int GraphicsDisplay::columns() {
return width() / 8;
}
int GraphicsDisplay::rows() {
return height() / 8;
}
/* mbed GraphicsDisplay Display Library Base Class
* Copyright (c) 2007-2009 sford
* Released under the MIT License: http://mbed.org/license/mit
*
* A library for providing a common base class for Graphics displays
* To port a new display, derive from this class and implement
* the constructor (setup the display), pixel (put a pixel
* at a location), width and height functions. Everything else
* (locate, printf, putc, cls, window, putp, fill, blit, blitbit)
* will come for free. You can also provide a specialised implementation
* of window and putp to speed up the results
*/
#ifndef MBED_GRAPHICSDISPLAY_H
#define MBED_GRAPHICSDISPLAY_H
#include "TextDisplay.h"
class GraphicsDisplay : public TextDisplay {
public:
GraphicsDisplay(const char* name);
virtual void pixel(int x, int y, int colour) = 0;
virtual int width() = 0;
virtual int height() = 0;
virtual void window(int x, int y, int w, int h);
virtual void putp(int colour);
virtual void cls();
virtual void fill(int x, int y, int w, int h, int colour);
virtual void blit(int x, int y, int w, int h, const int *colour);
virtual void blitbit(int x, int y, int w, int h, const char* colour);
virtual void character(int column, int row, int value);
virtual int columns();
virtual int rows();
protected:
// pixel location
short _x;
short _y;
// window location
short _x1;
short _x2;
short _y1;
short _y2;
};
#endif
This diff is collapsed.
/* mbed TextDisplay Display Library Base Class
* Copyright (c) 2007-2009 sford
* Released under the MIT License: http://mbed.org/license/mit
*/
#include "TextDisplay.h"
TextDisplay::TextDisplay(const char *name) : Stream(name){
_row = 0;
_column = 0;
if (name == NULL) {
_path = NULL;
} else {
_path = new char[strlen(name) + 2];
sprintf(_path, "/%s", name);
}
}
int TextDisplay::_putc(int value) {
if(value == '\n') {
_column = 0;
_row++;
if(_row >= rows()) {
_row = 0;
}
} else {
character(_column, _row, value);
_column++;
if(_column >= columns()) {
_column = 0;
_row++;
if(_row >= rows()) {
_row = 0;
}
}
}
return value;
}
// crude cls implementation, should generally be overwritten in derived class
void TextDisplay::cls() {
locate(0, 0);
for(int i=0; i<columns()*rows(); i++) {
putc(' ');
}
}
void TextDisplay::locate(int column, int row) {
_column = column;
_row = row;
}
int TextDisplay::_getc() {
return -1;
}
void TextDisplay::foreground(uint16_t colour) {