2010年6月26日 星期六

如何在uC/GUI中實現表單半透明效果

uC/GUI系統中的表單可以實全透明效果,但是無法實現半透明效果。

  怎麼實現半透明效果呢?先考慮原理。

  半透明原理:

  假設LCD256色的。顏色格式為332RGB

  顯存中的每一個位元組的資料對應一個象素點。 在資料寫入顯存之前,讀取相應相素點值,然後與


 


新的資料按一定的規則混合之後,再寫入相應圖元點的顯存。

  這樣主要問題關鍵是混合演算法。

  混合演算法目前在遊戲上常用到的演算法是AlphaBlend。計算公式如下

  假設一幅圖像是A,另一幅透明的圖像是B,那麼透過B去看A,看上去的圖像C就是BA的混合圖像,設B圖像的透明度為alpha(取值為0-11為完全透明,0為完全不透明)Alpha混合公式如下:

  R(C)=(1-alpha)*R(B)+alpha*R(A)

  G(C)=(1-alpha)*G(B)+alpha*G(A)

  B(C)=(1-alpha)*B(B)+alpha*B(A)

  R(x)G(x)B(x)分別指顏色xRGB分量原色值。從上面的公式可以知道,Alpha其實是一個決定混合透明度的數值。應用Alpha混合技術,可以實現遊戲中的許多特效,比如火光、煙霧、陰影、動態光源等半透明效果。

  原理和混合演算法都清楚知後,下來考慮在uC/GUI這樣的環境下如何實現。

  再考慮一個問題,uC/GUI系統分為好幾個層面。簡單地可以歸結為:

  1、硬體驅動層

  2、基本2D圖形庫

  3、表單

  可以想像層次越高,涉及的內容越多,修改的工作量就越大。

  如果想修改最少的代碼實現半透明功能,最好在硬體驅動層找切入口。

  分析一下硬體驅動層的壞境

  在硬體驅動層中我找到了一個巨集定義

  LCD_WRITE_MEM(Off,data) *((U8*)(DC+(((U32)(Off)))))=data

  從文檔可以看到該巨集定義的功能就是向顯存寫入圖元點的值。

  那就修改這個巨集定義吧,把剛才說的演算法加入該巨集定義,流程如下:

  a、讀取相應象素點值

  b、與新的象素點值按照混合演算法轉換。

  c、將轉換結果寫入顯存對應位置。

  然後進行簡單的測試。

  如下

  /設置透明度為0,完全不透明,先執行清屏。

  GUI_SetBkColor(GUI_WHITE);

  GUI_SetColor(GUI_WHITE);

  GUI_Clear();

  /填充一個方框

  GUI_SetColor(GUI_RED);

  GUI_FillRect(0,0,80,30);

  *****這裏設置透明度為80透明之後再執行

  GUI_SetColor(GUI_GREEN);

  GUI_FillRect(50,5,200,30);
 
  這時候觀察兩個方框疊交的部分和其他部份,可以看到透明效果已經出現了。

  到這個時候可以證明,你的思想和修改是正確的。

  接下來的事情是如何把這個實現效果跟GUI系統完美結合起來。

  uC/GUI代碼這麼多,如何下手?

  有一個核心資料結構你必須知道。GUI_CONTEXT

