在main函数中
GUI_Show12Char(0,20,"HZ",RED,BLACK);
GUI_Show12Char(20,20,"%",RED,BLACK);
GUI_Show12Char(0,0,F,RED,BLACK);
GUI_Show12Char(20,0,D,RED,BLACK);
在gui.c中
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 != ' ')
{
/*显示字母 */
if(*ch < 0x80) //ASCII码从0~127
{
/* 在字库中的ASCII码是从空格开始的也就是32开始的,所以减去32 */
wordAddr = *ch - 32;
wordAddr *= 16;
wordAddr += GUI_FLASH_ASCII_ADDR;
/* 读取FLASH中该字的字模 */
FLASH_ReadData(buf, wordAddr, 16);
/* 显示该文字 */
TFT_SetWindow(x, y, x+7, y+15); //字宽*高为:8*16
for (j=0; j<16; j++) //每个字模一共有16个字节
{
color = buf[j];
for (i=0; i<8; i++)
{
if ((color&0x80) == 0x80)
{
TFT_WriteData(wordColor);
}
else
{
TFT_WriteData(backColor);
}
color <<= 1;
}
}
ch++; //指针指向下一个字
/* 屏幕坐标处理 */
x += 8;
if(x > 233) //TFT_XMAX -8
{
x = 0;
y += 16;
}
}
/* 显示汉字 */
else
{
/* 将汉字编码转换成在FLASH中的地址 */
asc = *ch - 0x81; //高字节是表示分区,分区是从0x81到0xFE,所以转换成地址-0x80
wordAddr = asc * 190; //每个分区一共有190个字
asc = *(ch + 1); //低字节代表每个字在每个分区的位置,它是从0x40到0xFF
if(asc < 0x7F) //在0x7F位置有个空位,但是我们取模不留空,所以大于0x7F之后多减一
{
asc -= 0x40;
}
else
{
asc -= 0x41;
}
wordAddr += asc; //求出在GBK中是第几个字
wordAddr *= 32; //将字位置转换位FLASH地址
wordAddr += GUI_FLASH_12CHAR_ADDR; //加上首地址
/* 读取FLASH中该字的字模 */
FLASH_ReadData(buf, wordAddr, 32);
/* 在彩屏上面显示 */
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(wordColor);
}
else
{
TFT_WriteData(backColor);
}
color <<= 1;
}//for(j=0;j<8;j++)结束
}
/* 屏幕坐标处理 */
x += 16;
if(x > 225) //TFT_XMAX -15
{
x = 0;
y += 16;
}
/* 写下一个字,每个汉字占两个字节所以+2 */
ch += 2;
}
}
}
在gui.h中
void GUI_Show12Char(uint16_t x, uint16_t y, uint8_t *ch, uint16_t wordColor, uint16_t backColor);
main.c和gui.c都调用了gui.h为什么编译时报错为
.output工程模板.axf: Error: L6218E: Undefined symbol GUI_Show12Char (referred from main.o).
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>