精華區beta Electronics 關於我們 聯絡資訊
※ 引述《CuckooBoy (阿書)》之銘言: : 下面的程式,動作正常,只是覺得if太多,不知道有辦法縮短嗎?(不影響動作) : 另外,想知道.......這樣的語法有沒有什麼暇吃或不妥的地方法? : 還有還有......就是..... : for(i=0;i<3;i++) : x=abc[i]; : 請問i++是一次做完?還是進入for只做一次,0~3要進入三次 i=0~2進去執行..離開FOR迴圈時i=3 : 會問這問題原因是.....下面程式i我用計數代48*i-1 : 我想用for取代.....但是覺得那個i++如果組合語言角度想的話 : 應該是........"進入for時才作一次i++" : 所以用for改寫,好像會讓程式動作錯誤 為何用for? 你不是已經用while來讓i做counter的嗎? : 這裡我覺得你是要抓47,95,143.....對嗎? 也就是你每次傳48個bit最後一個bit給1當end-bit 那嚜你為何不改寫成.. i=0; if( (i%48) == 47 ) LE=1; else if(i==766) LE=1; else { LE=0; //這裡可以併入你傳data-bit的程式 // } ps.多一個ELSE IF 是因為我覺得IF裡面多一個|| 不好解讀(看了不順眼..太長了)而且complier翻出來的組語好像比較長? ================================================================= : #define SDI P1_0 : #define DCLK P1_1 : #define LE P1_2 : #define GCLK P1_3 : #include "AT89C51.h" : unsigned int code SDI_LUT [] = {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, : 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0, : 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1}; : main() : { : unsigned int SDI_cnt,LE_cnt = 0; : unsigned int i = 1; : while(1) : { : DCLK = 0; : SDI = SDI_LUT[SDI_cnt]; : DCLK = 1; : if (LE_cnt == 48*i-1||LE_cnt == 766) : { : LE = 1; : } : else : { : LE = 0; : } : if (SDI_cnt < 47) : { : SDI_cnt++; : } : else : { : SDI_cnt = 0; : if (i < 16) : { : i++; : } : else : { : i = 1; : } : } : if (LE_cnt < 767) : { : LE_cnt++; : } : else : { : LE_cnt = 0; : } : } : } ps.你要做的事應該是類似uart傳送資料的動作吧... 那麼你應該用interrupt才對..你這樣出來的波型.. 每個bit的脈波寬度可能都不一樣喔^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.142.174.135