typedef struct {
/* Variables in LCD module */
LCD_COLORINDEX_UNION LCD;
LCD_RECT ClipRect;
U8 DrawMode;
U8 SelLayer;
U8 TextStyle;
U8 TransPara;
/* Variables in GL module */
GUI_RECT* pClipRect_HL; /* High level clip rectangle ... Speed optimization so drawing routines can optimize */
U8 PenSize;
U8 PenShape;
U8 LineStyle;
U8 FillStyle;
/* Variables in GUICHAR module */
const GUI_FONT GUI_UNI_PTR * pAFont;
const GUI_UC_ENC_APILIST * pUC_API; /* Unicode encoding API */
I16P LBorder;
I16P DispPosX, DispPosY;
I16P DrawPosX, DrawPosY;
I16P TextMode, TextAlign;
GUI_COLOR Color, BkColor; /* Required only when changing devices and for speed opt (caching) */
/* Variables in WM module */
#if GUI_WINSUPPORT
const GUI_RECT* WM__pUserClipRect;
GUI_HWIN hAWin;
int xOff, yOff;
#endif
/* Variables in MEMDEV module (with memory devices only) */
#if GUI_SUPPORT_DEVICES
const tLCDDEV_APIList* pDeviceAPI; /* function pointers only */
GUI_HMEM hDevData;
GUI_RECT ClipRectPrev;
#endif
/* Variables in Anitaliasing module */
#if GUI_SUPPORT_AA
const tLCD_HL_APIList* pLCD_HL; /* Required to reroute drawing (HLine & Pixel) to the AA module */
U8 AA_Factor;
U8 AA_HiResEnable;
#endif
} GUI_CONTEXT;

  認真分析一下它。你會發現它包含了整個系統作圖的最基本資訊。而且這個結構體所聲明的變數GUI_Context也是硬體作圖層(硬體驅動層)所唯一依賴的變數。

  在結構體中發現,需要增加透明度資訊。

  於是在結構體中增加一條:

  U8 BlendPara;/混合演算法參數Alpha;

  現在來一個情景分析。

  1、在畫圖前設置該變數值。0---100之間。

  2、在LCD_WRITE_MEM時使用它。這樣半透明和透明效果就都實現了。

  用2D圖形庫作圖測試確實能實現半透明效果。

 再測試表單時你會發現一個問題。在基於WM_Window的所有控制項上使作半透明效果會出現問題:

  在反復刷新(即反復產生WM_PAINT)消息時,該表單的顏色一直在變數,而且由淺及深或由深及淺反復變化。

  我們的話題是實現表單的半透明效果。這並不是我們的最終目標,而是目標的第一步。


一個優化過的完全版的ucGUI漢字形檔_hzk12使用方法

一個優化過的完全版的ucGUI漢字形檔_hzk12使用方法


將解壓後的hzk12.c放到ucGUIfont路徑下


GUI.H文件內加一行:extern const GUI_FONT GUI_FontHZ12;


按如下形式調用即可顯示中文了:


GUI_Init();
GUI_SetColor(GUI_RED);
GUI_SetFont(&GUI_FontHZ12);
GUI_SetTextAlign(GUI_TA_LEFT);
GUI_DispStringAt("漢字形檔顯示測試",20,20);


雖然是GUI定義的,但是在其他單片機顯示點陣字元時,可以同樣定義。使用起來會非常方便。以下為另一篇文章,講得更詳細些。為記。


HZK16中取出所須的漢字, 組成新的字形檔檔, 再變成UCGUI中所須的原始檔案. 這樣講是非常抽象的, 首先, 你取出的漢字, 其機內碼不是連續的, 那麼這樣一來, 如果還是使用漢字的標準機內碼的話, 則必須為每一個要用到的漢字都建立一個GUI_FONT_PROP結構, 一個漢字一個, 在將他們鏈結成鏈表, 這樣做唯一好處是可以直接以如下方法:



const unsigned char helloworld[]="世界你好";


GUI_DispString((const char*)helloworld);


依靠編譯器來將"世界你好"轉變成漢字機內碼的字串. 但我們亦可手工構造要顯示的漢字如下:


const unsigned char helloworld[]={0xca, 0xc0, 0xbd, 0xe7, 0xc4, 0xe3, 0xba, 0xc3, 0x00};
GUI_DispString((const char*)helloworld);




如上兩種比較, 結果是一樣的,唯一不同的是, 第一種方法顯示漢字時, 無須使用知道漢字的機內碼, 而是由編譯器來轉換的, 但我要說的是, 其實兩者本質是一樣的, 只是對使用者來說有表面上的不同.比較以上的兩種顯示漢字時構造字串的方法, 我們可以得到一個啟示, 對於第二種, 我們可以採取自定義漢字機內碼, 然後直接通過自定義機內碼來顯示漢字, 這一點我已經在"建立自定義小型漢字形檔說明"一文當中說明了, 現在我想說的是對於採用第一種方法顯示漢字的建立自定義小型字形檔的方法:



