tft屏固件反编译
1. 求解TFT显示汉子程序错误
ch16[] 前面的 code 是个什么东西?在哪里定义的?
2. C51中TFT彩屏无法显示出汉字,但程序编译没问题
建议先写一个单字符显示函数,这样调用起来更方便,移植也方便;
然后显示字符串
参考函数如下:
typedef struct typFNT_GB16 /*12*16 汉字字模显示数据结构 */
{
char Index[2];
char Msk[32];
}HZ;
//HZ code HzLib[] = { /* 宋体 9小五 显示为12*16 */
struct typFNT_GB16 code HzLib[] = { /* 字大小为16*16 */
"深",0x40,0x00,0x27,0xFE,0x24,0x04,0x01,0x20,0x81,0x18,0x56,0x08,0x50,0x40,0x10,0x40,0x27,0xFC,0x20,0x40,0xC0,0xE0,0x41,0x58,0x46,0x4E,0x58,0x44,0x40,0x40,0x40,0x40,//深0
"圳",0x00,0x00,0x12,0x04,0x12,0x44,0x12,0x44,0xFE,0x44,0x12,0x44,0x12,0x44,0x12,0x44,0x12,0x44,0x12,0x44,0x3A,0x44,0xC4,0x44,0x04,0x44,0x08,0x04,0x10,0x04,0x00,0x00,//圳1
"睿",0x00,0x00,0x01,0xF0,0x01,0x00,0x7F,0xFC,0x40,0x04,0x3F,0xF8,0x12,0x90,0x24,0x48,0x1F,0xF0,0x70,0x1C,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x00,0x00,
"宇",0x00,0x00,0x02,0x00,0x01,0x00,0x7F,0xFC,0x40,0x04,0x00,0x00,0x1F,0xF0,0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x07,0x00,0x00,0x00, //宇3
"科",0x06,0x08,0x78,0x88,0x08,0x48,0x08,0x48,0xFE,0x08,0x18,0x88,0x1C,0x48,0x2A,0x48,0x28,0x0E,0x48,0x78,0x8B,0x88,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,//科4
"技",0x10,0x20,0x10,0x20,0x10,0x20,0xFD,0xFE,0x10,0x20,0x14,0x20,0x19,0xFC,0x31,0x08,0xD0,0x88,0x10,0x90,0x10,0x60,0x10,0x60,0x10,0x90,0x11,0x0E,0x56,0x04,0x20,0x00,//技5
"电",0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0xFE,0x00,0x00,//电6
"子",0x00,0x00,0x3F,0xF0,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,//子7
"有",0x01,0x00,0x01,0x00,0x7F,0xFE,0x02,0x00,0x04,0x00,0x0F,0xF0,0x18,0x10,0x28,0x10,0x4F,0xF0,0x88,0x10,0x08,0x10,0x0F,0xF0,0x08,0x10,0x08,0x90,0x08,0x70,0x08,0x20,//有8
"限",0x00,0x00,0xFB,0xF8,0x92,0x08,0x93,0xF8,0xA2,0x08,0xA2,0x08,0x93,0xF8,0x8A,0x80,0x8A,0x48,0xAA,0x50,0x92,0x20,0x82,0x20,0x82,0x10,0x82,0x8E,0x83,0x04,0x82,0x00,//限9
"公",0x00,0x00,0x04,0x40,0x06,0x40,0x04,0x40,0x08,0x20,0x08,0x10,0x10,0x18,0x22,0x0E,0x43,0x04,0x02,0x00,0x04,0x20,0x08,0x10,0x11,0xF8,0x3F,0x18,0x10,0x10,0x00,0x00,//公10
"司",0x00,0x00,0x3F,0xFC,0x00,0x04,0x00,0x04,0x7F,0xE4,0x00,0x04,0x00,0x04,0x3F,0xC4,0x20,0x44,0x20,0x44,0x3F,0xC4,0x20,0x44,0x20,0x04,0x00,0x14,0x00,0x08,0x00,0x00,//司11
};
/**************************************************************************************
* 名 称: DrawSingleHz
* 功 能: 在指定的位置显示汉字
* 参 数: 坐标:x
* 坐标:y
* 字符的颜色:LineColor
* 字符背景颜色:FillColor
**************************************************************************************/
void DrawSingleHz(U16 x, U16 y, U8 *pHz, U16 LineColor,U16 FillColor, U8 Mod)
{
U16 i=0,j=0,k=0;
U16 str,len;
//---------------------------查找该字是否已在字库中
len=sizeof(HzLib)/sizeof(HzLib[0]);
for(i=0;i<sizeof(HzLib)/sizeof(HzLib[0]);i++)
if((U8)HzLib[i].Index[0]==pHz[0]&&(U8)HzLib[i].Index[1]==pHz[1])break;
//--------------------------
if(i<len) //j<len,说明该字已经在汉字中出现
{
LCD_SetWindows(x, y, x+15, y+15);
for (j=0;j<16;j++)
{
str = (U8)HzLib[i].Msk[j*2]<<8|(U8)HzLib[i].Msk[j*2+1];
for (k=0;k<16;k++)
{
if ( str & (0x8000>>k) ) //通过移位逐位发送数据
{
LCD_WrDat((U16)(LineColor&0xffff));
}
else
{
if (Mod == NORMAL)
{
LCD_WrDat((U16)(FillColor&0xffff));
}
else
{
LCD_SetGramPoit(x+k+1,y+j); //跳过这一点,即保留该点原有的信息
}
}
}
}
}
}
/**************************************************************************************
* 名 称: DrawString
* 功 能: 在指定的位置显示多个字符
* 参 数: 坐标:x
* 坐标:y
* 字符的颜色:LineColor
* 字符背景颜色:FillColor
*
* 返 回 值: 无
*
**************************************************************************************/
void DrawString(U16 x, U16 y, U8 *pStr, U16 LineColor,U16 FillColor, U8 Mod)
{ //把字符串的第一个字符的地址赋给字符指针变量pstr,
//不是*pStr=" "详见濉跺《C程序设计》-谭浩强P252
while(1)
{
if (*pStr == 0)
{
return;
}
if (*pStr > 0x80) //大于0x80的为汉字
{
DrawSingleHz(x, y, pStr, LineColor, FillColor, Mod); //调用显示单个汉字函数处理
x += 16;
pStr += 2;
} //移动指针
else //英文字符
{
DrawSingleAscii(x, y, pStr, LineColor, FillColor, Mod); //调用显示单个字符函数处理
x += 8;
pStr += 1; //移动指针
}
}
}
void main()
{
LCD_Init();
while(1)
{
Display_full_screen_color(BLACK);
DispSmallPic(0, 0,32,20,Picture);
DelayMs(1000) ;
DispSmallPic(100, 190,82,45,Picture);
DrawString(83,0,"深圳睿宇电子",RED,BLACK);
DelayMs(1000) ;
}
3. 最近在学实用TFT彩屏,显示大图片时由于数据很大,导致在KEIL中编译是提示数组超出64K,该如何解决
1.你可以选择将全屏的图片缩小化,降低图片占用单片机存储空间。
2.选择单片机外扩FLASH
3.选择武汉 谷鑫科技的串口液晶模块,图片存储不占用单片机的空间。
4. 现在用51单片机驱动TFT屏做一个产品,然后64Kb的内部ROM不够用,请问有什么方法,而且速度要快点的
64K的51,是STC的吧。要多大的ROM啊?好像一般的非串行ROM也就是512K,是做程序扩展?还是做数据扩展,程序扩展好像没有什么好办法,数据扩展,可以用和RAM一样的办法,但不接WR线,即无法写入,指接RD,地址线不够,采用移位寄存器或者IO直接代替,把他分个页面,每页32K。C51好像也可以直接寻址外部的RAM的。
STC51有内部的扩展ram,占用了低端的4K地址,外接,扩展ROM,地址选高端的32K,在编译器里面好像可以选择外部RAM的起始地址的。不知道你内部的256RAM够使不?
29040这个芯片必须用别的编程器来写数据,单片机直接写的话,可能要动动脑筋。
其实SD卡,虽然串口速度慢一点,但容量大,用的IO少,还是挺划算的。
否则就换芯片吧。换那种IO多一些的芯片,可以扩展ROM的芯片,但,好像一般的单片机都没有很大的ROM的,最大也就64K左右。
如果容量要更大,用来做U盘的那些芯片dataflash应该也可以,那种速度比SD卡快,IO线也不多,容量也非常大。我没研究过。