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線也不多,容量也非常大。我沒研究過。