你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

595驱动

[复制链接]
lugf 提问时间:2018-9-28 10:12 /
哪位大神能详细的介绍一下,单片机怎么控制HC595,发送数据的过程是怎么样的。 怎么开始,怎么结束。 多谢了
收藏 1 评论9 发布时间:2018-9-28 10:12

举报

9个回答
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);
  }      
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

Johnson Cao 回答时间:2018-9-28 11:05:55
        GpioLow(CS_GPIO);
        if (val < MAX_VALUE)
                Send595Byte(~(Disp_Const[val] | ((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的波形。如下图所示:
微信截图_20180928110457.png
随便找了一段代码,大概的通讯流程如下,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__();
}

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

lugf 回答时间:2018-9-28 11:25:31
多谢各位兄弟的回复,太感谢了
七哥 回答时间:2018-9-28 11:58:31
本帖最后由 toofree 于 2018-9-28 11:59 编辑
  1. /* USER CODE BEGIN 0 */

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

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

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

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

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

  12. void hc595(uint8_t * tab, uint8_t BytesN)
  13. {
  14.         uint8_t *p = tab;
  15.         int32_t i,j;
  16.         
  17.         MRn_H;
  18.         OEn_L;
  19.         
  20.         SHCP_L;
  21.         DS_L;
  22.         STCP_L;
  23.         HAL_Delay(1);
  24.         
  25.         for (i=0;i<BytesN;i++)
  26.         {
  27.                 for (j=0;j<8;j++)
  28.                 {
  29.                         if((*p) & (1<<(7-j)))
  30.                                 DS_H;
  31.                         else
  32.                                 DS_L;
  33.                         HAL_Delay(1);
  34.                         SHCP_H;
  35.                         
  36.                         HAL_Delay(1);
  37.                         SHCP_L;
  38.                 }
  39.                 p++;
  40.         }
  41.                
  42.         HAL_Delay(1);
  43.         STCP_H;
  44.         HAL_Delay(1);
  45.         SHCP_L;
  46.         DS_L;
  47.         STCP_L;
  48. }
  49. /* USER CODE END 0 */

  50. /**
  51.   * @brief  The application entry point.
  52.   *
  53.   * @retval None
  54.   */
  55. int main(void)
  56. {
  57.   /* USER CODE BEGIN 1 */
  58.         uint8_t disp[] = {0x80,0xaa,0x55,0x01};
  59.         
  60.   /* USER CODE END 1 */

  61.   /* MCU Configuration----------------------------------------------------------*/

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

  64.   /* USER CODE BEGIN Init */

  65.   /* USER CODE END Init */

  66.   /* Configure the system clock */
  67.   SystemClock_Config();

  68.   /* USER CODE BEGIN SysInit */

  69.   /* USER CODE END SysInit */

  70.   /* Initialize all configured peripherals */
  71.   MX_GPIO_Init();
  72.   /* USER CODE BEGIN 2 */

  73.   /* USER CODE END 2 */

  74.   /* Infinite loop */
  75.   /* USER CODE BEGIN WHILE */
  76.   while (1)
  77.   {

  78.   /* USER CODE END WHILE */

  79.   /* USER CODE BEGIN 3 */
  80.                 hc595(disp,sizeof(disp));
  81.                 HAL_Delay(1000);
  82.   }
  83.   /* USER CODE END 3 */

  84. }
复制代码

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

STM32CubeMX完整工程:
TEST_F103C8T6_HC595.rar (2.9 MB, 下载次数: 25)

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

lugf 回答时间:2018-9-28 12:16:41
多谢给位兄弟了
anny 回答时间:2018-9-28 14:28:05
STM32CubeMX配置STM32F030F4P6硬件SPI驱动串行数码管
https://www.stmcu.org.cn/module/ ... amp;fromuid=2075309
(出处: 意法半导体STM32/STM8技术社区)

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

ssssss 回答时间: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库,你用标准库也可以

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版