|
|||||||||||
| 技術(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ī) |
按程序的意思,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 /*½­*/ }; 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樓: | >>參與討論 |
| 作者: 莊莊 于 2005/11/14 16:44:00 發(fā)布:
你試試這樣 M1=a1>>b1;M2=a2>>b2;改為: M1=b1>>a1;M2=b2>>a2; |
|
| 3樓: | >>參與討論 |
| 作者: ihafd 于 2005/11/14 16:56:00 發(fā)布:
這樣不是把我原來的意思都改變嗎? 謝謝. |
|
| 4樓: | >>參與討論 |
| 作者: 莊莊 于 2005/11/14 17:00:00 發(fā)布:
恰恰相反,你試試 M1,M2是跟著al,a2的續(xù)位移動(dòng)而變化的 你原來的反了。 |
|
| 5樓: | >>參與討論 |
| 作者: ihafd 于 2005/11/14 17:39:00 發(fā)布:
按照你的改正,調(diào)試發(fā)現(xiàn)M1總是等于a1. 不正確. 謝謝. |
|
| 6樓: | >>參與討論 |
| 作者: cxd731 于 2005/11/14 18:07:00 發(fā)布:
移位運(yùn)算符的右邊只能是數(shù)字,不能是變量! 比如M1=A1》B1,編譯器雖然不報(bào)錯(cuò),但結(jié)果只能是B1,它把前面都過濾了;假設(shè)這個(gè)時(shí)候B1=2,你寫成M1=A1》2,結(jié)果就跟你意料中的一致了…… |
|
| 7樓: | >>參與討論 |
| 作者: cxd731 于 2005/11/14 18:36:00 發(fā)布:
我也比較笨,只能想到用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ā) 于 2005/11/14 19:32:00 發(fā)布:
在標(biāo)準(zhǔn)C中,移位運(yùn)算符可以是變量的,Kiel C就不知道啦 你想要實(shí)現(xiàn)什么? 續(xù)位是什么意思? 你是用什么方法確定M1與M2的值是不對(duì)的? |
|
| 9樓: | >>參與討論 |
| 作者: cxd731 于 2005/11/14 20:02:00 發(fā)布:
呵呵,想到了 不需要設(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 于 2005/11/14 21:51:00 發(fā)布:
哈哈!有意思.問題越來越多了. 我查了一下書,發(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 于 2005/11/14 22:59:00 發(fā)布:
是不是漏了這里? for(b1=0;b1<8;b1++) { M1=a1>>b1; if(M1&0x01) { P0=b1; shortdelay(4); } else { P0=0x00; //是不是漏了這里。 shortdelay(4); } } |
|
| 12樓: | >>參與討論 |
| 作者: cxd731 于 2005/11/14 23:05:00 發(fā)布:
樓主誤會(huì)我的意思了 我說的那種方法不需要把a(bǔ)1、a2右移!我只是說實(shí)現(xiàn)你想要的功能,b1每種情況下只有一個(gè)位是1的,a1&b1的結(jié)果就是來判斷那個(gè)位,從而就能實(shí)現(xiàn)你想要P0口的狀態(tài)了~ 難道你不是想這樣的嗎?不要老扯著右移不放:) |
|
| 13樓: | >>參與討論 |
| 作者: empire2010 于 2005/11/15 11:59:00 發(fā)布:
我覺得cxd731的方法不錯(cuò) |
|
| 14樓: | >>參與討論 |
| 作者: ihafd 于 2005/11/15 16:09:00 發(fā)布:
我作了如下修改 我作了如下修改,這樣行不行? 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 于 2005/11/15 16:16:00 發(fā)布:
為什么一定要用移位呢??? 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)潔嗎,你試試看行不行? |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |