lugf 发表于 2018-9-28 10:12:13

595驱动

哪位大神能详细的介绍一下,单片机怎么控制HC595,发送数据的过程是怎么样的。 怎么开始,怎么结束。 多谢了

Johnson Cao 发表于 2018-9-28 11:05:14

void Send595Byte(BYTE byte)
{
int i = 0;
for (i = 0; i < 8; i++)
{         
    GpioLow(SCK_GPIO);
    if (byte & (1 << (7 - i)))
      GpioHigh(MOSI_GPIO);
    else
      GpioLow(MOSI_GPIO);
    GpioHigh(SCK_GPIO);
}      
}

Johnson Cao 发表于 2018-9-28 11:05:55

        GpioLow(CS_GPIO);
        if (val < MAX_VALUE)
                Send595Byte(~(Disp_Const | ((dig == g_iDotPos) ? DOT_MASK : 0)));
        else
                Send595Byte(0xFF);
        Send595Byte(1 << dig | ((g_bLed != 0 ? 1 : 0) << 4));
        //PB_ODR |= 0x10;
        GpioHigh(CS_GPIO);

发表于 2018-9-28 11:07:11

类似SPI的通讯方式,先发送1bit,再发送一个SCLK的波形。如下图所示:

随便找了一段代码,大概的通讯流程如下,SCK和SDI需要设置为对应的IO口输出高低状态:

void TP595WriteByte(uint8_t data)
{
        uint8 i;

        TP595_SCK_CLR();
       
        for(i=0;i<8;i++)        //msb (信号上升沿有效)
        {       
                if(data&0x80)
                {
                        TP595_SDI_SET();
                }
                else
                {
                        TP595_SDI_CLR();
                }
                __delay__();
               
                TP595_SCK_SET();
                __delay__();
                TP595_SCK_CLR();

                data = data << 1;       
        }
       
        __delay__();
        TP595_RCK_SET();
        __delay__();
        TP595_RCK_CLR();
        __delay__();
}

lugf 发表于 2018-9-28 11:25:31

多谢各位兄弟的回复,太感谢了

toofree 发表于 2018-9-28 11:58:31

本帖最后由 toofree 于 2018-9-28 11:59 编辑

/* USER CODE BEGIN 0 */

#define SHCP_H               HAL_GPIO_WritePin(SHCP_GPIO_Port,SHCP_Pin,GPIO_PIN_SET)
#define SHCP_L               HAL_GPIO_WritePin(SHCP_GPIO_Port,SHCP_Pin,GPIO_PIN_RESET)

#define DS_H                         HAL_GPIO_WritePin(DS_GPIO_Port,DS_Pin,GPIO_PIN_SET)
#define DS_L                         HAL_GPIO_WritePin(DS_GPIO_Port,DS_Pin,GPIO_PIN_RESET)

#define STCP_H               HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_SET)
#define STCP_L               HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_RESET)

#define MRn_H               HAL_GPIO_WritePin(MRn_GPIO_Port,MRn_Pin,GPIO_PIN_SET)
#define MRn_L               HAL_GPIO_WritePin(MRn_GPIO_Port,MRn_Pin,GPIO_PIN_RESET)

#define OEn_H               HAL_GPIO_WritePin(OEn_GPIO_Port,OEn_Pin,GPIO_PIN_SET)
#define OEn_L               HAL_GPIO_WritePin(OEn_GPIO_Port,OEn_Pin,GPIO_PIN_RESET)

void hc595(uint8_t * tab, uint8_t BytesN)
{
      uint8_t *p = tab;
      int32_t i,j;
      
      MRn_H;
      OEn_L;
      
      SHCP_L;
      DS_L;
      STCP_L;
      HAL_Delay(1);
      
      for (i=0;i<BytesN;i++)
      {
                for (j=0;j<8;j++)
                {
                        if((*p) & (1<<(7-j)))
                              DS_H;
                        else
                              DS_L;
                        HAL_Delay(1);
                        SHCP_H;
                        
                        HAL_Delay(1);
                        SHCP_L;
                }
                p++;
      }
               
      HAL_Delay(1);
      STCP_H;
      HAL_Delay(1);
      SHCP_L;
      DS_L;
      STCP_L;
}
/* USER CODE END 0 */

/**
* @briefThe application entry point.
*
* @retval None
*/
int main(void)
{
/* USER CODE BEGIN 1 */
      uint8_t disp[] = {0x80,0xaa,0x55,0x01};
      
/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
                hc595(disp,sizeof(disp));
                HAL_Delay(1000);
}
/* USER CODE END 3 */

}
给你现敲了一段代码。
发送的数据是 uint8_t disp[] = {0x80,0xaa,0x55,0x01}; 4个字节,代表有4个HC595串联。


STM32CubeMX完整工程:




lugf 发表于 2018-9-28 12:16:41

多谢给位兄弟了

anny 发表于 2018-9-28 14:28:05

STM32CubeMX配置STM32F030F4P6硬件SPI驱动串行数码管
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=615683&fromuid=2075309
(出处: 意法半导体STM32/STM8技术社区)

wwwheihei 发表于 2018-9-28 16:35:42

anny 发表于 2018-9-28 14:28
STM32CubeMX配置STM32F030F4P6硬件SPI驱动串行数码管
https://www.stmcu.org.cn/module/forum/forum.php?mod ...
标准库硬件spi驱动595搞过吗

anny 发表于 2018-9-29 08:52:45

wwwheihei 发表于 2018-9-28 16:35
标准库硬件spi驱动595搞过吗

HAL库,你用标准库也可以
页: [1]
查看完整版本: 595驱动