include "gui.h"
#ifdef USE_FONT_UPDATE
#include "ff.h"
#include "diskio.h"
#endif
#ifdef USE_FLASH_CHAR
#include "flash.h"
#else
#include "asciicode.h"
#include "chfont.h"
#endif
#ifdef USE_FONT_UPDATE
#include "malloc.h"
#endif
//---èç1ûòaÏÔê¾í¼Æ¬¾íìí¼óÕa¸öí·Îļt---//
#ifdef PICTURE_SHOW
#include "picture.h"
#endif
/****************************************************************************
* Function Name : GUI_Dot
* Description : Ôú2êÆáéÏÃæ»-ò»μã
* Input : x£oμãμÄX×ø±ê
* * y£oμãμÄY×ø±ê
* * color£oμãμÄÑÕé«
* Output : None
* Return : None
****************************************************************************/
void GUI_Dot(uint16_t x, uint16_t y, uint16_t color)
{
TFT_SetWindow(x, y, x, y); //éèÖÃμãμÄλÖÃ
TFT_WriteData_Color(color); //»-μã
}
/****************************************************************************
*oˉêyÃû£oGUI_Line
*êä èë£oxStart£oÖ±ÏßμÄÆeê¼X×ø±ê
* * yStart£oÖ±ÏßμÄÆäêμY×ø±ê
* * xEnd£oÖ±ÏßμĽáêøX×ø±ê
* * yEnd£oÖ±ÏßμĽáêøY×ø±ê
* * color£oÖ±ÏßμÄÑÕé«
*êä 3ö£o
*1| Äü£o»-ò»ìõÖ±Ïß
****************************************************************************/
void GUI_Line(u16 xStart, u16 yStart, u16 xEnd, u16 yEnd, u16 color)
{
u16 t;
int xerr = 0, yerr = 0, delta_x, delta_y, distance;
int incx, incy;
u16 row, col;
delta_x = xEnd - xStart;//¼ÆËã×ø±êÔöá¿
delta_y = yEnd - yStart;
col = xStart;
row = yStart;
if (delta_x > 0)
{
incx=1;//éèÖÃμ¥2½·½Ïò
}
else
{
if (delta_x == 0)
{
incx = 0;//′1Ö±Ïß
}
else
{
incx = -1;
delta_x = -delta_x;
}
}
if (delta_y > 0)
{
incy = 1;
}
else
{
if (delta_y == 0)
{
incy = 0;//ˮƽÏß
}
else
{
incy = -1;
delta_y = -delta_y;
}
}
if (delta_x > delta_y)
{
distance = delta_x;//ѡ衻ù±¾Ôöá¿×ø±êÖá
}
else
{
distance = delta_y;
}
for (t=0; t<=distance+1; t++)
{ //»-Ïßêä3ö
GUI_Dot(col, row, color);
xerr += delta_x;
yerr += delta_y;
if(xerr > distance)
{
xerr -= distance;
col += incx;
}
if(yerr > distance)
{
yerr -= distance;
row += incy;
}
}
}
//»-¾ØDÎ
//(x1,y1),(x2,y2):¾ØDÎμĶԽÇ×ø±ê
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
GUI_Line(x1,y1,x2,y1,color);
GUI_Line(x1,y1,x1,y2,color);
GUI_Line(x1,y2,x2,y2,color);
GUI_Line(x2,y1,x2,y2,color);
}
//ÔúLCDéÏμÄ£¨x£¬y£©′|»-μã
//color£oμãμÄÑÕé«
void LCD_Draw_Point(u16 x,u16 y,u16 color)
{
GUI_Dot(x,y,color);
}
//ÔúÖ¸¶¨Î»Öà ÏÔê¾1¸ö16*16μÄoo×Ö
//(x,y):oo×ÖÏÔê¾μÄλÖÃ
//index:tfontêy×éàïÃæμÄμú¼¸¸öoo×Ö
//color:Õa¸öoo×ÖμÄÑÕé«
void Test_Show_CH_Font16(u16 x,u16 y,u8 index,u16 color)
{
u8 temp,t,t1;
u16 y0=y;
for(t=0;t<32;t++)//ÿ¸ö16*16μÄoo×ÖμãÕó óD32¸ö×Ö½ú
{
if(t<16)temp=tfont16[index*2][t]; //ǰ16¸ö×Ö½ú
else temp=tfont16[index*2+1][t-16]; //oó16¸ö×Ö½ú
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Draw_Point(x,y,color);//»-êμDÄμã
else LCD_Draw_Point(x,y,GRAY); //»-¿Õ°×μ㣨ê1óñ3¾°é«£©
temp<<=1;
y++;
if((y-y0)==16)
{
y=y0;
x++;
break;
}
}
}
}
//ÔúÖ¸¶¨Î»Öà ÏÔê¾1¸ö24*24μÄoo×Ö
//(x,y):oo×ÖÏÔê¾μÄλÖÃ
//index:tfontêy×éàïÃæμÄμú¼¸¸öoo×Ö
//color:Õa¸öoo×ÖμÄÑÕé«
void Test_Show_CH_Font24(u16 x,u16 y,u8 index,u16 color)
{
u8 temp,t,t1;
u16 y0=y;
for(t=0;t<72;t++)//ÿ¸ö24*24μÄoo×ÖμãÕó óD72¸ö×Ö½ú
{
if(t<24)temp=tfont24[index*3][t]; //ǰ24¸ö×Ö½ú
else if(t<48)temp=tfont24[index*3+1][t-24]; //ÖD24¸ö×Ö½ú
else temp=tfont24[index*3+2][t-48]; //oó24¸ö×Ö½ú
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Draw_Point(x,y,color);//»-êμDÄμã
else LCD_Draw_Point(x,y,GRAY); //»-¿Õ°×μ㣨ê1óñ3¾°é«£©
temp<<=1;
y++;
if((y-y0)==24)
{
y=y0;
x++;
break;
}
}
}
}
//2aêÔ2¸öoo×ÖÏÔê¾oˉêy
void TEST_FONT(void)
{
u8 t;
u8 x,x1;
x=x1=50;
for(t=0;t<7;t++)//6¸öoo×Ö
{
Test_Show_CH_Font16(x ,50,t,RED);
Test_Show_CH_Font24(x1,70,t,RED);
x+=16;
x1+=24;
}
}
/****************************************************************************
* Function Name : GUI_Box
* Description : ¸øò»¸öÇøóòí¿éÏÑÕé«
* Input : sx£oÆeê¼X×ø±ê, sy£oÆäêμY×ø±ê,
* * ex£oÖÕÖ1X×ø±ê, ey£oÖÕÖ1Y×ø±ê,
* * color£o·½¿òμÄÑÕé«
* Output : None
* Return : None
****************************************************************************/
void GUI_Box(uint16_t xState, uint16_t yState, uint16_t xEnd, uint16_t yEnd, uint16_t color)
{
uint16_t temp;
if((xState > xEnd) || (yState > yEnd))
{
return;
}
TFT_SetWindow(xState, yState, xEnd, yEnd);
xState = xEnd - xState + 1;
yState = yEnd - yState + 1;
while(xState--)
{
temp = yState;
while (temp--)
{
TFT_WriteData_Color(color);
}
}
}
/****************************************************************************
* Function Name : GUI_DrowSign
* Description : »-ò»¸öê®×Öμıê¼Ç
* Input : x£o±ê¼ÇμÄX×ø±ê£»
* * y£o±ê¼ÇμÄY×ø±ê
* * color£o±ê¼ÇμÄÑÕé«
* Output : None
* Return : None
****************************************************************************/
void GUI_DrowSign(uint16_t x, uint16_t y, uint16_t color)
{
uint8_t i;
/* »-μã */
TFT_SetWindow(x-1, y-1, x+1, y+1);
for(i=0; i<9; i++)
{
TFT_WriteData_Color(color);
}
/* »-êú */
TFT_SetWindow(x-4, y, x+4, y);
for(i=0; i<9; i++)
{
TFT_WriteData_Color(color);
}
/* »-oá */
TFT_SetWindow(x, y-4, x, y+4);
for(i=0; i<9; i++)
{
TFT_WriteData_Color(color);
}
}
#ifndef USE_FLASH_CHAR
/****************************************************************************
* Function Name : GUI_Show12ASCII
* Description : D′12oÅASCIIÂë
* Input : x£oÆeê¼X×ø±ê
* * y£oÆeê¼Y×ø±ê
* * p£o×Ö·û′®ê×μØÖ·
* * wordColor£o×ÖìåÑÕé«
* * backColor£o±3¾°ÑÕé«
* Output : None
* Return : None
****************************************************************************/
void GUI_Show12ASCII(uint16_t x, uint16_t y, uint8_t *p,
uint16_t wordColor, uint16_t backColor)
{
uint8_t i, wordByte, wordNum;
uint16_t color;
while(*p != '\0') //¼ì2aêÇ·ñêÇ×îoóò»¸ö×Ö
{
/* Ôú×Ö¿aÖDμÄASCIIÂëêÇ′ó¿Õ¸ñ¿aê¼μÄò2¾íêÇ32¿aê¼μÄ£¬ËùòÔ¼õè¥32 */
wordNum = *p - 32;
TFT_SetWindow(x, y, x+7, y+15); //×Ö¿í*¸ßÎa£o8*16
for (wordByte=0; wordByte<16; wordByte++) //ÿ¸ö×ÖÄ£ò»12óD16¸ö×Ö½ú
{
color = ASCII8x16[wordNum][wordByte];
for (i=0; i<8; i++)
{
if ((color&0x80) == 0x80)
{
TFT_WriteData_Color(wordColor);
}
else
{
TFT_WriteData_Color(backColor);
}
color <<= 1;
}
}
p++; //Ö¸ÕëÖ¸ÏòÏÂò»¸ö×Ö
/* ÆáÄ»×ø±ê′|àí */
x += 8;
if(x > 233) //TFT_XMAX -8
{
x = 0;
y += 16;
}
}
}
#else
/****************************************************************************
* Function Name : GUI_Show12Char
* Description : í¨1yFLASH×Ö¿aÏÔê¾12oÅ×Öĸoíoo×Ö£¨ê1óÃGBK£©
* Input : x£oÆeê¼X×ø±ê
* * y£oÆeê¼Y×ø±ê
* * ch£o×Ö·û′®ê×μØÖ·
* * wordColor£o×ÖìåÑÕé«
* * backColor£o±3¾°ÑÕé«
* Output : None
* Return : None
****************************************************************************/
void GUI_Show12Char(uint16_t x, uint16_t y, uint8_t *ch,
uint16_t wordColor, uint16_t backColor)
{
uint8_t i, j, color, buf[32];
uint16_t asc;
uint32_t wordAddr = 0;
while(*ch != '\0')
{
/*ÏÔê¾×Öĸ */
if(*ch < 0x80) //ASCIIÂë′ó0~127
{
/* Ôú×Ö¿aÖDμÄASCIIÂëêÇ′ó¿Õ¸ñ¿aê¼μÄò2¾íêÇ32¿aê¼μÄ£¬ËùòÔ¼õè¥32 */
wordAddr = *ch - 32;
wordAddr *= 16;
wordAddr += GUI_FLASH_ASCII_ADDR;
/* ¶áè¡FLASHÖD¸Ã×ÖμÄ×ÖÄ£ */
FLASH_ReadData(buf, wordAddr, 16);
/* ÏÔ꾸ÃÎÄ×Ö */
TFT_SetWindow(x, y, x+7, y+15); //×Ö¿í*¸ßÎa£o8*16
for (j=0; j<16; j++) //ÿ¸ö×ÖÄ£ò»12óD16¸ö×Ö½ú
{
color = buf[j];
for (i=0; i<8; i++)
{
if ((color&0x80) == 0x80)
{
TFT_WriteData_Color(wordColor);
}
else
{
TFT_WriteData_Color(backColor);
}
color <<= 1;
}
}
ch++; //Ö¸ÕëÖ¸ÏòÏÂò»¸ö×Ö
/* ÆáÄ»×ø±ê′|àí */
x += 8;
if(x > 233) //TFT_XMAX -8
{
x = 0;
y += 16;
}
}
/* ÏÔê¾oo×Ö */
else
{
/* ½«oo×Ö±àÂë×a»»3éÔúFLASHÖDμÄμØÖ· */
asc = *ch - 0x81; //¸ß×Ö½úêDZíê¾·ÖÇø£¬·ÖÇøêÇ′ó0x81μ½0xFE,ËùòÔ×a»»3éμØÖ·-0x80
wordAddr = asc * 190; //ÿ¸ö·ÖÇøò»12óD190¸ö×Ö
asc = *(ch + 1); //μí×Ö½ú′ú±íÿ¸ö×ÖÔúÿ¸ö·ÖÇøμÄλÖã¬ËüêÇ′ó0x40μ½0xFF
if(asc < 0x7F) //Ôú0x7FλÖÃóD¸ö¿Õ룬μ«êÇÎòÃÇè¡Ä£2»áô¿Õ£¬ËùòÔ′óóú0x7FÖ®oó¶à¼õò»
{
asc -= 0x40;
}
else
{
asc -= 0x41;
}
wordAddr += asc; //Çó3öÔúGBKÖDêÇμú¼¸¸ö×Ö
wordAddr *= 32; //½«×ÖλÖÃ×a»»Î»FLASHμØÖ·
wordAddr += GUI_FLASH_12CHAR_ADDR; //¼óéÏê×μØÖ·
/* ¶áè¡FLASHÖD¸Ã×ÖμÄ×ÖÄ£ */
FLASH_ReadData(buf, wordAddr, 32);
/* Ôú2êÆáéÏÃæÏÔê¾ */
TFT_SetWindow(x, y, x+15, y+15);
for(i=0; i<32; i++)
{
color = buf[i];
for(j=0; j<8; j++)
{
if((color & 0x80) == 0x80)
{
TFT_WriteData_Color(wordColor);
}
else
{
TFT_WriteData_Color(backColor);
}
color <<= 1;
}//for(j=0;j<8;j++)½áêø
}
/* ÆáÄ»×ø±ê′|àí */
x += 16;
if(x > 225) //TFT_XMAX -15
{
x = 0;
y += 16;
}
/* D′ÏÂò»¸ö×Ö£¬Ã¿¸öoo×Öռὸö×Ö½úËùòÔ+2 */
ch += 2;
}
}
}
/****************************************************************************
* Function Name : GUI_Show12Chinese
* Description : í¨1yFLASH×Ö¿aÏÔê¾12oÅoo×Ö£¨ê1óÃGBK£©
* Input : x£oÆeê¼X×ø±ê
* * y£oÆeê¼Y×ø±ê
* * cn£o×Ö·û′®ê×μØÖ·
* * wordColor£o×ÖìåÑÕé«
* * backColor£o±3¾°ÑÕé«
* Output : None
* Return : None
****************************************************************************/
void GUI_Show16Chinese(uint16_t x, uint16_t y, uint8_t *cn,
uint16_t wordColor, uint16_t backColor)
{
uint8_t i, j, color, buf[63];
uint16_t asc;
uint32_t wordAddr = 0;
while(*cn != '\0')
{
/* ½«oo×Ö±àÂë×a»»3éÔúFLASHÖDμÄμØÖ· */
asc = *cn - 0x81; //¸ß×Ö½úêDZíê¾·ÖÇø£¬·ÖÇøêÇ′ó0x81μ½0xFE,ËùòÔ×a»»3éμØÖ·-0x80
wordAddr = asc * 190; //ÿ¸ö·ÖÇøò»12óD190¸ö×Ö
asc = *(cn + 1); //μí×Ö½ú′ú±íÿ¸ö×ÖÔúÿ¸ö·ÖÇøμÄλÖã¬ËüêÇ′ó0x40μ½0xFF
if(asc < 0x7F) //Ôú0x7FλÖÃóD¸ö¿Õ룬μ«êÇÎòÃÇè¡Ä£2»áô¿Õ£¬ËùòÔ′óóú0x7FÖ®oó¶à¼õò»
{
asc -= 0x40;
}
else
{
asc -= 0x41;
}
wordAddr += asc; //Çó3öÔúGBKÖDêÇμú¼¸¸ö×Ö
wordAddr *= 63; //½«×ÖλÖÃ×a»»Î»FLASHμØÖ·
wordAddr += GUI_FLASH_16CHAR_ADDR; //¼óéÏê×μØÖ·
/* ¶áè¡FLASHÖD¸Ã×ÖμÄ×ÖÄ£ */
FLASH_ReadData(buf, wordAddr, 63);
/* Ôú2êÆáéÏÃæÏÔê¾ */
TFT_SetWindow(x, y, x+23, y+20);
for(i=0; i<63; i++)
{
color = buf[i];
for(j=0; j<8; j++)
{
if((color & 0x80) == 0x80)
{
TFT_WriteData_Color(wordColor);
}
else
{
TFT_WriteData_Color(backColor);
}
color <<= 1;
}//for(j=0;j<8;j++)½áêø
}
/* ÆáÄ»×ø±ê′|àí */
x += 21;
if(x > 218) //TFT_XMAX -21
{
x = 0;
y += 21;
}
/* D′ÏÂò»¸ö×Ö£¬Ã¿¸öoo×Öռὸö×Ö½úËùòÔ+2 */
cn += 2;
}
}
#endif
#ifdef PICTURE_SHOW
void GUI_ShowPicture(uint x, uint y, uint wide, uint high)
{
uint temp = 0;
long tmp=0,num=0;
TFT_SetWindow(x, y, x+wide-1, y+high-1);
num = wide * high*2 ;
do
{
temp = pic[tmp + 1];
temp = temp << 8;
temp = temp | pic[tmp];
TFT_WriteData_Color(temp);//ÖeμãÏÔê¾
tmp += 2;
}
while(tmp < num);
}
#endif
#ifdef USE_FONT_UPDATE
/****************************************************************************
* Function Name : GUI_FontUpdate
* Description : ¸üDÂ×Ö¿a
* Input : updateState£oÑ¡Ôñ¸üDÂμÄ×Ö¿a
* Output : None
* Return : None
****************************************************************************/
void GUI_FontUpdate(uint8_t updateState)
{
FRESULT res;
FIL fsrc;
UINT br;
uint32_t wordAddr, i, j;
#ifdef __MALLOC_H
uint8_t *p;
p = malloc(4096); //¿a±ùò»¸öÄú′æ¿é
if(p == 0)
{
return;
}
#else
uint8_t buffer[512];
#endif
/* ¸üDÂASCII×Ö¿a */
if((updateState & GUI_UPDATE_ASCII) == GUI_UPDATE_ASCII)
{
/* éèÖÃD′èëÆeê¼μØÖ· */
wordAddr = GUI_FLASH_ASCII_ADDR;
j = 0;
/* ′ò¿a¶áè¡Îļt */
res = f_open(&fsrc, GUI_ASCII_FILE, FA_READ);
if(res == FR_OK) //′ò¿a3é1|
{
for (;;) //¿aê¼¶áè¡êy¾Y
{
#ifdef __MALLOC_H
res = f_read(&fsrc, p, 4096, &br);
/* ½«¶áè¡μ½μÄêy¾YD′èëFLASH */
FLASH_WriteData(p, wordAddr, br);
wordAddr += br; //D′èëμØÖ·Ôö¼ó
#else
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
/* ½«¶áè¡μ½μÄêy¾YD′èëFLASH */
FLASH_WriteData(buffer, wordAddr, br);
wordAddr += br; //D′èëμØÖ·Ôö¼ó
#endif
j += br;
i = j * 100 / 1456;
GUI_Box(0, 80, i, 90, RED);
if (res || br == 0)
{
break; // error or eof
}
}
}
f_close(&fsrc); //2»ÂÛêÇ′ò¿a£¬»1êÇD½¨Îļt£¬ò»¶¨¼ÇμÃ1رÕ
}
/* ¸üDÂ12oÅoo×Ö¿a */
if((updateState & GUI_UPDATE_12CHAR) == GUI_UPDATE_12CHAR)
{
wordAddr = GUI_FLASH_12CHAR_ADDR;
j = 0;
res = f_open(&fsrc, GUI_12CHAR_FILE, FA_READ);
if(res == FR_OK)
{
for (;;)
{
#ifdef __MALLOC_H
res = f_read(&fsrc, p, 4096, &br);
/* ½«¶áè¡μ½μÄêy¾YD′èëFLASH */
FLASH_WriteData(p, wordAddr, br);
wordAddr += br; //D′èëμØÖ·Ôö¼ó
#else
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
FLASH_WriteData(buffer, wordAddr, br);
wordAddr += br;
#endif
j += br;
i = j * 100 / 766080;
GUI_Box(0, 95, i, 105, RED);
if (res || br == 0)
{
break; // error or eof
}
}
}
f_close(&fsrc); //2»ÂÛêÇ′ò¿a£¬»1êÇD½¨Îļt£¬ò»¶¨¼ÇμÃ1رÕ
}
/* ¸üDÂ16oÅoo×Ö¿a */
if((updateState & GUI_UPDATE_16CHAR) == GUI_UPDATE_16CHAR)
{
wordAddr = GUI_FLASH_16CHAR_ADDR;
j = 0;
res = f_open(&fsrc, GUI_16CHAR_FILE, FA_READ);
if(res == FR_OK)
{
for (;;)
{
#ifdef __MALLOC_H
res = f_read(&fsrc, p, 4096, &br);
/* ½«¶áè¡μ½μÄêy¾YD′èëFLASH */
FLASH_WriteData(p, wordAddr, br);
wordAddr += br; //D′èëμØÖ·Ôö¼ó
#else
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
FLASH_WriteData(buffer, wordAddr, br);
wordAddr += br;
#endif
j += br;
i = j * 100 / 1508220;
GUI_Box(0, 110, i, 120, RED);
if (res || br == 0)
{
break; // error or eof
}
}
}
f_close(&fsrc); //2»ÂÛêÇ′ò¿a£¬»1êÇD½¨Îļt£¬ò»¶¨¼ÇμÃ1رÕ
}
#ifdef __MALLOC_H
free(p);
#endif
}
#endif