找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机74hc595控制点阵程序dat<<=1; 移位的意义?

[复制链接]
跳转到指定楼层
楼主
ID:538271 发表于 2019-6-3 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:

#include "reg51.h"                         //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit SRCLK=P3^6;                  //595的11脚数据输入时钟线
sbit RCLK=P3^5;                    //595的12脚输出存储器锁存时钟线
sbit SER=P3^4;                      //595的14脚串行数据输入


/*******************************************************************************
* 函数名         : Hc595SendByte(u8 dat)
* 函数功能                   : 向74HC595发送一个字节的数据
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
        u8 a;
        SRCLK=0;
        RCLK=0;
        for(a=0;a<8;a++)
        {
                SER=dat>>7;
                dat<<=1;

                SRCLK=1;
                _nop_();
                _nop_();
                SRCLK=0;        
        }

        RCLK=1;
        _nop_();
        _nop_();
        RCLK=0;
}void main()
{               
        Hc595SendByte(0x80);
        P0=0x7f;
        while(1);               
}

SER=dat>>7;
dat<<=1;      请问这一步的 移位的意义具体是什么 ,为啥先啥最高位(最高位是啥?)然后又是次高位,为啥没有第三位,第四位等


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

使用道具 举报

沙发
ID:277550 发表于 2019-6-3 21:15 | 只看该作者
转成二进制显示,就知道哪个是最高位、哪个是最低位了
SER=dat>>7;  ///SER得到是值,是最高位的

dat<<=1;//然后,数据往右移一位。。。。。。准备下一次循环


1个unsign char是8 bits  。。。。。。。。。。。。。。
回复

使用道具 举报

板凳
ID:415123 发表于 2019-6-3 21:19 | 只看该作者
dat>>7;执行结果就是将最高位移到了最低位,然后将最低位赋给SER,
dat<<=1;执行结果就是将dat右移一位。
下一次循环时,就相当于将第7位赋给SER,循环8次,正好将1 byte数据按位发送出去了
回复

使用道具 举报

地板
ID:554215 发表于 2019-6-3 22:56 | 只看该作者
SER=dat>>7;//这句的意思是,把dat最高位的值赋给SER
dat <<= 1;//这句意思是,刚才已经把dat的最高位发送出去了,现在准备发dat的下一位。
通过一个循环for(a=0;a<8;a++)分8次分别把dat的8位发送出去的。
回复

使用道具 举报

5#
ID:511890 发表于 2019-6-3 23:17 | 只看该作者
SER=dat>>7; 将dat(二进制数)右移7位(正数左补0,右边舍弃。负数左补1,右边舍弃)所得到的结果(值)赋值给SER。dat自身值不变。
dat<<=1; 相当于dat = dat<<1; 即dat(二进制数)本身左移1位(左边的数舍弃,右边补0),然后复制给自身。就是自身执行左移。
回复

使用道具 举报

6#
ID:388197 发表于 2019-6-4 01:43 | 只看该作者
最高位就是最左边的一位,比如8位的二进制数1100 1010最高位为1 然后依次往右数,一般习惯称最右边的一位为第0位(2的0次方),或者最低位,所以对于8位二进制数,最高位就记作第7位.需要注意,比如8位二进制数 11 0010的最高位为0而不是1.
因为 11 0010 = 0011 0010.
为什么是最高位,这个是595的规定(也有其他的器件规定为先最低位的),就跟中国的车方向盘在左边,英国的车方向盘在右边一个道理.
SER=dat>>7;就是把dat这个8位二进制数右移7位后,赋值给SER,即将dat的最高位赋值给SER.注意是dat>>7,没有赋值操作,所以执行后,dat的值没有改变,原来是什么,现在还是什么.
dat<<=1;就是把dat原来的值左移一位,再赋值给dat,(这次有赋值操作,所以会改变原先的值)多出来的最低位自动用0来填充,比如dat原来为 1101 0111,执行了dat<<=1;后 dat为 1010 1110,其实就是将原数据的第6位(从左边数第2位),移到第7位.等下次执行 SER=dat>>7;时,将之赋下一次的DAT,依此类推,直到执行完循环.
回复

使用道具 举报

7#
ID:213173 发表于 2019-6-4 05:53 | 只看该作者
HC595是8位串行输入并行输出器件,也就是从高到低逐位输入8位数据,待完成后同时输出8位数据
void Hc595SendByte(u8 dat)
{
        u8 a;
        SRCLK=0;//移位时钟清0
        RCLK=0;//锁存输出清0
        for(a=0;a<8;a++)//循环8次,从高到低逐位输出8位数据
        {
                SER=dat>>7;//将变量dat右移7位,dat的最高位的值就到了最低位,并赋值数据输出端SER
                   //此时变量dat的值并没有改变
                dat<<=1;   //dat右移1位,最高位溢出舍弃,次高位成为最高位,最低位补0
                SRCLK=1;   //输出移位时钟信号,HC595收到的数据从低到高移动1位锁存,锁存器中最高位由Q7'溢出(级联)
                _nop_();
                _nop_();
                SRCLK=0;        
        }       
        RCLK=1;  //完成8位串行数据输入后打开HC595锁存器输出,8位数据同时输出,在此之前HC595输出端保持原态不变
        _nop_();
        _nop_();
        RCLK=0;
}
回复

使用道具 举报

8#
ID:123289 发表于 2019-6-4 08:22 | 只看该作者
结合电路图看,一目了然!
回复

使用道具 举报

9#
ID:796973 发表于 2020-8-13 08:38 | 只看该作者
wulin 发表于 2019-6-4 05:53
HC595是8位串行输入并行输出器件,也就是从高到低逐位输入8位数据,待完成后同时输出8位数据
void Hc595Se ...

我想问一下那个_nop_()空指令的作用是什么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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