找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2186|回复: 8
收起左侧

单片机LED点阵显示程序问题,C语言移位不理解

[复制链接]
ID:810884 发表于 2020-8-4 16:02 | 显示全部楼层 |阅读模式
为什么在LED点阵显示的时候里面的 通过 595 发送 2 个字节的数据 的函数中
SER = dat >> 7; //从最高位开始发送
dat <<= 1;
一位一位的给dat了那单片机是怎么得到的,
还有就是显示的时候怎么一直用不到段选的数组
求大佬帮忙看看,谢谢!谢谢!

#include "reg51.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit SRCLK=P3^6; sbit RCLK=P3^5; sbit SER=P3^4;

u8 ledduan[]={0x00,0x00,0x3E,0x41,0x41,0x41,0x3E,0x00}; // 类 似 于 动态数码管的段选
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; // 类 似 于动态数码管的位选
void Hc595SendByte(u8 dat)
{ u8 a;
  SRCLK = 1; RCLK = 1;
for(a=0;a<8;a++) //发送 8 位数
{ SER = dat >> 7;
dat <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_(); SRCLK = 1;
}

RCLK = 0;
_nop_(); _nop_(); RCLK = 1;
}void main() { u8 i=0;
while(1) { for(i=0;i<8;i++) { Hc595SendByte(ledwei); LED1(ledwei); delay(10); } }
}

回复

使用道具 举报

ID:313246 发表于 2020-8-4 16:43 | 显示全部楼层
右移7位就是最高位,然后每次再左移一个个取出来
回复

使用道具 举报

ID:811253 发表于 2020-8-4 16:52 | 显示全部楼层
dat >> 7; 把dat的最高位移到最低位。其它位置用0补上,之后把这个值赋给SER,即如查那一位是1。P34就输出1,如果为0就输出0。dat <<= 1;数据左移。
回复

使用道具 举报

ID:86926 发表于 2020-8-4 17:10 | 显示全部楼层
说的问题不是很清楚,不是很明白你想要的知道什么。首先是单片机发送数据给595,dat<<=1;等同于dat=dat<<1;意思就是dat数据整体左移一位后再赋给dat,左移后的值覆盖之前的值;还有LED1函数是怎么写的,那里有没有行或列的输出。
回复

使用道具 举报

ID:810884 发表于 2020-8-4 17:59 | 显示全部楼层
蓝魄 发表于 2020-8-4 17:10
说的问题不是很清楚,不是很明白你想要的知道什么。首先是单片机发送数据给595,dat

移位的运算我知道,就是有点不知道移位后是通过那个把这个8位给单片机的,请教一下
代码是给的开发攻略复制过来的可能不小心删了那个函数
void LED1(u8 dat1) { P0=dat1; }
回复

使用道具 举报

ID:804115 发表于 2020-8-4 18:01 | 显示全部楼层
楼主是 想问单片机是怎么一个bit一个bit获取到数据的吧!
实际上可以理解成DQ触发器构成的移位寄存器,首先将要发送的bit电平在DAT输入口放好,然后给触发器的CLK口一个下降沿,这个BIT的数据就会送到触发器的Q端,就相当于放到总线发送出去了。
然后重复上面的过程就可以发送所有的bit了。
如果想详细了解,建议百度触发器的类型 以及 移位寄存器的原理 等等。
回复

使用道具 举报

ID:810884 发表于 2020-8-4 18:22 | 显示全部楼层
1692483014 发表于 2020-8-4 18:01
楼主是 想问单片机是怎么一个bit一个bit获取到数据的吧!
实际上可以理解成DQ触发器构成的移位寄存器,首 ...

对对,有点懂了的样子,请问这样理解对吗,是不是一个下降沿的时候会把SER扫一次,然后把地位存起来,

回复

使用道具 举报

ID:213173 发表于 2020-8-5 07:56 | 显示全部楼层
单片机发送的串行数据通过595转换成并行数据输出。重新整理一下便于楼主理解:
void Hc595SendByte(u8 dat)//参数dat是想要发送的数据
{
        u8 a;
        for(a=0;a<8;a++) //由高到低循环发送8位数据 (1个字节)
        {
                SER = dat >> 7;//将dat最高位赋值SER端口送到595
                SRCLK = 1; //移位脉冲 595内部现存数据由低到高移1位,SER状态补入最低位
                _nop_();   //短暂延时
                _nop_();
                SRCLK = 0; //为下次移位准备
                dat <<= 1; //dat左移1位,最高位溢出,最低位补0
        }//
        RCLK = 1;     //锁存脉冲,把595内部现存数据锁存到输出端口锁存器输出并行数据
        _nop_();    //短暂延时
        _nop_();
        RCLK = 0;    //为下次锁存准备
}
回复

使用道具 举报

ID:810884 发表于 2020-8-5 08:37 | 显示全部楼层
wulin 发表于 2020-8-5 07:56
单片机发送的串行数据通过595转换成并行数据输出。重新整理一下便于楼主理解:
void Hc595SendByte(u8 dat ...

这样就都理解了,谢谢,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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