音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

小程序調(diào)試結(jié)果發(fā)現(xiàn)跟要求的不同,請(qǐng)幫忙看看.謝謝.

作者:ihafd 欄目:單片機(jī)
小程序調(diào)試結(jié)果發(fā)現(xiàn)跟要求的不同,請(qǐng)幫忙看看.謝謝.
按程序的意思,M1,M2應(yīng)該是跟著al,a2的續(xù)位移動(dòng)而變化的.
但現(xiàn)在調(diào)式結(jié)果發(fā)現(xiàn),M1,M2不是跟著al,a2的續(xù)位移動(dòng)而變化,
而是跟著b1,b2的變化而變化.

我是想實(shí)現(xiàn):
b1是1,al就移一位.
b1是2,a1就移二位
把移位的值送給M1.
如此下去....

b2是1,a2就移一位.
b2是2,a2就移二位
把移位的值送給M1.
如此下去....


為什么不行啦?

謝謝!!


#include <reg51.h>
typedef unsigned int unint;
typedef unsigned CHAR unCHAR;

sbit SER=P1^0;
sbit SRCLK=P1^1;
sbit RCLK=P1^2;
sbit G595=P1^3;
sbit E154=P1^4;
sbit A154=P0^0;
sbit B154=P0^1;
sbit C154=P0^2;
sbit D154=P0^3;
void shortdelay(unCHAR i);
void DISPLAY(void);



unCHAR code table[]=  {   0x08,0x20,0x84,0x20,0x46,0x7F,0x60,0x80,
                          0x01,0x04,0x20,0x04,0x20,0x04,0x20,0x04,
                          0x20,0x04,0x3F,0x0FC,0x20,0x04,0x20,0x04,
                          0x60,0x04,0x20,0x0C,0x00,0x04,0x00,0x00             /*&frac12;&shy;*/  
                           };  
        
void main(void)
{                   
   unCHAR i;
   E154=0;
   G595=0;
   SRCLK=0;
   RCLK=0;
   TMOD=0x1;
//   TH0=0xFC; TL0=0x18;
   TR0=0;
    for(i=0;i<64;i++)
     {
       SER=1;
       SRCLK=1;
       shortdelay(15);
       RCLK=1;
       shortdelay(20);
       SRCLK=0;
       RCLK=0;
      }   
     
   while(1)
    {
     DISPLAY();
    }
}

void DISPLAY(void)
{
   unCHAR k,j,b1,b2,a1,a2,M1,M2;
  for(j=0;j<16;j++)             //note.
      {
        k=j*2;
        if(j==0)  
           SER=0;
         else  
           SER=1;
        SRCLK=1;
        shortdelay(15);
        RCLK=1;
        shortdelay(20);
        SRCLK=0;
        RCLK=0;
        E154=0;
        a1=table[k];
        a2=table[k+1];
        TH0=0xFC; TL0=0x18;
        TR0=1;
       while(!TF0)
       {
       for(b1=0;b1<8;b1++)
           {
         M1=a1>>b1;
           if(M1&0x01)
            { P0=b1; shortdelay(4); }
          else
             shortdelay(4);
        }
       for(b2=0;b2<8;b2++)
        {
          M2=a2>>b2;
          if(M2&0x01)
            { P0=8+b2; shortdelay(4); }
           else
             shortdelay(4);
         }
       }
       E154=1;
       TR0=0;
      }
}

void shortdelay(unCHAR i)
{
   while(--i);
}
                    

* - 本貼最后修改時(shí)間:2005-11-14 16:38:55 修改者:ihafd

2樓: >>參與討論
莊莊
你試試這樣
M1=a1>>b1;M2=a2>>b2;改為:
M1=b1>>a1;M2=b2>>a2;         

3樓: >>參與討論
ihafd
這樣不是把我原來的意思都改變嗎?
謝謝.

4樓: >>參與討論
莊莊
恰恰相反,你試試
M1,M2是跟著al,a2的續(xù)位移動(dòng)而變化的
你原來的反了。

5樓: >>參與討論
ihafd
按照你的改正,調(diào)試發(fā)現(xiàn)M1總是等于a1.
不正確.
謝謝.

6樓: >>參與討論
cxd731
移位運(yùn)算符的右邊只能是數(shù)字,不能是變量!
比如M1=A1》B1,編譯器雖然不報(bào)錯(cuò),但結(jié)果只能是B1,它把前面都過濾了;假設(shè)這個(gè)時(shí)候B1=2,你寫成M1=A1》2,結(jié)果就跟你意料中的一致了……

