找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2408|回复: 12
收起左侧

关于STC单片机控制HC595的问题

[复制链接]
ID:590194 发表于 2019-9-18 09:08 | 显示全部楼层 |阅读模式
本人做了个3串的HC595然后 关于代码  真的搞不明白...
有人有现成的帖子吗?
网上看了这个帖子  但是 不明白
1个是 HC595的通讯控制是2进制的吗?那么01001010   01010101 10101010 对应的指示灯的16进制
是0x4A55AA 这么写吗?
temp=0x4A55AA
具体怎么改?
这么改没效果啊 还是1个个的灭灯
原帖 小白 不知到怎么弄 有例子的吗??

单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit Sh_cp=P5^4;
sbit Ds=P3^3;
sbit St=P3^2;
sbit Sh_cp1=P1^0;
sbit Ds1   =P1^1;
sbit St1   =P1^2;
uchar temp;
uchar temp1;
void In_Data(void)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
   Sh_cp=0;
   _nop_();_nop_();
   temp<<=1;Ds=CY;
   Sh_cp=1;
   _nop_();_nop_();
   Sh_cp=0;
   _nop_();_nop_();
  }
}
void Out_Data(void)
{
  St=0;
  _nop_();_nop_();
  St=1;     //上升沿送到锁存器
  _nop_();_nop_();
  St=0;            //锁存显示
}
void In_Data1(void)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
   Sh_cp1=0;
   _nop_();_nop_();
   temp1<<=1;Ds1=CY;
   Sh_cp1=1;
   _nop_();_nop_();
   Sh_cp1=0;
   _nop_();_nop_();
  }
}
void Out_Data1(void)
{
  St1=0;
  _nop_();_nop_();
  St1=1;     //上升沿送到锁存器
  _nop_();_nop_();
  St1=0;            //锁存显示
}
void DelayMS(unsigned int ms)
{
unsigned char i;
while(ms--)
for(i=0;i<120;i++);
}
void main()
{
   uchar i,j;
while(1)
{
  for(j=2;j>0;j--)
  {       temp1=j;
     In_Data1();
       Out_Data1();
   for(i=0;i<8;i++)
   {
    temp=1<<i;
     In_Data();
       Out_Data();
       DelayMS(1000);
   }
   // DelayMS(2000);
     }
}
}
?
回复

使用道具 举报

ID:149144 发表于 2019-9-18 15:29 | 显示全部楼层
我做过两块的 有仿真,可以给你参考一下
回复

使用道具 举报

ID:462827 发表于 2019-9-18 16:08 | 显示全部楼层
你定义是uchar temp吧
temp=0x4A55AA 这样写能对?几个字节了你知道不?
回复

使用道具 举报

ID:158375 发表于 2019-9-18 17:36 | 显示全部楼层
主要是看看清除 HC595 手册即可,程序只是具体的实现。
回复

使用道具 举报

ID:141497 发表于 2019-9-18 23:54 | 显示全部楼层
楼主请认真看一下595的时序图,分成三个字节传输三次,之后再锁存片选,可达到目的,你的数据定义是8位的,不能temp=0x4A55AA这样写,可以分成:0x4a,ox55,0xaa三次传输。希望我的回答能对你有所帮助!
回复

使用道具 举报

ID:613370 发表于 2019-9-19 00:41 | 显示全部楼层
虽然看不懂 感觉很厉害.
回复

使用道具 举报