使用如下:


void MainTask(void)
{
char helloworld[] = "世界你好";
GUI_Init();
GUI_DispString((const char*)helloworld);
while(1){
GUI_Delay(800);
}
}


構造SmallHZK12_2.c如下:


/***********************************************************************
Revision By: ucgui
Comments: SmallHZK12_2.c
這時是第二種自定義小型漢字形檔的方法,在這種方法下可以採用
char hellworld[]="世界你好";這種方法來方便的顯示漢字,
第一種方法容易使用, 不過缺點是每一個字對應一個GUI_FONT_PROP結構
, 明顯佔用了多的記憶體, 減慢查找顯示的速度.
***********************************************************************/



#include "GUI.H"
#ifndef GUI_FLASH
#define GUI_FLASH
#endif
extern GUI_FLASH const GUI_FONT GUI_FontHZ12;


//



GUI_FLASH const unsigned char acFontHZ12_cac0[24] = {
0x04,0x40, 0x24,0x40, 0x24,0x40, 0x24,0x40, 0xff,0xf0, 0x24,0x40, 0x24,0x40, 0x24,0x40,



0x27,0xc0, 0x24,0x40, 0x20,0x00, 0x 3f ,0xf0};


//
GUI_FLASH const unsigned char acFontHZ12_bde7[24] = {
0x 3f ,0xc0, 0x24,0x40, 0x 3f ,0xc0, 0x24,0x40, 0x 3f ,0xc0, 0x04,0x00, 0x0b,0x00, 0x38,0xf0,0xc9,0x20, 0x09,0x00, 0x11,0x00, 0x61,0x00};


//
GUI_FLASH const unsigned char acFontHZ12_c4e3[24] = {
0x12,0x00, 0x12,0x00, 0x27,0xf0, 0x24,0x20, 0x69,0x40, 0xa1,0x00, 0x25,0x40,



0x25,0x20, 0x29,0x10, 0x31,0x10, 0x25,0x00, 0x22,0x00};


//
GUI_FLASH const unsigned char acFontHZ12_bac3[24] = {
0x20,0x00, 0x27,0xe0, 0x20,0x40, 0xf8,0x80, 0x48,0x80, 0x48,0xa0, 0x57,0xf0, 0x50,0x80,



0x30,0x80, 0x28,0x80, 0x 4a ,0x80, 0x81,0x00};


GUI_FLASH const GUI_CHARINFO GUI_FontHZ12_CharInfo[4] = {
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_cac0 },
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_bde7 },
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_c4e3 },
{ 12, 12, 2, (void GUI_FLASH *)&acFontHZ12_bac3 }
};


GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa4= {
0xbac3,
0xbac4,
&GUI_FontHZ12_CharInfo[3],
0
};


GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa3= {
0xc4e3,
0xc4e4,
&GUI_FontHZ12_CharInfo[2],
(void *)&GUI_FontHZ12_Propa4
};


GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa2= {
0xbde7,
0xbde8,
&GUI_FontHZ12_CharInfo[1],
(void *)&GUI_FontHZ12_Propa3
};


GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa1= {
0xcac0,
0xcac1,
&GUI_FontHZ12_CharInfo[0],
(void *)&GUI_FontHZ12_Propa2
};



GUI_FLASH const GUI_FONT GUI_FontHZ12 = {
GUI_FONTTYPE_PROP_SJIS,
12,
12,
1,
1,
(void GUI_FLASH *)&GUI_FontHZ12_Propa1
};


 


2010年6月23日 星期三

48 MIPs 8051F340+CPLD+SD卡+2.8寸真彩TFT+USB

CPLD+SD卡驅動2.8TFT真彩屏開發板採用嵌入式片上系統C 8051F 34051內核)為控制核心,通過SPI介面控制外擴SD卡,利用SD作為存儲媒質為彩屏提供存儲資料場所,實現了對SD卡的讀取控制;同時擴展了CPLD,實現CPU與彩屏間的時序控制要求,學習者可以學習單片機同CPLD的系統控制,通信等技能,是學習嵌入式片上系統及CPLDSD卡控制的理想工具。

      CPU採用C 8051F 340
