找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7019|回复: 5
打印 上一主题 下一主题
收起左侧

C51单片机多字节移位

[复制链接]
跳转到指定楼层
楼主
ID:6202 发表于 2010-6-7 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    前辈们,指点一下哟。

    原来用汇编编程很容易的就进行多字节的移位,现在刚开始学用Keil  C编程,就搞不懂从哪下手:

 

    就是比如一次性移位11个字节,比如左移,将最高字节的最高位移出丢失,并将下一字节的最高位移进前一字节的最低位,如此进行将后10个字节的最高位分别移进其前一字节的最低位,最后一个字节的最低位补0(或补1)。右移反过来。

 

   汇编的时候有RRL,RRC就搞定了,C怎么弄啊?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:23004 发表于 2010-6-7 21:08 | 只看该作者

给你看一个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();
 }
}

[此贴子已经被作者于2010-6-7 21:08:59编辑过]
回复

使用道具 举报

板凳
ID:6202 发表于 2010-6-8 12:20 | 只看该作者

 

  我这样做的,比如有这些字节要参与移位: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;

 

 

   这样子就可以同时将9个字节顺次向前移一位,如果要连续移多位,再加个循环控制就行了。

 

  我这样做是想让LED显示屏上的汉字向左或向右移动,昨晚就这样写搞定了。

回复

使用道具 举报

地板
ID:23004 发表于 2010-6-9 12:15 | 只看该作者
牛。。。。。。。。
回复

使用道具 举报

5#
ID:11046 发表于 2010-6-10 18:32 | 只看该作者
3楼的不错,不过我会老老实实的做个循环.
回复

使用道具 举报

6#
ID:718536 发表于 2021-4-21 00:32 | 只看该作者
3楼大佬的算法够简洁啊。不过暂时领会不到。还是老老实实循环吧送数吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表