
#include "stm32h743xx.h"
#include "GraphLow.h"
#include "font.h"
#include "my_font.h"


extern "C"{
#include "extern_C_Include.h"
}

const char ppp[8] = "测试";

const unsigned char *HeadOfLocation;

typedef unsigned short u16;
typedef unsigned int u32;

#define dLCD_HORIZ_SIZE	800
#define dLCD_VERT_SIZE	480

static unsigned char text_buf[76];
volatile static unsigned int FixColor;
volatile static unsigned int *pFixColor;

const unsigned int LcdBaseAddr = 0xC0000000;
const unsigned int LcdTopAddr = 0XC0177000;
Tltdc_dev LtdcDev;

void LcdTopFill(unsigned int aClr)
{
	unsigned int i;
	unsigned int addr =  LcdTopAddr; 
	for(i=0; i<384000;i++){
		*(volatile unsigned int*)(addr) = aClr;
		addr += 4;
	}
}

unsigned int Abs32(signed int num) {
	if(num < 0)
		num = num * -1;
	return num;
}

void SwapCoord(int *c1, int *c2)
{
	int tmp;
	tmp = *c1;
	*c1 = *c2;
	*c2 = tmp;  
}

int GetFontWidth(int FS)
{
	switch(FS){
		case 7: 	return 7;
		case 11:	return 11;
		case 14:	return 14;
		case 17:	return 17;
		
		case 16:	return 16;
		case 24:	return 24;
		case 32:	return 32;
		
		default:	return 16;
	}
}

int GetFontHeight(int FS)
{
	switch(FS){
		case 7: 	return 12;
		case 11:	return 16;
		case 14:	return 20;
		case 17:	return 24;
		
		case 16:	return 16;
		case 24:	return 24;
		case 32:	return 32;
		
		default:	return 16;
	}
}

void PixelRender(int x, int y, unsigned int aColor)
{
	unsigned int addr;
	addr = ((y * 800) + x) *4 + LcdBaseAddr; 
	*(volatile unsigned int*)(addr) = aColor;
}

 void BoxRender2D(int x1, int y1, int x2, int y2, unsigned int color)
{
	LTDC_Fill(x1,y1,x2,y2, color);
                                       
}

void PixelRender(int x, int y,  int PenWidth, unsigned int PenColor)
{
	unsigned int addr; 
	if(PenWidth ==1){
		addr = ((y * 800) + x) *4 + LcdBaseAddr;
		*(volatile unsigned int*)(addr) = PenColor;
	}else{
		int aW, aH;
		for(aW=0; aW<PenWidth; aW++){
			for(aH=0; aH<PenWidth; aH++){
				addr = (((y+aH) * 800) + (x+aW)) *4 + LcdBaseAddr;
				*(volatile unsigned int*)(addr) = PenColor;
			}
		}
		
	}
}

void LineRender (int x1, int y1, int x2, int y2, int PenWidth, unsigned int PenColor)     //draw line - bresenham algorithm
{
   signed int delta_x, delta_y;
   signed int ix, iy;
/*
   if((x1 == x2) || (y1 == y2))  // if the line is vertical or horizontal then draw box function is faster than general bresenham algorithm
   {       
      if(PenWidth > 1 )
      {
        if(x1 > x2)
        {
          SwapCoord(&x1, &x2);
        }
         
        if(y1 > y2)
        {
          SwapCoord(&y1, &y2);
        }
         
        x2++;
        y2++;  
      }
      
      BoxRender2D(x1 ,y1 ,x2 , y2, PenColor);
      
      return;
   }
*/
	if(x1 == x2){
		VertLineRender(x1, y1, y2-y1+1, PenColor);
		return;
	}else
	if(y1 == y2){
		HorizLineRender(x1, y2, x2-x1+1, PenColor);
		return;
	}

   delta_x = static_cast<int>(Abs32((x2 - x1)) << 1);
   delta_y = static_cast<int>(Abs32((y2 - y1)) << 1);

    // if x1 == x2 or y1 == y2, then it does not matter what we set here
    ix = ((x2 > x1)?1:-1);
    iy = ((y2 > y1)?1:-1);

    PixelRender( x1, y1, PenWidth, PenColor);

    if (delta_x >= delta_y)
    {
        // error may go below zero
        int error = delta_y - (delta_x >> 1);

        while (x1 != x2)
        {
            if (error >= 0)
            {
                if (error || (ix > 0))
                {
                    y1 += iy;
                    error -= delta_x;
                }
                // else do nothing
            }
            // else do nothing

            x1 += ix;
            error += delta_y;

            PixelRender( x1, y1, PenWidth, PenColor);
        }
    }
    else
    {
        // error may go below zero
        int error = delta_x - (delta_y >> 1);

        while (y1 != y2)
        {
            if (error >= 0)
            {
                if (error || (iy > 0))
                {
                    x1 += ix;
                    error -= delta_y;
                }
                // else do nothing
            }
            // else do nothing

            y1 += iy;
            error += delta_x;

            PixelRender( x1, y1, PenWidth, PenColor);
        }
    }
    
 }

void HorizLineRender(int xpos, int ypos, int length, unsigned int clr)
{
	unsigned short i;
	unsigned int ram_addr;
	
	ram_addr = LcdBaseAddr + ((ypos  * 800) + xpos) * 4;
	for(i=0; i<length; i++){
		*(volatile unsigned int*)(ram_addr) = clr;
		ram_addr +=4;
	}
}

void VertLineRender(int xpos, int ypos, int length, unsigned int clr)
{
	unsigned int i;
	unsigned int ram_addr;
	
	ram_addr = LcdBaseAddr + ((ypos  * 800) + xpos) * 4;
	for(i=0; i<length; i++){
		*(volatile unsigned int*)(ram_addr) = clr;
		ram_addr += dLCD_HORIZ_SIZE * 4;
	}
}

