※ 引述《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