找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7802|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

C51單片機(jī)多字節(jié)移位

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:6202 發(fā)表于 2010-6-7 10:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

    前輩們,指點(diǎn)一下喲。

    原來(lái)用匯編編程很容易的就進(jìn)行多字節(jié)的移位,現(xiàn)在剛開(kāi)始學(xué)用Keil  C編程,就搞不懂從哪下手:

 

    就是比如一次性移位11個(gè)字節(jié),比如左移,將最高字節(jié)的最高位移出丟失,并將下一字節(jié)的最高位移進(jìn)前一字節(jié)的最低位,如此進(jìn)行將后10個(gè)字節(jié)的最高位分別移進(jìn)其前一字節(jié)的最低位,最后一個(gè)字節(jié)的最低位補(bǔ)0(或補(bǔ)1)。右移反過(guò)來(lái)。

 

   匯編的時(shí)候有RRL,RRC就搞定了,C怎么弄啊?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:23004 發(fā)表于 2010-6-7 21:08 | 只看該作者

給你看一個(gè)C的移位流水燈程序吧!

#include <AT89X51.H>
#include <../stdint.h>

#define PORT P1


void delay()
{
 uint16_t i;
 for(i=0; i<20000; i++);
}


void led_8()
{
 uint8_t i;
 uint8_t tmp = 0x01;
 for(i=0; i<8; i++)
 {
  PORT =  ~(tmp<<i);//左移
  delay();
 }
 tmp = 0x80;
 for(i=0; i<8; i++)
 {
  PORT =  ~(tmp>>i);//右移
  delay();
 }
}

void main()
{
 while(1)
 {
  led_8();
 }
}

[此貼子已經(jīng)被作者于2010-6-7 21:08:59編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

板凳
ID:6202 發(fā)表于 2010-6-8 12:20 | 只看該作者

 

  我這樣做的,比如有這些字節(jié)要參與移位:unsigned char  a[]={0xfe,0x25,0x32,0x56,0x4e,0x56,0xab,0xef,0xf3}:

 

   a[ i]=a[ i]<<1|((a[i+1]&0x80)? 1:0);      //    i 由0到7 。

   a[8]=a[8]<<1;

 

 

   這樣子就可以同時(shí)將9個(gè)字節(jié)順次向前移一位,如果要連續(xù)移多位,再加個(gè)循環(huán)控制就行了。

 

  我這樣做是想讓LED顯示屏上的漢字向左或向右移動(dòng),昨晚就這樣寫(xiě)搞定了。

回復(fù)

使用道具 舉報(bào)

地板
ID:23004 發(fā)表于 2010-6-9 12:15 | 只看該作者
牛。。。。。。。。
回復(fù)

使用道具 舉報(bào)

5#
ID:11046 發(fā)表于 2010-6-10 18:32 | 只看該作者
3樓的不錯(cuò),不過(guò)我會(huì)老老實(shí)實(shí)的做個(gè)循環(huán).
回復(fù)

使用道具 舉報(bào)

6#
ID:718536 發(fā)表于 2021-4-21 00:32 | 只看該作者
3樓大佬的算法夠簡(jiǎn)潔啊。不過(guò)暫時(shí)領(lǐng)會(huì)不到。還是老老實(shí)實(shí)循環(huán)吧送數(shù)吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表