Test application based on the AVR examples provided by ThaiEasyElec for their ELT240320ATP breakout board -- library works rather slow on the mbed platform.

Dependencies:   mbed

Revision:
0:4395705c8647
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Mar 10 21:17:41 2010 +0000
@@ -0,0 +1,935 @@
+// General Drivers
+#include "mbed.h"
+
+#include "ClockControl.h"
+
+// QVGA LCD Drivers
+
+////////
+#include "font_courier.h"
+
+// LCD Control
+DigitalOut lcd_rst(p13);
+DigitalOut lcd_bl(p14);
+DigitalOut lcd_rs(p15);
+DigitalOut lcd_cs(p16);
+DigitalOut lcd_rd(p17);
+DigitalOut lcd_wr(p18);
+
+BusInOut lcd_db(p5, p6, p7, p8, p9, p10, p11, p12);
+
+// Touch Screen Control
+/*
+#define TC_CS_PORT        &PORTB
+#define TC_CS_PIN        4
+
+#define TC_PEN_PORT        &PORTB
+#define TC_PEN_PINP        PINB
+#define TC_PEN_PIN        2
+
+#define MOSI_PORT        &PORTB
+#define MOSI_PIN        5
+
+#define SCK_PORT        &PORTB
+#define SCK_PIN            7
+*/
+
+//touch screen LCD configuration
+//#define TS_ORN_PORTRAIT
+
+#ifdef TS_ORN_PORTRAIT
+#define TS_SIZE_X                    240
+#define TS_SIZE_Y                    320
+#define TS_VAL_ENTRY_MOD            0x0030
+#define TS_INS_GRAM_ADX                TS_INS_GRAM_HOR_AD
+#define TS_INS_GRAM_ADY                TS_INS_GRAM_VER_AD
+#define TS_INS_START_ADX               TS_INS_HOR_START_AD
+#define TS_INS_END_ADX               TS_INS_HOR_END_AD
+#define TS_INS_START_ADY               TS_INS_VER_START_AD
+#define TS_INS_END_ADY               TS_INS_VER_END_AD
+#else
+#define TS_SIZE_X                    320
+#define TS_SIZE_Y                    240
+#define TS_VAL_ENTRY_MOD            0x0028
+#define TS_INS_GRAM_ADX                TS_INS_GRAM_VER_AD
+#define TS_INS_GRAM_ADY                TS_INS_GRAM_HOR_AD
+#define TS_INS_START_ADX               TS_INS_VER_START_AD
+#define TS_INS_END_ADX               TS_INS_VER_END_AD
+#define TS_INS_START_ADY               TS_INS_HOR_START_AD
+#define TS_INS_END_ADY               TS_INS_HOR_END_AD
+#endif
+
+//pen status type definition
+typedef enum
+{
+    PST_NOTFOUND,
+    PST_DOWN,
+    PST_HOLD,
+    PST_UP
+} pstatus_t;
+
+//#define so_pos_t        short
+
+#ifndef so_pos_t
+typedef short so_pos_t;
+#endif
+
+//////
+
+#define TS_INS_START_OSC            0x00 //data read at this instruction should be 0x0789 --> use for test connection
+#define TS_INS_DRIV_OUT_CTRL        0x01
+#define TS_INS_DRIV_WAV_CTRL        0x02
+#define TS_INS_ENTRY_MOD            0x03
+#define TS_INS_RESIZE_CTRL            0x04
+#define TS_INS_DISP_CTRL1            0x07
+#define TS_INS_DISP_CTRL2            0x08
+#define TS_INS_DISP_CTRL3            0x09
+#define TS_INS_DISP_CTRL4            0x0A
+#define TS_INS_RGB_DISP_IF_CTRL1    0x0C
+#define TS_INS_FRM_MARKER_POS        0x0D
+#define TS_INS_RGB_DISP_IF_CTRL2    0x0F
+#define TS_INS_POW_CTRL1            0x10
+#define TS_INS_POW_CTRL2            0x11
+#define TS_INS_POW_CTRL3            0x12
+#define TS_INS_POW_CTRL4            0x13
+#define TS_INS_GRAM_HOR_AD            0x20
+#define TS_INS_GRAM_VER_AD            0x21
+#define TS_INS_RW_GRAM                0x22
+#define TS_INS_POW_CTRL7            0x29
+#define TS_INS_FRM_RATE_COL_CTRL    0x2B
+#define TS_INS_GAMMA_CTRL1            0x30
+#define TS_INS_GAMMA_CTRL2            0x31
+#define TS_INS_GAMMA_CTRL3            0x32
+#define TS_INS_GAMMA_CTRL4            0x35 
+#define TS_INS_GAMMA_CTRL5            0x36
+#define TS_INS_GAMMA_CTRL6            0x37
+#define TS_INS_GAMMA_CTRL7            0x38
+#define TS_INS_GAMMA_CTRL8            0x39
+#define TS_INS_GAMMA_CTRL9            0x3C
+#define TS_INS_GAMMA_CTRL10            0x3D
+#define TS_INS_HOR_START_AD            0x50
+#define TS_INS_HOR_END_AD            0x51
+#define TS_INS_VER_START_AD            0x52
+#define TS_INS_VER_END_AD            0x53
+#define TS_INS_GATE_SCAN_CTRL1        0x60
+#define TS_INS_GATE_SCAN_CTRL2        0x61
+#define TS_INS_GATE_SCAN_CTRL3        0x6A
+#define TS_INS_PART_IMG1_DISP_POS    0x80
+#define TS_INS_PART_IMG1_START_AD    0x81
+#define TS_INS_PART_IMG1_END_AD        0x82
+#define TS_INS_PART_IMG2_DISP_POS    0x83
+#define TS_INS_PART_IMG2_START_AD    0x84
+#define TS_INS_PART_IMG2_END_AD        0x85
+#define TS_INS_PANEL_IF_CTRL1        0x90
+#define TS_INS_PANEL_IF_CTRL2        0x92
+#define TS_INS_PANEL_IF_CTRL3        0x93
+#define TS_INS_PANEL_IF_CTRL4        0x95
+#define TS_INS_PANEL_IF_CTRL5        0x97
+#define TS_INS_PANEL_IF_CTRL6        0x98
+
+#define TS_COL_RED                    0x001F
+#define TS_COL_GREEN                0x07E0
+#define TS_COL_BLUE                    0xF800
+#define TS_COL_YELLOW                0x07FF
+#define TS_COL_PURPLE                0xF81F
+#define TS_COL_BLACK                0x0000
+#define TS_COL_WHITE                0xFFFF
+
+#define ts_pos_t                    int
+
+typedef enum
+{
+    TS_MODE_NORMAL,
+    TS_MODE_INVERSE,
+    TS_MODE_FULL,
+} ts_mode_t;
+
+void TSLCDOutIns(unsigned short ins); //write instruction to LCD
+void TSLCDOutDat(unsigned short dat); //write data to LCD
+void TSLCDOutDat2(unsigned char dath,unsigned char datl); //write data to LCD
+unsigned short TSLCDInIns(void); //read data from LCD
+unsigned short TSLCDInDat(void); //read data from LCD
+
+void TSLCDRst(void); //pulse reset signal to LCD
+void TSLCDInit(void); //initial LCD
+void TSLCDShowPic2(ts_pos_t sx,ts_pos_t ex,ts_pos_t sy,ts_pos_t ey,const unsigned short *pic,ts_mode_t mode);
+//show picture from code memory with specific size
+void TSLCDFillRect(ts_pos_t sx,ts_pos_t ex,ts_pos_t sy,ts_pos_t ey,unsigned short color,ts_mode_t mode); //draw a rectangular
+void TSLCDFillCirc(ts_pos_t cx,ts_pos_t cy,ts_pos_t rad,unsigned short color, ts_mode_t mode); //draw a circle
+void TSLCDSetMargins(ts_pos_t xl,ts_pos_t xr,ts_pos_t yu,ts_pos_t yl); //set margins for FillRect,FillCirc
+void TSLCDSetMarginsDefault(void); //reset margins to default value
+
+void TSLCDSetFontColor(unsigned short color); //set text's color
+void TSLCDSetBackColor(unsigned short color); //set back color for TS_MODE_FULL
+void TSLCDSetOffset(ts_pos_t x,ts_pos_t y); //set LCD offset for character display
+void TSLCDPrintStr(unsigned char line,unsigned char column,char *str,ts_mode_t mode); //print string on LCD
+void TSLCDPrintTxt(unsigned char line,unsigned char column,const char *txt,ts_mode_t mode); //print text from code memory
+void TSLCDPrintCh(unsigned char line,unsigned char column,char c,ts_mode_t mode); //print a character on LCD
+
+
+
+#define FONT_BIT_WIDTH 8
+#define FONT_BYTE_HIGHT 2
+#define FONT_SIZE FONT_BIT_WIDTH*FONT_BYTE_HIGHT
+
+#define FONT_WIDTH FONT_BIT_WIDTH
+#define FONT_HEIGHT FONT_BYTE_HIGHT*8
+
+void TSLCDCharDisp(char charactor,ts_pos_t sx,ts_pos_t sy,ts_mode_t mode); //low level function to print a character on LCD
+
+unsigned char char_buf[FONT_BIT_WIDTH][FONT_BYTE_HIGHT];
+
+void buf_store(unsigned char charactor);
+
+unsigned short font_color;
+unsigned short back_color;
+ts_pos_t offsetx, offsety;
+ts_pos_t ts_margin_xl = 0;
+ts_pos_t ts_margin_xr = TS_SIZE_X - 1;
+ts_pos_t ts_margin_yu = 0;
+ts_pos_t ts_margin_yl = TS_SIZE_Y - 1;
+
+#define TSLCDGetMarginXl()            ts_margin_xl
+#define TSLCDGetMarginXr()            ts_margin_xr
+#define TSLCDGetMarginYu()            ts_margin_yu
+#define TSLCDGetMarginYl()            ts_margin_yl
+
+void TSLCDSetFontColor(unsigned short color) //set text's color
+{
+    font_color = color;
+}
+
+void TSLCDSetBackColor(unsigned short color) //set back color for TS_MODE_FULL
+{
+    back_color = color;
+}
+
+void TSLCDOutDat(unsigned short dat) //write data to LCD
+{
+    lcd_rs.write(1);
+
+    lcd_rd.write(1);
+    lcd_wr.write(0);
+
+    lcd_db.output();
+        
+    lcd_db = dat >> 8;
+
+    lcd_cs.write(0);
+    lcd_cs.write(1);
+
+    lcd_db = dat;
+
+    lcd_cs.write(0);
+    lcd_cs.write(1);
+
+    lcd_wr.write(1);
+
+    lcd_db.input();
+}
+
+void TSLCDOutDat2(unsigned char dath,unsigned char datl) //write data to LCD
+{
+    lcd_rs.write(1);
+
+    lcd_rd.write(1);
+    lcd_wr.write(0);
+
+    lcd_db.output();
+        
+    lcd_db = dath;    
+
+    lcd_cs.write(0);
+    lcd_cs.write(1);
+
+    lcd_db = datl;
+
+    lcd_cs.write(0);
+    lcd_cs.write(1);
+
+    lcd_wr.write(1);
+
+    lcd_db.input();
+}
+
+void TSLCDOutIns(unsigned short ins) //write instruction to LCD
+{
+    lcd_rs.write(0);
+
+    lcd_rd.write(1);
+    lcd_wr.write(0);
+
+    lcd_db.output();
+        
+    lcd_db = ins >> 8;
+
+    lcd_cs.write(0);
+    lcd_cs.write(1);
+
+    lcd_db = ins;
+
+    lcd_cs.write(0);
+    lcd_cs.write(1);
+
+    lcd_wr.write(1);
+
+    lcd_db.input();
+}
+
+unsigned short TSLCDInDat(void) //read data from LCD
+{
+    unsigned short dat = 0;
+
+    lcd_db.input();
+
+    lcd_rs.write(1);
+
+    lcd_wr.write(1);
+    lcd_rd.write(0);
+
+    lcd_cs.write(0);
+    lcd_cs.write(0);
+    dat = lcd_db;
+    lcd_cs.write(1);
+
+    dat <<= 8;
+
+    lcd_cs.write(0);
+    lcd_cs.write(0);
+    dat |= lcd_db;
+    lcd_cs.write(1);
+
+    lcd_rd.write(1);
+
+    return (dat);
+}
+
+unsigned short TSLCDInIns(void) //read data from LCD
+{
+    unsigned short ins = 0;
+
+    lcd_db.input();
+
+    lcd_rs.write(0);
+
+    lcd_wr.write(1);
+    lcd_rd.write(0);
+
+    lcd_cs.write(0);
+    lcd_cs.write(0);
+    ins = lcd_db;
+    lcd_cs.write(1);
+
+    ins <<= 8;
+
+    lcd_cs.write(0);
+    lcd_cs.write(0);
+    ins |= lcd_db;
+    lcd_cs.write(1);
+
+    lcd_rd.write(1);
+
+    return (ins);
+}
+
+void TSLCDRst(void) //pulse reset signal to LCD
+{
+    lcd_rst.write(0);
+    wait_ms(50);
+    lcd_rst.write(1);
+}
+
+void TSLCDInit(void) //initial LCD
+{
+    wait_ms(100);
+
+    TSLCDOutIns(0x00E5);
+    TSLCDOutDat(0x8000);                     //set the internal vcore voltage
+    TSLCDOutIns(TS_INS_START_OSC);
+    TSLCDOutDat(0x0001);                     //start oscillator
+    wait_ms(50);
+
+    TSLCDOutIns(TS_INS_DRIV_OUT_CTRL);
+    TSLCDOutDat(0x0100);                     //set SS, SM
+    TSLCDOutIns(TS_INS_DRIV_WAV_CTRL);
+    TSLCDOutDat(0x0700);                     //set 1 line inversion
+    
+    TSLCDOutIns(TS_INS_ENTRY_MOD);
+    TSLCDOutDat(TS_VAL_ENTRY_MOD);            //set GRAM write direction, BGR=0
+
+    TSLCDOutIns(TS_INS_RESIZE_CTRL);
+    TSLCDOutDat(0x0000);                     //no resizing
+
+    TSLCDOutIns(TS_INS_DISP_CTRL2);
+    TSLCDOutDat(0x0202);                     //front & back porch periods = 2
+    TSLCDOutIns(TS_INS_DISP_CTRL3);
+    TSLCDOutDat(0x0000);                     
+    TSLCDOutIns(TS_INS_DISP_CTRL4);
+    TSLCDOutDat(0x0000);                     
+    TSLCDOutIns(TS_INS_RGB_DISP_IF_CTRL1);
+    TSLCDOutDat(0x0000);                     //select system interface                
+    TSLCDOutIns(TS_INS_FRM_MARKER_POS);
+    TSLCDOutDat(0x0000);                     
+    TSLCDOutIns(TS_INS_RGB_DISP_IF_CTRL2);
+    TSLCDOutDat(0x0000);                    
+    
+    TSLCDOutIns(TS_INS_POW_CTRL1);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_POW_CTRL2);
+    TSLCDOutDat(0x0000);                     
+    TSLCDOutIns(TS_INS_POW_CTRL3);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_POW_CTRL4);
+    TSLCDOutDat(0x0000);                     
+    wait_ms(200);
+
+    TSLCDOutIns(TS_INS_POW_CTRL1);
+    TSLCDOutDat(0x17B0);
+    TSLCDOutIns(TS_INS_POW_CTRL2);
+    TSLCDOutDat(0x0137);                     
+    wait_ms(50);
+
+    TSLCDOutIns(TS_INS_POW_CTRL3);
+    TSLCDOutDat(0x013C);
+    wait_ms(50);
+
+    TSLCDOutIns(TS_INS_POW_CTRL4);
+    TSLCDOutDat(0x1400);
+    TSLCDOutIns(TS_INS_POW_CTRL7);
+    TSLCDOutDat(0x0007);
+    wait_ms(50);
+
+    TSLCDOutIns(TS_INS_GRAM_HOR_AD);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_GRAM_VER_AD);
+    TSLCDOutDat(0x0000);
+
+    TSLCDOutIns(TS_INS_GAMMA_CTRL1);
+    TSLCDOutDat(0x0007);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL2);
+    TSLCDOutDat(0x0504);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL3);
+    TSLCDOutDat(0x0703);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL4);
+    TSLCDOutDat(0x0002);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL5);
+    TSLCDOutDat(0x0707);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL6);
+    TSLCDOutDat(0x0406);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL7);
+    TSLCDOutDat(0x0006);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL8);
+    TSLCDOutDat(0x0404);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL9);
+    TSLCDOutDat(0x0700);
+    TSLCDOutIns(TS_INS_GAMMA_CTRL10);
+    TSLCDOutDat(0x0A08);
+
+    TSLCDOutIns(TS_INS_HOR_START_AD);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_HOR_END_AD);
+    TSLCDOutDat(0x00EF);
+    TSLCDOutIns(TS_INS_VER_START_AD);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_VER_END_AD);
+    TSLCDOutDat(0x013F);
+    TSLCDOutIns(TS_INS_GATE_SCAN_CTRL1);
+    TSLCDOutDat(0x2700);
+    TSLCDOutIns(TS_INS_GATE_SCAN_CTRL2);
+    TSLCDOutDat(0x0001);
+    TSLCDOutIns(TS_INS_GATE_SCAN_CTRL3);
+    TSLCDOutDat(0x0000);
+
+    TSLCDOutIns(TS_INS_PART_IMG1_DISP_POS);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_PART_IMG1_START_AD);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_PART_IMG1_END_AD);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_PART_IMG2_DISP_POS);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_PART_IMG2_START_AD);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_PART_IMG2_END_AD);
+    TSLCDOutDat(0x0000);
+
+    TSLCDOutIns(TS_INS_PANEL_IF_CTRL1);
+    TSLCDOutDat(0x0010);
+    TSLCDOutIns(TS_INS_PANEL_IF_CTRL2);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_PANEL_IF_CTRL3);
+    TSLCDOutDat(0x0003);
+    TSLCDOutIns(TS_INS_PANEL_IF_CTRL4);
+    TSLCDOutDat(0x0110);
+    TSLCDOutIns(TS_INS_PANEL_IF_CTRL5);
+    TSLCDOutDat(0x0000);
+    TSLCDOutIns(TS_INS_PANEL_IF_CTRL6);
+    TSLCDOutDat(0x0000);
+
+    TSLCDOutIns(TS_INS_DISP_CTRL1);
+    TSLCDOutDat(0x0173);
+}
+
+void TSLCDShowPic2(ts_pos_t sx,ts_pos_t ex,ts_pos_t sy,ts_pos_t ey,const unsigned short *pic,ts_mode_t mode)
+//show picture from code memory with specific size
+{
+    unsigned long k = 0;
+    unsigned short color;
+    unsigned int x,y;
+    unsigned int i,j;
+    if (sx < ts_margin_xl)
+        sx = ts_margin_xl;
+    if (ex > ts_margin_xr)
+        ex = ts_margin_xr;
+    if (sy < ts_margin_yu)
+        sy = ts_margin_yu;
+    if (ey > ts_margin_yl)             
+        ey = ts_margin_yl;
+
+    TSLCDOutIns(TS_INS_START_ADX);
+    TSLCDOutDat(sx);
+    TSLCDOutIns(TS_INS_END_ADX);
+    TSLCDOutDat(ex);
+    TSLCDOutIns(TS_INS_GRAM_ADX);
+    TSLCDOutDat(sx);
+    x = ex - sx + 1;
+
+#ifndef TS_ORN_PORTRAIT
+    sy = TS_SIZE_Y - 1 - sy;     // mirror start y address
+    ey = TS_SIZE_Y - 1 - ey;     // mirror end y address
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(ey);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(sy);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy);//fix from bug of v1_00
+    y = sy - ey + 1;
+#else
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(sy);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(ey);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy);
+    y = ey - sy + 1;
+#endif
+
+    TSLCDOutIns(TS_INS_RW_GRAM);
+
+    if (mode == TS_MODE_FULL)
+    {
+        for (j=0; j<y; j++)
+            for (i=0; i<x; i++)
+            {
+                TSLCDOutDat(*(&pic[k]));
+                k++;
+            }
+    }
+    else
+    if (mode == TS_MODE_NORMAL)
+    {
+        for (j=0; j<y; j++)
+            for (i=0; i<x; i++)
+            {
+                if (*(&pic[k]) == TS_COL_WHITE)
+                {
+                    color = TSLCDInDat();         // ignore invalid data
+                    color = TSLCDInDat();
+                    TSLCDOutDat(color);
+                }
+                else
+                {
+                    TSLCDOutDat(*(&pic[k]));
+                }
+                k++;
+            }
+    }
+}
+
+void TSLCDFillRect(ts_pos_t sx,ts_pos_t ex,ts_pos_t sy,ts_pos_t ey,unsigned short color,ts_mode_t mode) //draw a rectangular
+{
+    unsigned int x,y;
+    unsigned int i,j;
+    if (sx < ts_margin_xl)
+        sx = ts_margin_xl;
+    if (ex > ts_margin_xr)
+        ex = ts_margin_xr;
+    if (sy < ts_margin_yu)
+        sy = ts_margin_yu;
+    if (ey > ts_margin_yl)             
+        ey = ts_margin_yl;
+
+    TSLCDOutIns(TS_INS_START_ADX);
+    TSLCDOutDat(sx);
+    TSLCDOutIns(TS_INS_END_ADX);
+    TSLCDOutDat(ex);
+    TSLCDOutIns(TS_INS_GRAM_ADX);
+    TSLCDOutDat(sx);
+    x = ex - sx + 1;
+
+#ifndef TS_ORN_PORTRAIT
+    sy = TS_SIZE_Y - 1 - sy;     // mirror start y address
+    ey = TS_SIZE_Y - 1 - ey;     // mirror end y address
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(ey);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(sy);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy);//fix from bug of v1_00
+    y = sy - ey + 1;
+#else
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(sy);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(ey);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy);
+    y = ey - sy + 1;
+#endif
+
+    TSLCDOutIns(TS_INS_RW_GRAM);
+
+    if ((mode == TS_MODE_NORMAL) || (mode == TS_MODE_FULL))
+    {
+        for (j=0; j<y; j++)
+            for (i=0; i<x; i++)
+            {
+                TSLCDOutDat(color);
+            }
+    }
+    else
+    if (mode == TS_MODE_INVERSE)
+    {
+        for (j=0; j<y; j++)
+            for (i=0; i<x; i++)
+            {
+                color = TSLCDInDat();         // ignore invalid data
+                color = TSLCDInDat();
+                TSLCDOutDat(~color);
+            }
+    }
+}
+
+void TSLCDFillCirc(ts_pos_t cx,ts_pos_t cy,ts_pos_t rad,unsigned short color, ts_mode_t mode) //draw a circle
+{
+#ifndef TS_ORN_PORTRAIT
+    int sy_buf,ey_buf;
+#endif
+    int sx,sy,ex,ey;
+    int i,j;
+    unsigned short color_buf;
+    unsigned short rad2 = rad*rad;
+    sx = cx - rad;
+    ex = cx + rad;
+    sy = cy - rad;
+    ey = cy + rad;
+
+    if (sx < ts_margin_xl)
+        sx = ts_margin_xl;
+    if (ex > ts_margin_xr)
+        ex = ts_margin_xr;
+    if (sy < ts_margin_yu)
+        sy = ts_margin_yu;
+    if (ey > ts_margin_yl)             
+        ey = ts_margin_yl;
+
+    TSLCDOutIns(TS_INS_START_ADX);
+    TSLCDOutDat(sx);
+    TSLCDOutIns(TS_INS_END_ADX);
+    TSLCDOutDat(ex);
+    TSLCDOutIns(TS_INS_GRAM_ADX);
+    TSLCDOutDat(sx);
+//    x = ex - sx + 1;
+
+#ifndef TS_ORN_PORTRAIT
+    sy_buf = TS_SIZE_Y - 1 - sy;     // mirror start y address
+    ey_buf = TS_SIZE_Y - 1 - ey;     // mirror end y address
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(ey_buf);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(sy_buf);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy_buf);//fix from bug of v1_00
+//    y = sy_buf - ey_buf + 1;
+#else
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(sy);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(ey);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy);
+//    y = ey - sy + 1;
+#endif
+
+    TSLCDOutIns(TS_INS_RW_GRAM);
+
+    if (mode == TS_MODE_NORMAL)
+    {
+        for (j=sy-cy; j<=ey-cy; j++)
+            for (i=sx-cx; i<=ex-cx; i++)
+            {
+                if ((i)*(i) + (j)*(j) < rad2)
+                {
+                    TSLCDOutDat(color);
+                }
+                else
+                {
+                    color_buf = TSLCDInDat();         // ignore invalid data
+                    color_buf = TSLCDInDat();
+                    TSLCDOutDat(color_buf);
+                }
+            }
+    }
+    else
+    if (mode == TS_MODE_INVERSE)
+    {
+        for (j=sy-cy; j<=ey-cy; j++)
+            for (i=sx-cx; i<=ex-cx; i++)
+            {
+                if ((i)*(i) + (j)*(j) < rad2)
+                {
+                    color_buf = TSLCDInDat();         // ignore invalid data
+                    color_buf = TSLCDInDat();
+                    TSLCDOutDat(~color_buf);
+                }
+                else
+                {
+                    color_buf = TSLCDInDat();         // ignore invalid data
+                    color_buf = TSLCDInDat();
+                    TSLCDOutDat(color_buf);
+                }
+            }
+    }
+    else
+    if (mode == TS_MODE_FULL)
+    {
+        for (j=sy-cy; j<=ey-cy; j++)
+            for (i=sx-cx; i<=ex-cx; i++)
+            {
+                if ((i)*(i) + (j)*(j) < rad2)
+                {
+                    TSLCDOutDat(color);
+                }
+                else
+                {
+                    TSLCDOutDat(back_color);
+                }
+            }
+    }
+}
+
+void TSLCDSetMargins(ts_pos_t xl,ts_pos_t xr,ts_pos_t yu,ts_pos_t yl) //set margins for FillRect,FillCirc
+{
+    ts_margin_xl = xl;
+    ts_margin_xr = xr;
+    ts_margin_yu = yu;
+    ts_margin_yl = yl;
+}
+
+void TSLCDSetMarginsDefault(void) //Reset margins to default value
+{
+    ts_margin_xl = 0;
+    ts_margin_xr = TS_SIZE_X - 1;
+    ts_margin_yu = 0;
+    ts_margin_yl = TS_SIZE_Y - 1;
+}
+
+void buf_store(unsigned char charactor)
+{
+    unsigned char i,j;
+    int char_p = charactor*FONT_SIZE;
+
+    for (i=0; i<FONT_BIT_WIDTH; i++)
+        for (j=0; j<FONT_BYTE_HIGHT; j++)
+        {
+            char_buf[i][j] = *(&font[char_p]);
+            char_p++;
+        }
+}
+
+unsigned char buf_read(unsigned char column,unsigned char row)
+{
+    unsigned char read_pixel;
+
+    if (row < 8)
+    {
+        read_pixel = (char_buf[column][0] >> (7-row)) & 0x01;
+    }
+    else
+    {
+        row = row - 8;
+        read_pixel = (char_buf[column][1] >> (7-row)) & 0x01;
+    }
+    return (read_pixel);
+}
+
+void TSLCDCharDisp(char charactor,ts_pos_t sx,ts_pos_t sy,ts_mode_t mode) //low level function to print a character on LCD
+{
+    unsigned int x,y;
+    unsigned char i,j;
+    ts_pos_t ex,ey;
+    unsigned short c;
+
+    ex = sx + FONT_WIDTH - 1;
+    ey = sy + FONT_HEIGHT - 1;
+
+    buf_store(charactor - 0x20);
+
+    TSLCDOutIns(TS_INS_START_ADX);
+    TSLCDOutDat(sx);
+    TSLCDOutIns(TS_INS_END_ADX);
+    TSLCDOutDat(ex);
+    TSLCDOutIns(TS_INS_GRAM_ADX);
+    TSLCDOutDat(sx);
+    x = ex - sx + 1;
+
+#ifndef TS_ORN_PORTRAIT
+    sy = TS_SIZE_Y - 1 - sy;     // mirror start y address
+    ey = TS_SIZE_Y - 1 - ey;     // mirror end y address
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(ey);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(sy);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy);//fix from bug of v1_00
+    y = sy - ey + 1;
+#else
+    TSLCDOutIns(TS_INS_START_ADY);
+    TSLCDOutDat(sy);
+    TSLCDOutIns(TS_INS_END_ADY);
+    TSLCDOutDat(ey);
+    TSLCDOutIns(TS_INS_GRAM_ADY);
+    TSLCDOutDat(sy);
+    y = ey - sy + 1;
+#endif
+
+    TSLCDOutIns(TS_INS_RW_GRAM);
+
+    if (mode == TS_MODE_NORMAL)
+    {
+        for (j=y; j>0; j--)
+            for (i=0; i<x; i++)
+            {
+                if (buf_read(i,j))
+                {
+                    TSLCDOutDat(font_color);
+                }
+                else
+                {
+                    c = TSLCDInDat();         // ignore invalid data
+                    c = TSLCDInDat();
+                    TSLCDOutDat(c);
+                }
+            }
+    }
+    else
+    if (mode == TS_MODE_INVERSE)
+    {
+        for (j=0; j<y; j++)
+            for (i=0; i<x; i++)
+            {
+                c = TSLCDInDat();             // ignore invalid data
+                c = TSLCDInDat();
+                if (buf_read(i,j))
+                {
+                    TSLCDOutDat(~c);
+                }
+                else
+                {
+                    TSLCDOutDat(c);
+                }
+            }
+    }
+    else
+    if (mode == TS_MODE_FULL)
+    {
+        for (j=0; j<y; j++)
+            for (i=0; i<x; i++)
+            {
+                if (buf_read(i,j))
+                {
+                    TSLCDOutDat(font_color);
+                }
+                else
+                {
+                    TSLCDOutDat(back_color);
+                }
+            }
+    }
+}
+
+void TSLCDSetOffset(ts_pos_t x,ts_pos_t y) //set LCD offset for character display
+{
+    offsetx = x;
+    offsety = y;
+}
+
+void TSLCDPrintStr(unsigned char line,unsigned char column,char *str,ts_mode_t mode) //print string on LCD
+{
+    int i = 0;
+    ts_pos_t posx,posy;
+    posx = offsetx + column*FONT_WIDTH;
+    posy = offsety + line*FONT_HEIGHT;
+
+    while(str[i])
+    {
+        TSLCDCharDisp(str[i],posx,posy,mode);
+        posx += FONT_WIDTH;
+        i++;
+    }
+}
+
+void TSLCDPrintTxt(unsigned char line,unsigned char column,const char *txt,ts_mode_t mode) //print text from code memory
+{
+    int i = 0;
+    ts_pos_t posx,posy;
+    posx = offsetx + column*FONT_WIDTH;
+    posy = offsety + line*FONT_HEIGHT;
+
+    while((&txt[i]))
+    {
+        TSLCDCharDisp(*(&txt[i]),posx,posy,mode);
+        posx += FONT_WIDTH;
+        i++;
+    }
+}
+
+void TSLCDPrintCh(unsigned char line,unsigned char column,char c,ts_mode_t mode) //print a character on LCD
+{
+    ts_pos_t posx,posy;
+    posx = offsetx + column*FONT_WIDTH;
+    posy = offsety + line*FONT_HEIGHT;
+
+    TSLCDCharDisp(c,posx,posy,mode);
+}
+/////
+
+int main() {
+
+	//setSystemFrequency(3, 1, 16, 1);
+       
+    // Do QVGA Setup Stuff
+    TSLCDRst();
+    TSLCDInit();
+    
+    wait_ms(100);
+    lcd_bl.write(1);
+    
+    TSLCDFillRect(0,TS_SIZE_X-1,0,TS_SIZE_Y-1,TS_COL_BLUE,TS_MODE_NORMAL);
+    TSLCDFillRect(0,TS_SIZE_X-1,0,70,TS_COL_WHITE,TS_MODE_NORMAL);
+    TSLCDSetFontColor(TS_COL_BLUE);
+    TSLCDPrintStr(2,6,"Testing ELT240320TP with AVR",TS_MODE_NORMAL);
+    TSLCDFillRect(20,80,90,130,TS_COL_BLACK,TS_MODE_NORMAL);
+    TSLCDFillRect(30,90,100,140,TS_COL_YELLOW,TS_MODE_NORMAL);
+    TSLCDFillRect(20,80,160,200,TS_COL_BLACK,TS_MODE_NORMAL);
+    TSLCDFillRect(30,90,170,210,TS_COL_RED,TS_MODE_NORMAL);
+    TSLCDFillRect(195,205,71,TS_SIZE_Y-1,TS_COL_WHITE,TS_MODE_NORMAL);
+    TSLCDFillCirc(200,155,60,TS_COL_WHITE,TS_MODE_NORMAL);
+    TSLCDFillCirc(200,155,50,TS_COL_BLUE,TS_MODE_NORMAL);
+    TSLCDFillCirc(200,155,40,TS_COL_BLACK,TS_MODE_NORMAL);
+    TSLCDFillCirc(200,155,30,TS_COL_RED,TS_MODE_NORMAL);
+
+    TSLCDFillRect(5, 15, 5, 15, TS_COL_GREEN,TS_MODE_NORMAL);
+    
+    while(1){}
+}
\ No newline at end of file