OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3993|回复: 6

求助HC595单独控制一个输出时候不影响其他7个IO状态

[复制链接]

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-8-20
在线时间
19 小时
发表于 2021-3-16 21:02:49 | 显示全部楼层 |阅读模式
求助HC595单独控制一个输出时候不影响其他7个IO状态,我现在想控制8个继电器,只想改变其中一个状态,不能影响其他7个继电器状态,有没有雷士代码,我找的都是流水那些,听说是用锁存器。锁住其他状态。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8646
金钱
8646
注册时间
2020-5-11
在线时间
4103 小时
发表于 2021-3-17 11:09:07 | 显示全部楼层
可以的,可以像单片机输出脚一样一次性同时输出8位数据,注意看手册上对12脚的说明。
专治疑难杂症
回复 支持 反对

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4478
金钱
4478
注册时间
2018-5-14
在线时间
959 小时
发表于 2021-3-17 11:17:42 | 显示全部楼层
  1. #include "stm32f0xx.h"

  2. typedef union{
  3.                 uint8_t Bytes;
  4.                 struct{
  5.                                 uint8_t Bit0:1;
  6.                                 uint8_t Bit1:1;
  7.                                 uint8_t Bit2:1;
  8.                                 uint8_t Bit3:1;
  9.                                 uint8_t Bit4:1;
  10.                                 uint8_t Bit5:1;
  11.                                 uint8_t Bit6:1;
  12.                                 uint8_t Bit7:1;
  13.                 };
  14. }HC595_DataBytes_Typedef;
  15. void HC595_IO_Init(void);
  16. void HC595_WriteByte(HC595_DataBytes_Typedef *HC595_Data);
  17. #include "HC595.h"


  18. void HC595_IO_Init(void)
  19. {
  20.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB,ENABLE);

  21.         GPIO_InitTypeDef GPIO_InitStructure;

  22.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
  23.         GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  24.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_15;
  25.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
  26.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  27.         GPIO_Init(GPIOA,&GPIO_InitStructure);

  28.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
  29.         GPIO_Init(GPIOB,&GPIO_InitStructure);

  30. }

  31. void HC595_SCK_Set(void)
  32. {
  33.         GPIO_SetBits(GPIOA,GPIO_Pin_15);
  34. }
  35. void HC595_SCK_Reset(void)
  36. {
  37.         GPIO_ResetBits(GPIOA,GPIO_Pin_15);
  38. }
  39. void HC595_RCK_Set(void)
  40. {
  41.         GPIO_SetBits(GPIOA,GPIO_Pin_12);
  42. }

  43. void HC595_RCK_Reset(void)
  44. {
  45.         GPIO_ResetBits(GPIOA,GPIO_Pin_12);
  46. }
  47. void HC595_SER_Set(void)
  48. {
  49.         GPIO_SetBits(GPIOB,GPIO_Pin_11);
  50. }
  51. void HC595_SER_Reset(void)
  52. {
  53.         GPIO_ResetBits(GPIOB,GPIO_Pin_11);
  54. }

  55. void HC595_WriteByte(HC595_DataBytes_Typedef *HC595_Data)
  56. {
  57.         uint8_t IO_Set;
  58.         IO_Set=HC595_Data->Bytes;
  59.         int8_t i=8;
  60.         for(i=7;i>=0;i--)
  61.         {
  62.                 HC595_SCK_Reset();
  63.                 if(((IO_Set>>i)&0x01)==1)
  64.                 {
  65.                         HC595_SER_Set();
  66.                 }
  67.                 else
  68.                 {
  69.                         HC595_SER_Reset();
  70.                 }
  71.                 HC595_SCK_Set();
  72.         }
  73.         HC595_RCK_Reset();
  74.         HC595_RCK_Set();
  75. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-8-20
在线时间
19 小时
 楼主| 发表于 2021-3-17 20:49:38 | 显示全部楼层
我是可以驱动 1 到8  但是就是无法控制器其中一个时候不影响其他IO的电平。这个指针类型我看不懂
回复 支持 反对

使用道具 举报

1

主题

83

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3546
金钱
3546
注册时间
2017-7-10
在线时间
389 小时
发表于 2021-3-18 10:18:14 | 显示全部楼层
也可以用定义一个静态变量记住当成的状态的方法,大致参考

static u8 LEDSTATUS;
void LED595_ON(u8 LEDNUM)
{ u8 i, LEDDATA;
       
        LEDDATA=LEDSTATUS|LEDNUM;
        LEDSTATUS=LEDDATA;
        for(i=0;i<8;i++)
        {
                if( 0x01 == ( LEDDATA & 0x01 ))
                {
                        LED_SER=LED595ON;               
                }
                else
                {
                        LED_SER=LED595OFF;               
                }
                LED_595Shift();       
                LEDDATA >>= 1;                               
        }
       
        LED_595Show();       
}

void LED595_OFF(u8 LEDNUM)
{ u8 i,LEDDATA;
       
        LEDDATA=(~LEDSTATUS) | (LEDNUM);
        LEDDATA =~LEDDATA;
        LEDSTATUS=LEDDATA;
       
        for(i=0;i<8;i++)
        {
                if( 0x01 == ( LEDDATA & 0x01 ))
                {
                        LED_SER=LED595ON;               
                }
                else
                {
                        LED_SER=LED595OFF;               
                }
    LED_595Shift();       
                LEDDATA >>= 1;                               
        }
       
        LED_595Show();       

}       
回复 支持 反对

使用道具 举报

4

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2019-5-31
在线时间
170 小时
发表于 2021-3-20 16:18:14 | 显示全部楼层
把595的输出使能脚用上就OK了:输出失能=》所有数据移位=》锁存数据=》输出使能。
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-8-20
在线时间
19 小时
 楼主| 发表于 2021-3-28 16:29:06 | 显示全部楼层
我当时想的就是与门和或门对比,这样就是可以实现。目前已经是在大部门,等我完整写完在发上来。谢谢  xyzhu 我还是菜鸟在学习。自己做一个电瓶车充电系统。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 07:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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