Test application based on the AVR examples provided by ThaiEasyElec for their ELT240320ATP breakout board -- library works rather slow on the mbed platform.
Diff: main.cpp
- Revision:
- 0:4395705c8647
diff -r 000000000000 -r 4395705c8647 main.cpp --- /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