void RectRender(int x1, int y1, int x2, int y2, int PenWidth, unsigned int color)   //draw rectangle
{
	int i;
	if(PenWidth <2){
		LineRender(x1, y1, x2, y1, PenWidth, color);
		LineRender(x2, y1, x2, y2, PenWidth, color);
		LineRender(x1, y2, x2, y2, PenWidth, color);
		LineRender(x1, y1, x1, y2, PenWidth, color);		
	}else{
		for(i=0; i<PenWidth; i++){
			LineRender(x1+i, y1+i, x2-i, y1+i, 1, color);
			LineRender(x2-i, y1+i, x2-i, y2-i, 1, color);
			LineRender(x1+i, y2-i, x2-i, y2-i, 1, color);
			LineRender(x1+i, y1+i, x1+i, y2-i, 1, color);
		}
	}
}

void RectFillRender(int x1, int y1, int x2, int y2, unsigned int color)   //draw rectangle
{
		/*
	unsigned int psx,psy,pex,pey;	//以LCD面板为基准的坐标系,不随横竖屏变化而变化
	unsigned int timeout=0; 
	unsigned short offline;
	unsigned int addr; 
	

	//坐标系转换
	psx=x1;psy=y1;
	pex=x2;pey=y2;
	
	FixColor = color;
	pFixColor =  &FixColor;

	offline = 800 - (pex-psx);
	addr= LcdBaseAddr + psy * 800 + psx;
	RCC->AHB1ENR|=1<<23;			//使能DM2D时钟
	DMA2D->CR=3<<16;				//寄存器到存储器模式
	DMA2D->BGPFCCR = 0x00;
	DMA2D->FGPFCCR = 0x00;
	DMA2D->OPFCCR=0x00;	//LCD_PIXFORMAT;	//设置颜色格式 LCD_PIXEL_FORMAT_ARGB8888       0X00
	DMA2D->OOR=offline;				//设置行偏移 
	DMA2D->CR&=~(1<<0);				//先停止DMA2D
	DMA2D->OMAR=addr;				//输出存储器地址
	DMA2D->NLR=(pey-psy)|((pex-psx)<<16);	//设定行数寄存器
	DMA2D->OCOLR=FixColor;				//设定输出颜色寄存器 
	DMA2D->CR|=1<<0;				//启动DMA2D
	while((DMA2D->ISR&(1<<1))==0)	//等待传输完成
	{
		timeout++;
		if(timeout>0X2FFFFFF)break;	//超时退出
	}  
	DMA2D->IFCR|=1<<1;				//清除传输完成标志 
	*/

	int x,y,aW,aH;
	volatile unsigned int ram_addr;
	
	if(x1 > x2){
		ram_addr = ((y2 ) * 800 + x2) *4 + LcdBaseAddr;
		aW = x1 -x2 + 1;
		aH = y1 - y2 + 1;	
	}else{
		ram_addr = ((y1 ) * 800 + x1) *4 + LcdBaseAddr;
		aW = x2 -x1 + 1;
		aH = y2 - y1 + 1;		
	}

	
	for(y=0; y<aH; y++){
		for(x=0; x<aW; x++){
			*(volatile  unsigned int *)(ram_addr)  = color;
			ram_addr += 4;
		}
		ram_addr += (800 - aW) *4 ;		
	}	
}

