找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5140|回复: 3
收起左侧

[求助]谁能详细解释下点阵左移的那个语句

[复制链接]
ID:32490 发表于 2012-6-16 11:09 | 显示全部楼层 |阅读模式

板子附带的程序中那个点阵扫描里有几句我不懂,网上查了很多,实现移动都是这几句,大同小异,我想问下这几句怎么理解,我怎么老看不明白呢

下面是板子附带的程序:

/*8X8行扫描,左移显示
如果将扫描方式改为列扫描,那么左右移动的程序就容易写了,但当点阵比较巨大
并且硬件已经定下时,改变扫描方式不是好方法,甚至不可能实现。这里是以行
扫描为例(逐行取字模),第一次取字码数组中的第1~8个数据到点阵列输入端,
行码 扫描1~8行。第二次将第一次的 1~8个数据都循环左(右)移一位,并且
将第9个数据的最高位移到第二次数据的最低处,再输入到列端口,行扫描1~8行。
即每次扫描都要把前一次扫描的列码左移一位。
程序如下:
*/
#include<reg52.h>
#include "51hei.H"
#define uchar unsigned char
#define uint unsigned int
uchar code TAB[]={0xFF,0xF7,0xFB,0x81,0xFB,0xF7,0xFF,0xFF};
uchar i,t,j=0;
delay(uchar t)
{
while (t--)
{;}
}
void main(void)
{ uchar T,Y,Q,d;
P2=0x75;
while(1)
   {
   for(Q=0;Q<8;Q++)
    for(T=0;T<50;T++)    //速度
      {
    d=0x01;
out164(d);
          for(i=0;i<8;i++)
         {
       Y=TAB[i+1]*256+TAB;
    Y=Y<<(7-Q)|Y>>Q;
    P0=Y%256;
    delay(60);
    d=d<<1|d>>7;
 P0=0xff; // 消隐,很重要,不加要红一片
out164(d);
       }
    }
}
}
其中    Y=Y<<(7-Q)|Y>>Q;
是实现循环左移的吗?

    d=d<<1|d>>7;
这句好像那个点阵移动的程序都有,我想是实现左移的(右移就是<<换成>>),怎么理解呢?怎么这样就实现了左移呢?

我想还有很多新手和我一样吧,请帮忙啊

回复

使用道具 举报

ID:52669 发表于 2013-8-18 15:50 | 显示全部楼层
wtf3505 发表于 2012-6-29 17:58
以下是引用wy704972600在2012-6-23 19:15:53的发言:
d=d&lt;&lt;1|d&gt;&gt;7;是为了实现循环左移。比如d为0X ...

我觉得就是为了防止数据丢失吧,反正他们是或的关系。而且后面那个只针对0x01
回复

使用道具 举报

ID:32490 发表于 2012-6-29 17:58 | 显示全部楼层
以下是引用wy704972600在2012-6-23 19:15:53的发言:

d=d<<1|d>>7;是为了实现循环左移。比如d为0X01,d=d<<1|d>>7;后为0x02.而如果为0X80,d=d<<1|d>>7;后为0X01;根据符号的优先级来计算

谢谢!我开始就是不理解0x01经过"d=d<<1|d>>7;"后变为0x02,因为d=d<<1;就已经变为0x02,为什么还要|d>>7呢 一直纠结在这...菜鸟就是这样子的,再次谢谢!

回复

使用道具 举报

ID:35727 发表于 2012-6-23 19:15 | 显示全部楼层

d=d<<1|d>>7;是为了实现循环左移。比如d为0X01,d=d<<1|d>>7;后为0x02.而如果为0X80,d=d<<1|d>>7;后为0X01;根据符号的优先级来计算

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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