7樓: >>參與討論
cxd731
我也比較笨,只能想到用SWITCH-case實(shí)現(xiàn)你那個(gè)功能
SWITCH(b1)
{
      case 1;  
           m1=a1>>1;
           break;
      case 2:
           m1=a1>>2;
           break;
      ........
      ........
      default:
           break;
}
樓主有好的辦法就帖出來大家學(xué)習(xí)學(xué)習(xí)……

* - 本貼最后修改時(shí)間:2005-11-14 18:37:53 修改者:cxd731

8樓: >>參與討論
李冬發(fā)
在標(biāo)準(zhǔn)C中,移位運(yùn)算符可以是變量的,Kiel C就不知道啦
你想要實(shí)現(xiàn)什么?
續(xù)位是什么意思?
你是用什么方法確定M1與M2的值是不對(duì)的?


9樓: >>參與討論
cxd731
呵呵,想到了
不需要設(shè)置M1、M2了,可以少兩個(gè)變量~ 如下:
if(a1&b1)    //b1大于等于1,且小于等于8
{
 P0=b1;
 shortdelay(4);
}
else

  shortdelay(4);

這樣應(yīng)該可以實(shí)現(xiàn)你想要的功能……

* - 本貼最后修改時(shí)間:2005-11-14 20:07:49 修改者:cxd731

10樓: >>參與討論
ihafd
哈哈!有意思.問題越來越多了.
我查了一下書,發(fā)現(xiàn)如下.

1.實(shí)驗(yàn)a1,a2的續(xù)位右移,應(yīng)該這樣:  M1=al>>b1; M2=a2>>b2;
  莊莊的:M1=b1>>a1;M2=b2>>a2; 這樣是把b1 b2右移al a2 位了.不合題意.
2.KEIL C51的右移運(yùn)算是技持變量的.
  例如如下 :
    k=0x80;
   for(i=0;i<8;i++)
    j=k>>i;
3.這種方法并不能實(shí)現(xiàn)a1,a2的續(xù)位右移.
   if(a1&b1)    //b1大于等于1,且小于等于8
   {
    P0=b1;
    shortdelay(4);
    }
     else
    {
      shortdelay(4);
     }

我這樣分析不知對(duì)不對(duì)?

我的程序的問題還是未解決啊!!
那位可以幫幫看看.
    


11樓: >>參與討論
taoest
是不是漏了這里?
       for(b1=0;b1<8;b1++)
           {
         M1=a1>>b1;
           if(M1&0x01)
            { P0=b1; shortdelay(4); }
          else
            {
               P0=0x00;   //是不是漏了這里。
              shortdelay(4);
             }
        }

12樓: >>參與討論
cxd731
樓主誤會(huì)我的意思了
我說的那種方法不需要把a(bǔ)1、a2右移!我只是說實(shí)現(xiàn)你想要的功能,b1每種情況下只有一個(gè)位是1的,a1&b1的結(jié)果就是來判斷那個(gè)位,從而就能實(shí)現(xiàn)你想要P0口的狀態(tài)了~
難道你不是想這樣的嗎?不要老扯著右移不放:)

13樓: >>參與討論
empire2010
我覺得cxd731的方法不錯(cuò)
 
14樓: >>參與討論
ihafd
我作了如下修改
我作了如下修改,這樣行不行?

while(!TF0)
       {
       for(b1=0;b1<8;b1++)
           {
           if(a1>>b1&0x01)
            { P0=b1; shortdelay(4); }
          else
             shortdelay(4);
        }
       for(b2=0;b2<8;b2++)
        {
          if(a2>>b2&0x01)
            { P0=8+b2; shortdelay(4); }
           else
             shortdelay(4);
         }
       }


15樓: >>參與討論
cxd731
為什么一定要用移位呢???
while(!TF0)
       {
       for(b1=1;b1<9;b1++)
           {
           if(a1&b1)
            { P0=b1; shortdelay(4); }
          else
             shortdelay(4);
        }
       for(b2=1;b2<9;b2++)
        {
          if(a2&b2)
            { P0=8+b2; shortdelay(4); }
           else
             shortdelay(4);
         }
       }
這樣不是更簡(jiǎn)潔嗎,你試試看行不行?

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
哪位大哥有四字節(jié)除以單字節(jié)二進(jìn)制無符號(hào)除法子程序,兄弟急用
請(qǐng)問:怎樣把單片機(jī)內(nèi)的程序讀取出來?
51單片機(jī)能檢測(cè)的最小電壓?
zilog1974 請(qǐng)進(jìn)
PDIUSBD12這樣是不是很浪費(fèi)?
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)