unsigned int lcd_draw_char_8x16(unsigned int xpos, unsigned int ypos, unsigned int clr, char cr)
{
	unsigned int ram_addr;
	unsigned int data_x;
	unsigned int x,y;
	unsigned char c;
	unsigned int state = 0;
	
	//if((xpos+11) > LCD_X_SIZE){
		//beyond screen width
	//	state |= 1;
	//}
	//if((ypos+16) > LCD_V_SIZE){
		//beyond screen height
	//	state |= 2;
	//}
	//if(stete){
	//	return state;
	//}

	ram_addr = ((ypos - 1) * dLCD_HORIZ_SIZE + xpos) * 4;
	
	data_x = static_cast<unsigned int>((cr - ' ' ) * 8 * 2);
	for(y=0;y<16;y++){
		c = 0x80;
		for(x=0;x<8;x++){
			if(ascii_8x16[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			c >>=1;
		}
		c = 0x80;
		data_x++;
		ram_addr += (dLCD_HORIZ_SIZE - 8) *4 ;
	}
	return state;
}

unsigned int lcd_draw_char_8x16(unsigned int xpos, unsigned int ypos, unsigned int clr, unsigned int bClr, char cr)
{
	unsigned int ram_addr;
	unsigned int data_x;
	unsigned int x,y;
	unsigned char c;
	unsigned int state = 0;
	
	//if((xpos+11) > LCD_X_SIZE){
		//beyond screen width
	//	state |= 1;
	//}
	//if((ypos+16) > LCD_V_SIZE){
		//beyond screen height
	//	state |= 2;
	//}
	//if(stete){
	//	return state;
	//}

	ram_addr = ((ypos - 1) * dLCD_HORIZ_SIZE + xpos) * 4;
	
	data_x = static_cast<unsigned int>((cr - ' ' ) * 8 * 2);
	for(y=0;y<16;y++){
		c = 0x80;
		for(x=0;x<8;x++){
			if(ascii_8x16[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;
			}
			ram_addr += 4;
			c >>=1;
		}
		c = 0x80;
		data_x++;
		ram_addr += (dLCD_HORIZ_SIZE - 8) *4 ;
	}
	return state;
}

void lcd_draw_str_8x16(unsigned int xpos,unsigned int ypos,unsigned int clr, char *pc)
{
	unsigned int text_size = 0;
	const char *p_text;
	unsigned int xp;
	unsigned int i;
	
	//get text size
	p_text = pc;
	while (*p_text++) text_size ++ ;
	xp = xpos;
	if(text_size>1024)return;
	for(i=0; i<text_size; i++){
		lcd_draw_char_8x16(xp,ypos,clr,*pc);
		xp += 8;
		pc++;
	}
}

unsigned int lcd_draw_char_11x16(unsigned int xpos, unsigned int ypos, unsigned int clr, char cr)
{
	unsigned int ram_addr;
	unsigned int data_x;
	unsigned int x,y;
	unsigned char c;
	unsigned int state = 0;
	
	//if((xpos+11) > LCD_X_SIZE){
		//beyond screen width
	//	state |= 1;
	//}
	//if((ypos+16) > LCD_V_SIZE){
		//beyond screen height
	//	state |= 2;
	//}
	//if(stete){
	//	return state;
	//}

	ram_addr = ((ypos - 1) * dLCD_HORIZ_SIZE + xpos) * 4;
	
	data_x = static_cast<unsigned int>((cr - ' ' ) * 16 * 2);
	for(y=0;y<16;y++){
		c = 0x80;
		for(x=0;x<8;x++){
			if(ascii_11x16_table[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			c >>=1;
		}
		c = 0x80;
		data_x++;
		for(x=0;x<3;x++){
			if(ascii_11x16_table[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			c >>=1;
		}
		data_x++;
		ram_addr += (dLCD_HORIZ_SIZE - 11) *4 ;
	}
	return state;
}

void lcd_draw_str_11x16(unsigned int xpos,unsigned int ypos,unsigned int clr,const char *pc)
{
	unsigned int text_size = 0;
	const char *p_text;
	unsigned int xp;
	unsigned int i;
	
	//get text size
	p_text = pc;
	while (*p_text++) text_size ++ ;
	xp = xpos;
	if(text_size>1024)return;
	for(i=0; i<text_size; i++){
		lcd_draw_char_11x16(xp,ypos,clr,*pc);
		xp += 11;
		pc++;
	}
}

void lcd_draw_str_11x16(unsigned int xpos,unsigned int ypos,unsigned int clr, char *pc)
{
	unsigned int text_size = 0;
	char *p_text;
	unsigned int xp;
	unsigned int i;
	
	//get text size
	p_text = pc;
	while (*p_text++) text_size ++ ;
	xp = xpos;
	if(text_size>1024)return;
	for(i=0; i<text_size; i++){
		lcd_draw_char_11x16(xp,ypos,clr,*pc);
		xp += 11;
		pc++;
	}
}


unsigned int lcd_draw_char_14x20(unsigned int xpos, unsigned int ypos, unsigned int clr, unsigned char cr)
{
	unsigned int ram_addr;
	unsigned int data_x;
	unsigned int x,y;
	unsigned char c;
	unsigned int state = 0;
	
	//if((xpos+14) > LCD_X_SIZE){
		//beyond screen width
	//	state |= 1;
	//}
	//if((ypos+20) > LCD_V_SIZE){
		//beyond screen height
	//	state |= 2;
	//}
	//if(stete){
	//	return state;
	//}

	ram_addr = ((ypos - 1) * dLCD_HORIZ_SIZE + xpos) * 4;
	
	data_x = (unsigned int)((cr - ' ' ) * 20 * 2);
	for(y=0;y<20;y++){
		c = 0x80;
		for(x=0;x<8;x++){
			if(ascii_14x20_table[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			c >>=1;
		}
		c = 0x80;
		data_x++;
		for(x=0;x<6;x++){
			if(ascii_14x20_table[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			c >>=1;
		}
		data_x++;
		ram_addr += (dLCD_HORIZ_SIZE - 14) *4 ;
	}
	return state;
}

void lcd_draw_str_14x20(unsigned int xpos,unsigned int ypos, unsigned int clr, const char *pc)
{
	unsigned int text_size = 0;
	const char *p_text;
	unsigned int xp;
	unsigned int i;
	
	//get text size
	p_text = pc;
	while (*p_text++) text_size ++ ;
	xp = xpos;
	if(text_size > 1024)return;
	for(i=0; i<text_size; i++){
		lcd_draw_char_14x20(xp,ypos,clr,*pc);
		xp += 14;
		pc++;
	}
}

void lcd_draw_str_14x20(unsigned int xpos,unsigned int ypos, unsigned int clr, char *pc)
{
	unsigned int text_size = 0;
	char *p_text;
	unsigned int xp;
	unsigned int i;
	
	//get text size
	p_text = pc;
	while (*p_text++) text_size ++ ;
	xp = xpos;
	if(text_size > 1024)return;
	for(i=0; i<text_size; i++){
		lcd_draw_char_14x20(xp,ypos,clr,*pc);
		xp += 14;
		pc++;
	}
}


unsigned int lcd_draw_char_17x24(unsigned int xpos, unsigned int ypos, unsigned int clr, unsigned char cr)
{
	unsigned int ram_addr;
	unsigned int data_x;
	unsigned int x,y;
	unsigned char c;
	unsigned int state = 0;
	
	//if((xpos+17) > LCD_X_SIZE){
		//beyond screen width
	//	state |= 1;
	//}
	//if((ypos+24) > LCD_V_SIZE){
		//beyond screen height
	//	state |= 2;
	//}
	//if(stete){
	//	return state;
	//}

	ram_addr = ((ypos - 1) * dLCD_HORIZ_SIZE + xpos) * 4;
	
	data_x = static_cast<unsigned int>((cr - ' ' ) * 24 * 3);
	for(y=0;y<24;y++){
		c = 0x80;
		for(x=0;x<8;x++){ 
			if(ascii_17x24_table[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			//add lint here
			c >>=1;
		}
		c = 0x80;
		data_x++;
		for(x=0;x<8;x++){ //ascii_17x24_table
			if(ascii_17x24_table[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			//add lint here
			c >>=1;
		}
		c = 0x80;
		data_x++;
		if(1){ 
			if(ascii_17x24_table[data_x] & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = clr;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 4;
			//add lint here
			c >>=1;
		}
		data_x++;
		ram_addr += (dLCD_HORIZ_SIZE - 17) *4 ;
	}
	return state;
}

void lcd_draw_str_17x24(unsigned int xpos,unsigned int ypos, unsigned int clr, unsigned char *pc)
{
	unsigned int text_size = 0;
	unsigned char *p_text;
	unsigned int xp;
	unsigned int i;
	
	//get text size
	p_text = pc;
	while (*p_text++) text_size ++ ;
	xp = xpos;
	if(text_size > 1024)return;
	for(i=0; i<text_size; i++){
		lcd_draw_char_17x24(xp,ypos,clr,*pc);
		xp += 17;
		pc++;
	}
}


void gui_write_EN2412(unsigned short x1, unsigned short y1, unsigned int CharColor, unsigned char num)
{
	const unsigned char* pbuf;
	unsigned int x, y; 
	unsigned short ix, iy;
	unsigned int offset = 0;
	
	unsigned int ram_addr;
	unsigned char c;
	
	x = x1;
	y = y1;
	
 	//num=num-' ';//得到偏移后的值（ASCII字库是从空格开始取模，所以-' '就是对应字符的字库）
	offset = (num-' ');
	pbuf = &asc2_2412[offset][0];
	
	
	for(y=0;y<12;y++){
		ram_addr = (y1 * dLCD_HORIZ_SIZE + x1) * 4;
		c = 0x80;
		for(x=0;x<8;x++){ 
			if(*pbuf & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 3200;
			//add lint here
			c >>=1;
		}
		pbuf++;
		c = 0x80;
		for(x=0;x<8;x++){ //ascii_17x24_table
			if(*pbuf & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 3200;
			//add lint here
			c >>=1;
		}
		pbuf++;
		c = 0x80;
		for(x=0;x<8;x++){ 
			if(*pbuf & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;
			}else{
				//ram_x = ~clr;
			}
			ram_addr += 3200;
			//add lint here
			c >>=1;
		}
		pbuf++;
		x1++;
	}
}


void gui_write_EN2412(unsigned short x1, unsigned short y1, unsigned int CharColor, unsigned int bClr, unsigned char num)
{
	const unsigned char* pbuf;
	unsigned int x, y; 
	unsigned short ix, iy;
	unsigned int offset = 0;
	
	unsigned int ram_addr;
	unsigned char c;
	
	x = x1;
	y = y1;
	
 	//num=num-' ';//得到偏移后的值（ASCII字库是从空格开始取模，所以-' '就是对应字符的字库）
	offset = (num-' ');
	pbuf = &asc2_2412[offset][0];
	
	
	for(y=0;y<12;y++){
		ram_addr = (y1 * dLCD_HORIZ_SIZE + x1) * 4;
		c = 0x80;
		for(x=0;x<8;x++){ 
			if(*pbuf & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;
			}else{
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;
			}
			ram_addr += 3200;
			//add lint here
			c >>=1;
		}
		pbuf++;
		c = 0x80;
		for(x=0;x<8;x++){ //ascii_17x24_table
			if(*pbuf & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;
			}else{
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;
			}
			ram_addr += 3200;
			//add lint here
			c >>=1;
		}
		pbuf++;
		c = 0x80;
		for(x=0;x<8;x++){ 
			if(*pbuf & c){
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;
			}else{
				*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;
			}
			ram_addr += 3200;
			//add lint here
			c >>=1;
		}
		pbuf++;
		x1++;
	}
}

static unsigned int get_chinese_code24(const char *p)
{
	u32 address;
	address=72UL*( ((*p)-15-0xa1)*94 + ((*(p+1))-0xa1) );
	//sFLASH_ReadBuffer(dot, address, 72);
	return address;
}

static unsigned int get_chinese_code24(char *p)
{
	u32 address;
	address=72UL*( ((*p)-15-0xa1)*94 + ((*(p+1))-0xa1) );
	//sFLASH_ReadBuffer(dot, address, 72);
	return address;
}

static unsigned int get_chinese_code24(unsigned char *p)
{
	u32 address;
	address=72UL*( ((*p)-15-0xa1)*94 + ((*(p+1))-0xa1) );
	//sFLASH_ReadBuffer(dot, address, 72);
	return address;
}

static unsigned int get_C_code24(const char *p)
{
	u32 address;
	if((*(p+1)) < 0x7F){
		address=72UL*( ((*p)-0x81)*190 + ((*(p+1))-0x40) );
	}else{
		address=72UL*( ((*p)-0x81)*190 + ((*(p+1))-0x41) );
	}
	//sFLASH_ReadBuffer(dot, address, 72);
	return address;
}

static unsigned int get_C_code24(char *p)
{
	u32 address;
	if((*(p+1)) < 0x7F){
		address=72UL*( ((*p)-0x81)*190 + ((*(p+1))-0x40) );
	}else{
		address=72UL*( ((*p)-0x81)*190 + ((*(p+1))-0x41) );
	}
	//sFLASH_ReadBuffer(dot, address, 72);
	return address;
}

static unsigned int get_C_code24(unsigned char *p)
{
	u32 address;
	if((*(p+1)) < 0x7F){
		address=72UL*( ((*p)-0x81)*190 + ((*(p+1))-0x40) );
	}else{
		address=72UL*( ((*p)-0x81)*190 + ((*(p+1))-0x41) );
	}
	//sFLASH_ReadBuffer(dot, address, 72);
	return address;
}

void TextRender_1CN24(int x, int y, unsigned int CharColor, const char *p)
{
	const unsigned char* pbuf;
	unsigned short ix, iy;
	unsigned int ram_addr;
	static unsigned int offset = 0;
	unsigned char c;
	
	//if((*p<0xA1) || (*(p+1)< 0xA1)){
	if(1){
		offset = get_C_code24(p);
		
		HeadOfLocation = (const unsigned char *)Gbk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(iy=0; iy<24; iy++){
			ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
      
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy+8, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
			
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++)
			{
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy+16, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
					
			pbuf++;
			y++;
		   }	
	}else{
		offset = get_chinese_code24( p);
		
		//______________________________fill location
		//HeadOfLocation = Hzk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(ix=0; ix<24; ix++){
		ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
      
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy+8, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
			
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy+16, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
				
		pbuf++;
		x++;
	   }
	}	 
}

void TextRender_1CN24(int x, int y, unsigned int CharColor, char *p)
{
	const unsigned char* pbuf;
	unsigned short ix, iy;
	unsigned int ram_addr;
	unsigned int offset = 0;
	unsigned char c;
   
	//if((*p<0xA1) || (*(p+1)< 0xA1)){
	if(1){
		offset = get_C_code24(p);
		
		HeadOfLocation = (const unsigned char *)Gbk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(iy=0; iy<24; iy++){
			ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
      
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy+8, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
			
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++)
			{
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy+16, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
					
			pbuf++;
			y++;
		   }	
	}else{
		offset = get_chinese_code24( p);
		
		//______________________________fill location
		//HeadOfLocation = Hzk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(ix=0; ix<24; ix++){
		ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
      
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy+8, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
			
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy+16, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
				
		pbuf++;
		x++;
	   }
	}	 
}


void TextRender_1CN24(int x, int y, unsigned int CharColor, unsigned char *p)
{
	const unsigned char* pbuf;
	unsigned short ix, iy;
	unsigned int ram_addr;
	unsigned int offset = 0;
	unsigned char c;
   
	//if((*p<0xA1) || (*(p+1)< 0xA1)){
	if(1){
		offset = get_C_code24(p);
		
		HeadOfLocation = (const unsigned char *)Gbk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(iy=0; iy<24; iy++){
			ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
      
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy+8, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
			
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++)
			{
				if( (*pbuf & c)==0 ){
					//gui_put_pixel(x, y+iy+16, 0, BackColor);		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
					
			pbuf++;
			y++;
		   }	
	}else{
		offset = get_chinese_code24( p);
		
		//______________________________fill location
		//HeadOfLocation = Hzk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(ix=0; ix<24; ix++){
		ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
      
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy+8, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
			
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			//gui_put_pixel(x, y+iy+16, 0, BackColor);		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
				
		pbuf++;
		x++;
	   }
	}	 
}



void TextRender_1CN24(int x, int y, unsigned int CharColor, unsigned int bClr, const char *p)
{
	const unsigned char* pbuf;
	unsigned short ix, iy;
	unsigned int ram_addr;
	unsigned int offset = 0;
	unsigned char c;
   
	//if((*p<0xA1) || (*(p+1)< 0xA1)){
	if(1){
		offset = get_C_code24(p);
		
		HeadOfLocation = (const unsigned char *)Gbk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(iy=0; iy<24; iy++){
			ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
      
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++){
				if( (*pbuf & c)==0 ){
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
			
			pbuf++;
			c = 0x80;
			for(ix=0; ix<8; ix++)
			{
				if( (*pbuf & c)==0 ){
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;		//______________________________put pixel here
				}else{
					*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
				}
				ram_addr += 4;
				c >>=1;
			}
					
			pbuf++;
			y++;
		   }	
	}else{
		offset = get_chinese_code24( p);
		
		//______________________________fill location
		//HeadOfLocation = Hzk_24_data;
		pbuf = &HeadOfLocation[offset];
		
		for(ix=0; ix<24; ix++){
		ram_addr = (y * dLCD_HORIZ_SIZE + x) * 4;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
      
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
			
		pbuf++;
		c = 0x80;
		for(iy=0; iy<8; iy++){
		   if( (*pbuf & c)==0 ){
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = bClr;		//______________________________put pixel here
		   }else{
			*(volatile unsigned int *)(LcdBaseAddr+ ram_addr)  = CharColor;	//______________________________put pixel here
		   }
			ram_addr += 3200;
		   c >>=1;
		}
				
		pbuf++;
		x++;
	   }
	}	 	
}


void TextRender_string24(int x, int y, unsigned int CharColor, unsigned char* pC)
{
	unsigned char dat;
	unsigned char *p;
	
	p = pC;
	
   for(; *p!=0; p++)
   {
      if(( (unsigned char)*p&0x80)==0)//??
      {
         if(*p=='\r')//??
         {
            //x=START_X;
            continue;
         }
         else if(*p=='\n')//??
         {
            //y+=24;
            //if(y > RECT_YMAX-24)
            //   y=START_Y;
            continue;
         }
         else if(*p=='\1')         //?????.?
            dat='~'-' '+1;
         else if(*p=='\2')    //?????.?
            dat='~'-' '+2;
         else if(*p=='\3')    //?????.?
            dat='~'-' '+3;
         else if(*p=='\4')    //?????.?
            dat='~'-' '+4;
//         else if(*p=='\\')    //?????
//         {
//            p++;
//            if(*p=='U')         //?????.?
//               dat='~'-' '+1;
//            else if(*p=='D')    //?????.?
//               dat='~'-' '+2;
//            else if(*p=='L')    //?????.?
//               dat='~'-' '+3;
//            else// if(*p=='R')    //?????.?
//               dat='~'-' '+4;
//         }
         else //??????
            dat=*p-0x20;  
         
		dat=*p;
		gui_write_EN2412(x, y, CharColor, dat);
		x+=12;
         //gui_write_EN2417(x, y, CharColor, BackColor, dat);
         //x+=17;
      }
			
      else//??
      {
        TextRender_1CN24(x, y, CharColor, p);
         x+=24;
         p++;
      }
   }	
}


void TextRender_string24(int x, int y, unsigned int CharColor, unsigned int aBClr, unsigned char* pC)
{
	unsigned char dat;
	unsigned char *p;
	
	p = pC;
	
   for(; *p!=0; p++)
   {
      if(( (unsigned char)*p&0x80)==0)//??
      {
         if(*p=='\r')//??
         {
            //x=START_X;
            continue;
         }
         else if(*p=='\n')//??
         {
            //y+=24;
            //if(y > RECT_YMAX-24)
            //   y=START_Y;
            continue;
         }
         else if(*p=='\1')         //?????.?
            dat='~'-' '+1;
         else if(*p=='\2')    //?????.?
            dat='~'-' '+2;
         else if(*p=='\3')    //?????.?
            dat='~'-' '+3;
         else if(*p=='\4')    //?????.?
            dat='~'-' '+4;
//         else if(*p=='\\')    //?????
//         {
//            p++;
//            if(*p=='U')         //?????.?
//               dat='~'-' '+1;
//            else if(*p=='D')    //?????.?
//               dat='~'-' '+2;
//            else if(*p=='L')    //?????.?
//               dat='~'-' '+3;
//            else// if(*p=='R')    //?????.?
//               dat='~'-' '+4;
//         }
         else //??????
            dat=*p-0x20;  
         
		dat=*p;
		gui_write_EN2412(x, y, CharColor, aBClr, dat);
		x+=12;
         //gui_write_EN2417(x, y, CharColor, BackColor, dat);
         //x+=17;
      }
			
      else//??
      {
        TextRender_1CN24(x, y, CharColor, aBClr, (const char *)(p));
         x+=24;
         p++;
      }
   }	
}

void TextRender_string24(int x, int y, unsigned int CharColor, const char* pC)
{
 unsigned char dat;
	const char *p;
	
	p = pC;
	
   for(; *p!=0; p++)
   {
      if(( (unsigned char)*p&0x80)==0)//??
      {
         if(*p=='\r')//??
         {
            //x=START_X;
            continue;
         }
         else if(*p=='\n')//??
         {
            //y+=24;
            //if(y > RECT_YMAX-24)
            //   y=START_Y;
            continue;
         }
         else if(*p=='\1')         //?????.?
            dat='~'-' '+1;
         else if(*p=='\2')    //?????.?
            dat='~'-' '+2;
         else if(*p=='\3')    //?????.?
            dat='~'-' '+3;
         else if(*p=='\4')    //?????.?
            dat='~'-' '+4;
//         else if(*p=='\\')    //?????
//         {
//            p++;
//            if(*p=='U')         //?????.?
//               dat='~'-' '+1;
//            else if(*p=='D')    //?????.?
//               dat='~'-' '+2;
//            else if(*p=='L')    //?????.?
//               dat='~'-' '+3;
//            else// if(*p=='R')    //?????.?
//               dat='~'-' '+4;
//         }
         else //??????
            dat=*p-0x20;  
         
		dat=*p;
		gui_write_EN2412(x, y, CharColor, dat);
		x+=12;
         //gui_write_EN2417(x, y, CharColor, BackColor, dat);
         //x+=17;
      }
			
      else//??
      {
        TextRender_1CN24(x, y, CharColor, p);
         x+=24;
         p++;
      }
   }	
}

void TextRender_string24(int x, int y, unsigned int CharColor, char* pC)
{
	unsigned char dat;
	const char *p;
	
	p = pC;
   
   for(; *p!=0; p++)
   {
      if(( (unsigned char)*p&0x80)==0)//??
      {
         if(*p=='\r')//??
         {
            //x=START_X;
            continue;
         }
         else if(*p=='\n')//??
         {
            //y+=24;
            //if(y > RECT_YMAX-24)
            //   y=START_Y;
            continue;
         }
         else if(*p=='\1')         //?????.?
            dat='~'-' '+1;
         else if(*p=='\2')    //?????.?
            dat='~'-' '+2;
         else if(*p=='\3')    //?????.?
            dat='~'-' '+3;
         else if(*p=='\4')    //?????.?
            dat='~'-' '+4;
//         else if(*p=='\\')    //?????
//         {
//            p++;
//            if(*p=='U')         //?????.?
//               dat='~'-' '+1;
//            else if(*p=='D')    //?????.?
//               dat='~'-' '+2;
//            else if(*p=='L')    //?????.?
//               dat='~'-' '+3;
//            else// if(*p=='R')    //?????.?
//               dat='~'-' '+4;
//         }
         else //??????
            dat=*p-0x20;  
         
		dat=*p;
		gui_write_EN2412(x, y, CharColor, dat);
		x+=12;
         //gui_write_EN2417(x, y, CharColor, BackColor, dat);
         //x+=17;
      }
			
      else//??
      {
        TextRender_1CN24(x, y, CharColor, p);
         x+=24;
         p++;
      }
   }	
}

void TextRender_string24(int x, int y, unsigned int CharColor, unsigned int bClr, char* pC)
{
	unsigned char dat;
	const char *p;
	
	p = pC;
   
   for(; *p!=0; p++)
   {
      if(( (unsigned char)*p&0x80)==0)//??
      {
         if(*p=='\r')//??
         {
            //x=START_X;
            continue;
         }
         else if(*p=='\n')//??
         {
            //y+=24;
            //if(y > RECT_YMAX-24)
            //   y=START_Y;
            continue;
         }
         else if(*p=='\1')         //?????.?
            dat='~'-' '+1;
         else if(*p=='\2')    //?????.?
            dat='~'-' '+2;
         else if(*p=='\3')    //?????.?
            dat='~'-' '+3;
         else if(*p=='\4')    //?????.?
            dat='~'-' '+4;
//         else if(*p=='\\')    //?????
//         {
//            p++;
//            if(*p=='U')         //?????.?
//               dat='~'-' '+1;
//            else if(*p=='D')    //?????.?
//               dat='~'-' '+2;
//            else if(*p=='L')    //?????.?
//               dat='~'-' '+3;
//            else// if(*p=='R')    //?????.?
//               dat='~'-' '+4;
//         }
         else //??????
            dat=*p-0x20;  
         
		dat=*p;
		gui_write_EN2412(x, y, CharColor, bClr, dat);
		x+=12;
         //gui_write_EN2417(x, y, CharColor, BackColor, dat);
         //x+=17;
      }
			
      else//??
      {
        TextRender_1CN24(x, y, CharColor, bClr, p);
         x+=24;
         p++;
      }
   }	
}

void TextRender_string24(int x, int y, unsigned int CharColor, unsigned int bClr, const char* pC)
{
	unsigned char dat;
	const char *p;
	
	p = pC;
   
   for(; *p!=0; p++)
   {
      if(( (unsigned char)*p&0x80)==0)//??
      {
         if(*p=='\r')//??
         {
            //x=START_X;
            continue;
         }
         else if(*p=='\n')//??
         {
            //y+=24;
            //if(y > RECT_YMAX-24)
            //   y=START_Y;
            continue;
         }
         else if(*p=='\1')         //?????.?
            dat='~'-' '+1;
         else if(*p=='\2')    //?????.?
            dat='~'-' '+2;
         else if(*p=='\3')    //?????.?
            dat='~'-' '+3;
         else if(*p=='\4')    //?????.?
            dat='~'-' '+4;
//         else if(*p=='\\')    //?????
//         {
//            p++;
//            if(*p=='U')         //?????.?
//               dat='~'-' '+1;
//            else if(*p=='D')    //?????.?
//               dat='~'-' '+2;
//            else if(*p=='L')    //?????.?
//               dat='~'-' '+3;
//            else// if(*p=='R')    //?????.?
//               dat='~'-' '+4;
//         }
         else //??????
            dat=*p-0x20;  
         
		dat=*p;
		gui_write_EN2412(x, y, CharColor, bClr, dat);
		x+=12;
         //gui_write_EN2417(x, y, CharColor, BackColor, dat);
         //x+=17;
      }
			
      else//??
      {
        TextRender_1CN24(x, y, CharColor, bClr, p);
         x+=24;
         p++;
      }
   }	
}

void TextDigitRender1Right24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int da;
	da = dig % 10;
	gui_write_EN2412(x, y, CharColor, da + '0');	
}

void TextDigitRender1Right24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int da;
	da = dig % 10;
	gui_write_EN2412(x, y, CharColor, bClr, da + '0');	
}

void TextDigitRenderLeft24_1t3(int x, int y, unsigned int CharColor,   			 unsigned int dig)
{
	if(dig > 999)return;
	if(dig < 10){
		gui_write_EN2412(x, y, CharColor, dig + '0');
	}else
	if(dig < 100){
		TextDigitRender2Right24(x,y,CharColor,dig);
	}else{
		TextDigitRender3Right24(x,y,CharColor,dig);
	}
}

void TextDigitRenderLeft24_1t3(int x, int y, unsigned int CharColor, unsigned int BackClr, unsigned int dig)
{
	if(dig > 999)return;
	if(dig < 10){
		gui_write_EN2412(x, y, CharColor, BackClr, dig + '0');
	}else
	if(dig < 100){
		TextDigitRender2Right24(x,y,CharColor,BackClr,dig);
	}else{
		TextDigitRender3Right24(x,y,CharColor,BackClr,dig);
	}
}

void TextDigitRender2_24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 10;
	da = dig;
	for(i=0; i<2; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}	
}

void TextDigitRender2_24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 10;
	da = dig;
	for(i=0; i<2; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}	
}

void TextDigitRender2Right24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 12;
		gui_write_EN2412(x2, y, CharColor, '0');
	}
	x2 = x;
	Found = 0;
	aRatio = 10;
	da = dig;
	for(i=0; i<2; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, Le + '0');
		}else{
			if(Le == 0){
				if(i == 1)gui_write_EN2412(x2, y, CharColor, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, Le + '0');
				Found = 1;
			}
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}	
}

void TextDigitRender2Right24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 12;
		gui_write_EN2412(x2, y, CharColor, '0');
	}
	x2 = x;
	Found = 0;
	aRatio = 10;
	da = dig;
	for(i=0; i<2; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		}else{
			if(Le == 0){
				gui_write_EN2412(x2, y, CharColor, bClr, ' ');
				if(i == 1)gui_write_EN2412(x2, y, CharColor, bClr, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, bClr,  Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}	
}

void TextDigitRender3_24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 100;
	da = dig;
	for(i=0; i<3; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender3_24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 100;
	da = dig;
	for(i=0; i<3; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender4_24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 1000;
	da = dig;
	for(i=0; i<4; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender4_24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 1000;
	da = dig;
	for(i=0; i<4; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender5_24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 10000;
	da = dig;
	for(i=0; i<5; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender5_24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 10000;
	da = dig;
	for(i=0; i<5; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender6_24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 100000;
	da = dig;
	for(i=0; i<6; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender6_24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 100000;
	da = dig;
	for(i=0; i<6; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender8_24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 10000000;
	da = dig;
	for(i=0; i<8; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender8_24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	x2 = x;
	aRatio = 10000000;
	da = dig;
	for(i=0; i<8; i++){
		Le = da / aRatio;
		da = da % aRatio;
		gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender3Right24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 24;
		gui_write_EN2412(x2, y, CharColor, '0');
	}
	x2 = x;
	Found = 0;
	aRatio = 100;
	da = dig;
	for(i=0; i<3; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, Le + '0');
		}else{
			if(Le == 0){
				//if(Found)gui_write_EN2412(x2, y, CharColor, ' ');
				if(i == 2)gui_write_EN2412(x2, y, CharColor, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}	
}

void TextDigitRender3Right24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 0;
		gui_write_EN2412(x2, y, CharColor, bClr, ' ');
		x2 = x + 12;
		gui_write_EN2412(x2, y, CharColor, bClr, ' ');
		x2 = x + 24;
		gui_write_EN2412(x2, y, CharColor, bClr, '0');
	}
	x2 = x;
	Found = 0;
	aRatio = 100;
	da = dig;
	for(i=0; i<3; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		}else{
			if(Le == 0){
				gui_write_EN2412(x2, y, CharColor, bClr, ' ');
				if(i == 2)gui_write_EN2412(x2, y, CharColor, bClr, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender4Right24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 36;
		gui_write_EN2412(x2, y, CharColor, '0');
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 1000;
	da = dig;
	for(i=0; i<4; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, Le + '0');
		}else{
			if(Le == 0){
				//if(Found)gui_write_EN2412(x2, y, CharColor, ' ');
				if(i == 3)gui_write_EN2412(x2, y, CharColor, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender4Right24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 36;
		gui_write_EN2412(x2, y, CharColor, bClr, '0');
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 1000;
	da = dig;
	for(i=0; i<4; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		}else{
			if(Le == 0){
				if(i == 3)gui_write_EN2412(x2, y, CharColor, bClr, '0');
				else gui_write_EN2412(x2, y, CharColor, bClr, ' ');
			}else{
				gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender5Right24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 48;
		gui_write_EN2412(x2, y, CharColor, '0');
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 10000;
	da = dig;
	for(i=0; i<5; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, Le + '0');
		}else{
			if(Le == 0){
				//if(Found)gui_write_EN2412(x2, y, CharColor, ' ');
				if(i == 4)gui_write_EN2412(x2, y, CharColor, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender5Right24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 48;
		gui_write_EN2412(x2, y, CharColor, bClr, '0');
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 10000;
	da = dig;
	for(i=0; i<5; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		}else{
			if(Le == 0){
				if(i == 4)gui_write_EN2412(x2, y, CharColor, bClr, '0');
				else gui_write_EN2412(x2, y, CharColor, bClr, ' ');
			}else{
				gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender6Right24(int x, int y, unsigned int CharColor, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 60;
		gui_write_EN2412(x2, y, CharColor, '0');
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 100000;
	da = dig;
	for(i=0; i<6; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, Le + '0');
		}else{
			if(Le == 0){
				//if(Found)gui_write_EN2412(x2, y, CharColor, ' ');
				if(i == 5)gui_write_EN2412(x2, y, CharColor, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}
}

void TextDigitRender6Right24(int x, int y, unsigned int CharColor, unsigned int bClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x + 60;
		gui_write_EN2412(x2, y, CharColor, bClr, '0');
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 100000;
	da = dig;
	for(i=0; i<6; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
		}else{
			if(Le == 0){
				if(i == 5)gui_write_EN2412(x2, y, CharColor, bClr, '0');
				else gui_write_EN2412(x2, y, CharColor, bClr, ' ');
			}else{
				gui_write_EN2412(x2, y, CharColor, bClr, Le + '0');
				Found = 1;
			}		
		}
		aRatio = aRatio / 10;
		x2 += 12;
	}
}


void TextDigitRender5Left24(int x, int y, unsigned int CharColor, unsigned int BackClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x;
		gui_write_EN2412(x2, y, CharColor, BackClr, '0');
		x2 += 12;
		for(Found=1; Found<5; Found++){
			gui_write_EN2412(x2, y, CharColor, BackClr, ' ');
			x2 += 12;
		}
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 10000;
	da = dig;
	for(i=0; i<5; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, BackClr, Le + '0');
			Found++;
		}else{
			if(Le == 0){
				//if(Found)gui_write_EN2412(x2, y, BackClr, ' ');
				if(i == 5)gui_write_EN2412(x2, y, CharColor, BackClr, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, BackClr, Le + '0');
				Found =1;
			}		
		}
		aRatio = aRatio / 10;
		if(Found)x2 += 12;
	}
	if(Found <5){
		for(; Found<5; Found++){
			gui_write_EN2412(x2, y, CharColor, BackClr, ' ');
			x2 += 12;
		}
	}
}


void TextDigitRender6Left24(int x, int y, unsigned int CharColor, unsigned int BackClr, unsigned int dig)
{
	unsigned int i, da, Le, Ta, x2, aRatio, Found;
	if(dig == 0){
		x2 = x;
		gui_write_EN2412(x2, y, CharColor, BackClr, '0');
		x2 += 12;
		for(Found=1; Found<6; Found++){
			gui_write_EN2412(x2, y, CharColor, BackClr, ' ');
			x2 += 12;
		}
		return;
	}
	x2 = x;
	Found = 0;
	aRatio = 100000;
	da = dig;
	for(i=0; i<6; i++){
		Le = da / aRatio;
		da = da % aRatio;
		if(Found){
			gui_write_EN2412(x2, y, CharColor, BackClr, Le + '0');
			Found++;
		}else{
			if(Le == 0){
				//if(Found)gui_write_EN2412(x2, y, BackClr, ' ');
				if(i == 5)gui_write_EN2412(x2, y, CharColor, BackClr, '0');
			}else{
				gui_write_EN2412(x2, y, CharColor, BackClr, Le + '0');
				Found =1;
			}		
		}
		aRatio = aRatio / 10;
		if(Found)x2 += 12;
	}
	if(Found <6){
		for(; Found<6; Found++){
			gui_write_EN2412(x2, y, CharColor, BackClr, ' ');
			x2 += 12;
		}
	}
}

void TextRender(int x1, int y1, const char *p, unsigned int aColor, int aFontSize)
{
	
}

void TextRenderAscii_20(unsigned int x,unsigned int y, unsigned int clr,const char *pc)
{
	lcd_draw_str_14x20(x,y, clr,pc);
}

void TextRenderAscii_20(unsigned int x,unsigned int y, unsigned int clr, char *pc)
{
	lcd_draw_str_14x20(x,y, clr,pc);
}

void TextRenderAscii_16(unsigned int x,unsigned int y, unsigned int clr, const char *pc)
{
	lcd_draw_str_11x16(x,y,clr,pc);
}

void TextRenderAscii_16(unsigned int x,unsigned int y, unsigned int clr, char *pc)
{
	lcd_draw_str_11x16(x,y,clr,pc);
}