1)高速流水線結構的8051 相容的CIP-51 內核,最高48MIPS 執行速度;
2)全速非侵入式的系統調試介面(片內,C2 介面);
3)真正10 200ksps 的多通道單端/差分ADC,帶模擬多路器;
4)高精度可編程的12MHz 內部震盪器;
564KB 位元組可在系統編程的FLASH 記憶體;43524096+256)位元組的片內RAM
6USB 2.0通信介面,支援全速12Mbps通信和低速1.5Mbps通信;
7)硬體實現的SPISMBus/IIC 2 UART 串列介面;40 I/O 埠;
8)具有5 個捕捉/比較模組的可編程計數器/計時器陣列;
9)片內上電復位,看門狗計時器,2 個電壓比較器,VDD 監視器和溫度感測器;
  

2010年6月21日 星期一

新組織致力為多核心開發工具建立互通標準

多核心協會(Multicore Association, MCA)成立了一個新的工作小組,旨在解決各種不同多核心處理器開發軟體工具的相容性問題;該小組期望在一年的時間內完成通用資料格式的標準草案,以及根據其工作成果開發的一款Linux-based參考實作。

該命名為「工具基礎建設工作小組(Tools Infrastructure Working Group)的新組織,是由三星電子(Samsung Electronics)駐在美國加州聖荷西的資深工程師Tasneem Brutch 擔任主席,他在該公司的一個多核心研發實驗室時遭遇上述的相容性問題。

2010年6月14日 星期一

arduino

原著:http://bbs.cepark.com/viewthread.php?tid=5103&extra=&highlight=arduino%2B&page=2

    arduino是幾年前義大利搞起的一個開源avr系統,使用mega8或mega168等,做成系統板和擴展版,mpu先要注入啟動程式,以後就靠串口和pc通信載入和修改應用程式,使用它自己的一套類似c的語言可以自由下載,傳播,編程容易,對於搞硬體不熟練的人也能開發自己的程式。國外有很多愛好者討論這個東西。國內比較少人。見www.arduino.cc

2010年6月3日 星期四

讓手機五千年都不用充電 美國研發超級核電池

淘寶賣家售「氚電池」 20年不斷電不充電
2012/12/31
淘寶網有兩名賣家叫賣「民用無輻射核電池」,一個聲稱「20年不用充電」,另一個說「上千年不用充電」;而商品上印有英文單字,是「氚電池」的意思。專家指出,這個技術確實已經在實驗室獲得成功,但應用到民用領域還不成熟。

2010年6月2日 星期三

ATmega128L and color LCD

ATmega128L CPU + TFT



STM32 Primer2

      The STM32 Primer2 is the new release of the innovative, original STM32 Primer1, which has put the powerful, highly-integrated STM32 with ARM Cortex™-M3 core into the hands of more than 10,000 engineers and microcontroller enthousiasts worldwide.
    
     The new Primer2, designed around STMicroelectronics newest STM32 variants, delivers more interface possibilities, more evaluation features and more power than its predecessor at a similarly affordable price.

STM32 Primer1

STM32 Primer1 - 10,000 Users Strong...

     In the hands of over 10,000 STM32 enthousiasts and engineers, the original STM32 Primer1 continues to inspire new applications and new users. All of the original Primer resources remain available here in the "Circle," as well as forums to support you in your exploration and development with the STM3210xB.

      In the face of overwhelming demand for the Primer1, Raisonance took user feedback into account and created the STM32 Primer2, with a range of new features and improvements... but with the same objectives in mind: provide our community a fun, interesting, easy, low-risk develoment environment for STM32.

Atmel AVR ISP programmer (自製AVR 系列cpu 下載線,printer port)

ISP Programmer
This software supports programming of Atmel microcontrollers 89Sxx ('51), ATtiny, ATmega and 90Sxx (AVR). It can erase built-in Flash and EEPROM memories as well as read and program them. ISP Programmer also supports serial Atmel DataFlash memories. Communication with devices is made serially in system (ISP - In-System Programming) without the need to pull the chip out of the socket or desolder it.