標(biāo)題: 顯示透明背景字符在單片機(jī)上咋弄? 俺來(lái)支招。 [打印本頁(yè)]

作者: zdzdzddd    時(shí)間: 2017-8-29 12:58
標(biāo)題: 顯示透明背景字符在單片機(jī)上咋弄? 俺來(lái)支招。
       地球上的愛(ài)好者或沒(méi)有留意,若在已有的界面上疊加透明背景字,不大影響界面表現(xiàn),但卻美美地新增了文字信息,似乎平添了一“顯示域”。但是流行字符顯示方法卻硬要把背景與字跡一同寫(xiě)出,出字就見(jiàn)方疤,放哪哪不爽。以俺《觸摸屏》貼為例,空心透明的鍵控符號(hào)很大方,杵那都不討嫌,明示卻不妨圖,可謂親和也。
招式描述:
1、其實(shí)忒簡(jiǎn)單,也非俺發(fā)明,竟然就是LCD都支持的“直接寫(xiě)點(diǎn)”法,屬于撿來(lái)的應(yīng)用招式(習(xí)慣性的口出“招式”、“命門(mén)”之類,都怪金庸俠文給鬧的)。
及有字跡的地方就寫(xiě)點(diǎn),沒(méi)有就不寫(xiě),于是立馬透明”了?珊薜氖,所有LCD都笨笨的沿用寫(xiě)點(diǎn)自動(dòng)遞增屏點(diǎn)地址的搞法,不寫(xiě)他就不走,所以才不     成。
2、這要用到所有LCD屏都支持的的定位指令,如例程片段里的“  {LCD_SetDispAddr(x1,y1); LLCD_WRITE_DATA(color); y1++;} “。  然后不論寫(xiě)點(diǎn)與否都遞增地址,這樣行了。
3、靠譜的辦法是把字庫(kù)和圖庫(kù)放到SD卡或flash里。單片機(jī)的容量空間實(shí)在太金貴,STC單片機(jī)的容量最大的也只64K字節(jié),俺用的單幅圖片就要150K字節(jié),那夠消費(fèi)呢? 好在STC的SPI接口與SD卡和flash都可直連,不要任何外圍電路,忒方便。
4、”寫(xiě)點(diǎn)法“意外派生了新的名堂,及錯(cuò)位雙寫(xiě)就有了立體字的效果。俺還利用錯(cuò)位雙寫(xiě)異色透明圖標(biāo)的辦法有效防止了同色背景淹沒(méi)圖標(biāo)的現(xiàn)象。
5、動(dòng)態(tài)顯示透明字時(shí)會(huì)出現(xiàn)討厭的字跡存留現(xiàn)象,需要背景整屏或局部刷新。此時(shí)正規(guī)的高端方法顯得有用了,高端的方法是讀出將被覆蓋的圖形顯存內(nèi)容,依序分別保存原始與最新圖形內(nèi)容備用,加入字庫(kù)數(shù)據(jù)異或運(yùn)算處理,然后回寫(xiě)之。得失輕重各有分說(shuō)。


















代碼片段鑒賞:
//==================本地字庫(kù)  16x24  寫(xiě)點(diǎn)成字=============================================
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字庫(kù) 51x80  逐點(diǎn)寫(xiě)屏,透明背景(每字占512字節(jié))======================
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字節(jié)。
   u8 table[]={0x51,0x00,0x00,0x00,0x00,0xff}; //寫(xiě)入讀頁(yè)命令幀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卡直接寫(xiě)dX8個(gè)點(diǎn)
     {
             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);                      //空讀校驗(yàn)碼約定動(dòng)作
     SPI_SendByte(0xff);
     SPI_SD_CS =1;
     SPI_SendByte(0xff);
}        

//=============讀SD圖形庫(kù)直接寫(xiě)屏(每幅150K字節(jié))============================
//-----------     LCD_WRITE_DATA(SPI_SendByte為寫(xiě)屏命令----------------------------------------------
//-----------     SPI_SendByte 為兩用SD卡寫(xiě)讀命令------------------------------------------------------------
void SD_TX_ALL(u32 add)
  {  
      u16 temp,c=300,d;                           //每幅圖占150.36K字節(jié),合300頁(yè)。
      u8 table[]={0x51,0x00,0x00,0x00,0x00,0xff}; //寫(xiě)入讀頁(yè)命令幀CMD17  
      add=add*512;                    
      adderset(0,239,0,319);                                   //開(kāi)窗  
   while(c--){         
        table[1]=((add&0xff000000)>>24);              //填入地址   
        table[2]=((add&0x00ff0000)>>16);
        table[3]=((add&0x0000ff00)>>8);     
        table[4]=add;     
            add=add+512;                                       //頁(yè)遞增   
     SPI_SD_CS =0;                     
    do{ temp=write_cmd(table); }while(temp!=0);     SPI_SendByte(0xff);
     while(SPI_SendByte(0xff)!=0xfe);          d=256;                                 //每次兩字節(jié)搞256次為一頁(yè)
     while(d--)                                                                                            //讀SD卡直接寫(xiě)屏  
         { LCD_WRITE_DATA(SPI_SendByte(0xff),SPI_SendByte(0xff)); }
     SPI_SendByte(0xff);                                                                         //空讀校驗(yàn)碼約定動(dòng)作   
     SPI_SendByte(0xff);
     SPI_SD_CS =1;     
     SPI_SendByte(0xff);
                }   
}


作者: SURUBU1976    時(shí)間: 2021-7-29 12:11
初學(xué),還沒(méi)看懂多看看唄,有原型更直接,51也能實(shí)現(xiàn)吧?
作者: rayin    時(shí)間: 2021-7-30 08:54
AT89C52 肯定干不了,速度太慢。 STM32F10x系列72Mhz的LCD總線連接+DMA方式應(yīng)該可以

作者: bird2020    時(shí)間: 2023-3-12 16:02
我想顯示一個(gè)透明無(wú)背景的進(jìn)度條圖標(biāo)怎么實(shí)現(xiàn)呀?
作者: bird2020    時(shí)間: 2023-3-12 17:00
請(qǐng)教一下,LCD_SetDispAddr(x1,y1)函數(shù)內(nèi)容是什么?
作者: 王秋冬    時(shí)間: 2023-3-12 20:59
這樣做確實(shí)美觀,又增加了功能,謝謝分享經(jīng)驗(yàn)。
作者: 紫色的云    時(shí)間: 2024-6-21 11:00
又學(xué)習(xí)了一招。謝謝樓主




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1