ID:213173 发表于 2019-9-19 06:42 | 显示全部楼层
给你改写成一次发送3个字节的示例,1T的MCU需要加短延时,12T的51不需要加短延时。 无标题.jpg

  1. #include<reg52.h>
  2. #include<intrins.h>

  3. sbit Ds=P1^0;//串行数据输入端 14脚
  4. sbit Sh=P1^1;//移位寄存器时钟输入端 11脚
  5. sbit St=P1^2;//存储寄存器时钟输入 12脚
  6. sbit Mr=P1^3;//主复位端,低电平复位 10脚

  7. void DelayMS(unsigned int ms)
  8. {
  9.         unsigned char i;
  10.         while(ms--)
  11.                 for(i=0;i<120;i++);
  12. }

  13. void In_Data(unsigned char a,b,c)
  14. {
  15.         unsigned char i,j;
  16.         j=a;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 j<<=1;
  20.                 _nop_();_nop_();
  21.                 Ds=CY;
  22.                 _nop_();_nop_();
  23.                 Sh=0;
  24.                 _nop_();_nop_();
  25.                 Sh=1;
  26.         }
  27.         j=b;
  28.         for(i=0;i<8;i++)
  29.         {
  30.                 j<<=1;
  31.                 _nop_();_nop_();
  32.                 Ds=CY;
  33.                 _nop_();_nop_();
  34.                 Sh=0;
  35.                 _nop_();_nop_();
  36.                 Sh=1;
  37.         }
  38.         j=c;
  39.         for(i=0;i<8;i++)
  40.         {
  41.                 j<<=1;
  42.                 _nop_();_nop_();
  43.                 Ds=CY;
  44.                 _nop_();_nop_();
  45.                 Sh=0;
  46.                 _nop_();_nop_();
  47.                 Sh=1;
  48.         }
  49.         St=0;
  50.         _nop_();_nop_();
  51.         St=1;
  52. }

  53. void main()
  54. {
  55.         Mr=0;
  56.         DelayMS(1);
  57.         Mr=1;
  58.         In_Data(0x4A,0x55,0xAA);
  59.         while(1);
  60. }
复制代码




回复

使用道具 举报

ID:590194 发表于 2019-9-19 07:14 来自手机 | 显示全部楼层
51jia 发表于 2019-9-18 23:54
楼主请认真看一下595的时序图,分成三个字节传输三次,之后再锁存片选,可达到目的,你的数据定义是8位的, ...

关键是怎么传输给595  没搞明白 希望大师指点
回复

使用道具 举报

ID:590194 发表于 2019-9-19 08:27 | 显示全部楼层
cuihaodianzi 发表于 2019-9-18 15:29
我做过两块的 有仿真,可以给你参考一下

好的挖 能发给我看下吗 万分感谢啊
回复

使用道具 举报

ID:213173 发表于 2019-9-19 09:30 | 显示全部楼层
sq8422779 发表于 2019-9-19 07:14
关键是怎么传输给595  没搞明白 希望大师指点

楼主看7楼回帖
回复

使用道具 举报

ID:590194 发表于 2019-9-19 21:23 来自手机 | 显示全部楼层
wulin 发表于 2019-9-19 06:42
给你改写成一次发送3个字节的示例,1T的MCU需要加短延时,12T的51不需要加短延时。

我去,大神,一语惊醒梦中人!我总算明白为什么要<<=1了前面的for8 是为了堆8个二进制数字过去 明白了 多谢
回复

使用道具 举报

ID:590194 发表于 2019-9-19 21:26 来自手机 | 显示全部楼层
wulin 发表于 2019-9-19 09:30
楼主看7楼回帖

其实文中我一直没搞明白 二进制数据怎么赋值 一看你的立刻明白,其实我文中根本就没有赋任何数据到temp里,所以里面是0 难怪我测试灯是一个个的亮,一看你的就明白了,我根本就没有赋值进去
回复

使用道具 举报

ID:470497 发表于 2019-9-20 10:16 | 显示全部楼层
PIC 单片机程序,供参考:

#include <stdlib.h>
#include <stdio.h>

#define SIO_CLK RD4
#define SIO_RCK RD5
#define SIO_Data RD6


void SerialIO_init()     //74HC595串行发送初始化
{
  TRISD4 = 0;
  TRISD5 = 0;       
  TRISD6 = 0;    //PORTD 输出: 不受其他模板影响。输入: 在上电复位时,这些引脚被配置为数字输入。
}

/*-------------------------74HC595串行转并行控制IO------------------------------------------------*/
void HC595_SIO(unsigned char Data)    // 74HC595串行发送
{
   unsigned char i;
    for(i = 0;i < 8;i++)               
    {
           SIO_CLK = 0;              
      if( Data&0x80)
                 {
                   SIO_Data = 1;
                 }   
       else
                 {   
                   SIO_Data = 0;
                 }
       SIO_CLK = 1;         
     Data <<= 1;           
    }
   SIO_RCK = 0;               //关锁存
   SIO_RCK = 1;               //开锁存
}
void SerialIO_fun(unsigned char Data[])  
{
  HC595_SIO(atoi(Data));
}
/*-------------------------End-----------------------------------------------------------------------*/
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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