我正在爲這個真空熒光顯示器建立一個庫。它是一個非常簡單的界面,我擁有所有的功能。將位從一個陣列轉換爲另一個陣列?
我現在遇到的問題是,我試圖使代碼緊湊possable,但自定義字符加載不直觀。這是字體映射到顯示器本身的完全不同的位和字節的位圖。從IEE VFD datasheet,當您向下滾動時,您會看到位映射到整個地方。
我到目前爲止的代碼工作像這樣:
// input the font bitmap, the bit from that line of the bitmap and the bit it needs to go to
static unsigned char VFD_CONVERT(const unsigned char* font, unsigned char from, unsigned char to) {
return ((*font >> from) & 0x01) << to;
//return (*font & (1 << from)) ? (1<<to) : 0;
}
// macros to make it easyer to read and see
#define CM_01 font+0, 4
#define CM_02 font+0, 3
#define CM_03 font+0, 2
#define CM_04 font+0, 1
#define CM_05 font+0, 0
// One of the 7 lines I have to send
o = VFD_CONVERT(CM_07,6) | VFD_CONVERT(CM_13,5) | VFD_CONVERT(CM_30,4) | VFD_CONVERT(CM_23,3) | VFD_CONVERT(CM_04,2) | VFD_CONVERT(CM_14,1) | VFD_CONVERT(CM_33,0);
send(o);
這是oviously不是所有的代碼。你可以在my Google code repository以上看到其餘的內容,但它應該讓你知道我在做什麼。
所以我的問題是,如果有更好的方法來優化這個或做翻譯?
改變對VFD_CONVERT return語句使GCC發瘋(-O1,-O2,-O3和-Os做它)和代碼擴展到1400個字節。如果我使用帶有inline的return語句,它會將其減少到800字節。我一直在討論asm生成的語句,目前我很想將它全部寫入asm中,因爲我開始認爲編譯器不知道它在做什麼。然而,我想也許是我的,我不知道我在做什麼,所以它混淆了編譯器。
作爲一個側面說明,有工作的代碼,都返回語句上傳自定義字符,它被顯示(一個奇怪的錯誤,我必須發送它兩次,但這是另外一個問題)。