地球上的愛好者或沒有留意,若在已有的界面上疊加透明背景字,不大影響界面表現,但卻美美地新增了文字信息,似乎平添了一“顯示域”。但是流行字符顯示方法卻硬要把背景與字跡一同寫出,出字就見方疤,放哪哪不爽。以俺《觸摸屏》貼為例,空心透明的鍵控符號很大方,杵那都不討嫌,明示卻不妨圖,可謂親和也。
招式描述:
1、其實忒簡單,也非俺發明,竟然就是LCD都支持的“直接寫點”法,屬于撿來的應用招式(習慣性的口出“招式”、“命門”之類,都怪金庸俠文給鬧的)。
及有字跡的地方就寫點,沒有就不寫,于是立馬透明”了?珊薜氖牵蠰CD都笨笨的沿用寫點自動遞增屏點地址的搞法,不寫他就不走,所以才不 成。
2、這要用到所有LCD屏都支持的的定位指令,如例程片段里的“ {LCD_SetDispAddr(x1,y1); LLCD_WRITE_DATA(color); y1++;} “。 然后不論寫點與否都遞增地址,這樣行了。
3、靠譜的辦法是把字庫和圖庫放到SD卡或flash里。單片機的容量空間實在太金貴,STC單片機的容量最大的也只64K字節,俺用的單幅圖片就要150K字節,那夠消費呢? 好在STC的SPI接口與SD卡和flash都可直連,不要任何外圍電路,忒方便。
4、”寫點法“意外派生了新的名堂,及錯位雙寫就有了立體字的效果。俺還利用錯位雙寫異色透明圖標的辦法有效防止了同色背景淹沒圖標的現象。
5、動態顯示透明字時會出現討厭的字跡存留現象,需要背景整屏或局部刷新。此時正規的高端方法顯得有用了,高端的方法是讀出將被覆蓋的圖形顯存內容,依序分別保存原始與最新圖形內容備用,加入字庫數據異或運算處理,然后回寫之。得失輕重各有分說。
IMG_20170828_141829.jpg (340.92 KB, 下載次數: 75)
下載附件
2017-8-29 12:55 上傳
IMG_20170828_141919.jpg (265.24 KB, 下載次數: 75)
下載附件
2017-8-29 12:55 上傳
IMG_20170828_142025.jpg (209.64 KB, 下載次數: 93)
下載附件
2017-8-29 12:55 上傳
IMG_20170828_142057.jpg (218.37 KB, 下載次數: 73)
下載附件
2017-8-29 12:55 上傳
代碼片段鑒賞:
//==================本地字庫 16x24 寫點成字=============================================
void LCD_X_HZ1624(unsigned char x, unsigned char y, unsigned int color,unsigned char const *lcdHZ)
{
u8 k,x1=x,y1=y,CharCode,Cnt;
for (k=0;k<48;k++){ CharCode = *lcdHZ;
for(Cnt=0;Cnt<8;Cnt++) {
if((CharCode&0x80)==0x80){LCD_SetDispAddr(x1,y1); LLCD_WRITE_DATA(color); y1++;}
else {y1++;}
if((y1-y)>15){x1++;y1=y;} CharCode<<=1;}
*lcdHZ++; }
}
//========SD字庫 51x80 逐點寫屏,透明背景(每字占512字節)======================
void LCD_X_ZF5180(u16 x, u16 y,u16 color,u32 add)
{
u16 x1=x,y1=y; u8 CharCode,Cnt;
u16 temp,d=508; //每字符508字節。
u8 table[]={0x51,0x00,0x00,0x00,0x00,0xff}; //寫入讀頁命令幀CMD17
add=add*512;
table[1]=((add&0xff000000)>>24); //填入地址
table[2]=((add&0x00ff0000)>>16);
table[3]=((add&0x0000ff00)>>8);
table[4]=add;
SPI_SD_CS =0;
do{ temp=write_cmd(table); }while(temp!=0);
SPI_SendByte(0xff);
while(SPI_SendByte(0xff)!=0xfe);
while(d--) //讀SD卡直接寫dX8個點
{
CharCode = SPI_SendByte(0xff);
for(Cnt=0;Cnt<8;Cnt++) {
if((CharCode&0x80)==0x80){LCD_SetDispAddr(x1,y1); LLCD_WRITE_DATA(color); y1++;}
else {y1++;}
if((y1-y)>79){x1++;y1=y;} CharCode<<=1;
}
}
SPI_SendByte(0xff); //空讀校驗碼約定動作
SPI_SendByte(0xff);
SPI_SD_CS =1;
SPI_SendByte(0xff);
}
//=============讀SD圖形庫直接寫屏(每幅150K字節)============================
//----------- LCD_WRITE_DATA(SPI_SendByte為寫屏命令----------------------------------------------
//----------- SPI_SendByte 為兩用SD卡寫讀命令------------------------------------------------------------
void SD_TX_ALL(u32 add)
{
u16 temp,c=300,d; //每幅圖占150.36K字節,合300頁。
u8 table[]={0x51,0x00,0x00,0x00,0x00,0xff}; //寫入讀頁命令幀CMD17
add=add*512;
adderset(0,239,0,319); //開窗
while(c--){
table[1]=((add&0xff000000)>>24); //填入地址
table[2]=((add&0x00ff0000)>>16);
table[3]=((add&0x0000ff00)>>8);
table[4]=add;
add=add+512; //頁遞增
SPI_SD_CS =0;
do{ temp=write_cmd(table); }while(temp!=0); SPI_SendByte(0xff);
while(SPI_SendByte(0xff)!=0xfe); d=256; //每次兩字節搞256次為一頁
while(d--) //讀SD卡直接寫屏
{ LCD_WRITE_DATA(SPI_SendByte(0xff),SPI_SendByte(0xff)); }
SPI_SendByte(0xff); //空讀校驗碼約定動作
SPI_SendByte(0xff);
SPI_SD_CS =1;
SPI_SendByte(0xff);
}
}
|