這是一個小小科學實驗室,裡面有很多很多好玩且有趣的實驗,研究內容包羅萬象,放在此處,希望有志者能一起來研究討論! ______"閱讀本blogger最佳瀏覽器 用google Chrome"_______
2010年7月31日 星期六
LED點亮下一代無線通訊
2010年7月22日 星期四
Altera DE2-70 多媒體開發平台
Altera DE2-70 最新多媒體開發平台配備了數量高達70,000個邏輯單元的Altera Cyclone® II 2C70和更大容量的記憶體元件,並完全承襲了Altera DE2 多媒體平台豐富的多媒體、儲存及網路等應用介面的優點。

2010年7月19日 星期一
關於emWin(ucgui)下將LCD顯示畫面旋轉的問題,即橫屏變豎屏的問題
之前遇到這個問題,google很多地方找到了一個方法說,在LCDconf.h中:
#define LCD_SWAP_XY 1
以將xy軸對換,以此實現坐標軸的旋轉。不過單獨進行此定義,並不能完全實現橫屏和豎屏的轉換,實際的旋轉效果,後來在emWin的user mannual中找到了具體介紹,對應的就是,通過LCD_MIRROR_X,LCD_MIRROR_Y,LCD_SWAP_XY 的三者的組合,可以實現畫面的8個不同方向旋轉。具體參見
http://www.segger.com/pub/manuals/emWinUser_V412R0.pdf
中28.4 Display orientation,Page 768的圖示,就很明白了。
不過,有點要提醒的是,如果當前使用的emWin,也就是大家常說的開源的ucgui的時候,用的庫是編譯好的libemWin.a話,那這些巨集定義,就不起作用了。只有在你有源碼的情況下,改巨集的配置,然後重新編譯,這樣才能真正實現橫屏和豎屏的轉換。
2010年6月26日 星期六
如何在uC/GUI中實現表單半透明效果
uC/GUI系統中的表單可以實全透明效果,但是無法實現半透明效果。
怎麼實現半透明效果呢?先考慮原理。
半透明原理:
假設LCD是256色的。顏色格式為332(RGB)
顯存中的每一個位元組的資料對應一個象素點。 在資料寫入顯存之前,讀取相應相素點值,然後與
新的資料按一定的規則混合之後,再寫入相應圖元點的顯存。
這樣主要問題關鍵是混合演算法。
混合演算法目前在遊戲上常用到的演算法是AlphaBlend。計算公式如下
假設一幅圖像是A,另一幅透明的圖像是B,那麼透過B去看A,看上去的圖像C就是B和A的混合圖像,設B圖像的透明度為alpha(取值為0-1,1為完全透明,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)分別指顏色x的RGB分量原色值。從上面的公式可以知道,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放到ucGUI的font路徑下
在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
CPU採用C 8051F 340
(1)高速流水線結構的8051 相容的CIP-51 內核,最高48MIPS 執行速度;
(2)全速非侵入式的系統調試介面(片內,C2 介面);
(3)真正10 位200ksps 的多通道單端/差分ADC,帶模擬多路器;
(4)高精度可編程的12MHz 內部震盪器;
(5)64KB 位元組可在系統編程的FLASH 記憶體;4352(4096+256)位元組的片內RAM;
(6)USB 2.0通信介面,支援全速12Mbps通信和低速1.5Mbps通信;
(7)硬體實現的SPI,SMBus/IIC 和2 個UART 串列介面;40 個I/O 埠;
(8)具有5 個捕捉/比較模組的可編程計數器/計時器陣列;
(9)片內上電復位,看門狗計時器,2 個電壓比較器,VDD 監視器和溫度感測器;
2010年6月21日 星期一
新組織致力為多核心開發工具建立互通標準
2010年6月20日 星期日
2010年6月14日 星期一
arduino
arduino是幾年前義大利搞起的一個開源avr系統,使用mega8或mega168等,做成系統板和擴展版,mpu先要注入啟動程式,以後就靠串口和pc通信載入和修改應用程式,使用它自己的一套類似c的語言可以自由下載,傳播,編程容易,對於搞硬體不熟練的人也能開發自己的程式。國外有很多愛好者討論這個東西。國內比較少人。見www.arduino.cc
2010年6月3日 星期四
讓手機五千年都不用充電 美國研發超級核電池
2010年6月2日 星期三
STM32 Primer2
STM32 Primer1
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.