[其他] 单片机 MM32 HAL 74hc595 例子 代码

[复制链接]
770|5
 楼主| kmnqhaha 发表于 2023-6-28 15:11 | 显示全部楼层 |阅读模式
这是74HC595芯片,如图1,它是一颗单片机IO口扩展芯片,使用它,我们可以很容易的将单片机的3个输出引脚扩展为8个。
79136649bdcfa8dd99.png
这颗芯片通过串行数据输入,数据输出的方式为1路串行或8路并行。引脚有三种输出状态:高电平、低电平和高阻态。它的引脚驱动能力为35mA,
 楼主| kmnqhaha 发表于 2023-6-28 15:11 | 显示全部楼层
二、引脚图

83900649bdd1c54039.png

14脚:DS(SER),串行数据输入引脚

13脚:OE, 输出使能控制脚,它是低电才使能输出,所以接GND

12脚:RCK,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器。

11脚:SCK,移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入)。

10脚:MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接 高电平即可。

9 脚 :串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联。

Qx:并行输出引脚
 楼主| kmnqhaha 发表于 2023-6-28 15:12 | 显示全部楼层
 楼主| kmnqhaha 发表于 2023-6-28 15:13 | 显示全部楼层
具体使用的步骤:
第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。

方法:送位数据到_595。

第二步:目的:将位数据逐位移入74HC595,即数据串入

方法:SCK_595产生一上升沿,将PSI_595上的数据移入74HC595中.从低到高

第三步:目的:并行输出数据。即数据并出

方法:P1.1产生一上升沿,将由SI_595上已移入数据寄存器中的数据

送入到输出锁存器。
 楼主| kmnqhaha 发表于 2023-6-28 15:13 | 显示全部楼层
说明: 从上可分析:从SCK_595产生一上升沿(移入数据)和RCK_595产生一上升沿(输出数据)是二个独立过程,实际应用时互不干扰。即可输出数据的 同时移入数据。
  1. #include "74hc595.h"

  2. /******************
  3. 功  能:定义HC595的功能引脚
  4. 备  注:变更引脚,由MX配置完成
  5. *******************/
  6. const T_HC595_PIN hc595 =
  7. {
  8.     .sck_port   = HC595_SCK_GPIO_Port,
  9.     .sck_pin    = HC595_SCK_Pin,      //数据输入时钟线

  10.     .data_port  = HC595_SI_GPIO_Port,
  11.     .data_pin   = HC595_SI_Pin,       //数据线

  12.     .rck_port   = HC595_RCK_GPIO_Port,
  13.     .rck_pin    = HC595_RCK_Pin,      //输出存储器锁存时钟线

  14.     .en_port    = HC595_EN_GPIO_Port,
  15.     .en_pin     = HC595_EN_Pin        //芯片使能
  16. };

  17. /******************
  18. 函数名:hc595Delay
  19. 功  能:实现us级延迟
  20. 形  参:cnt--us值
  21. 返回值:无
  22. 备  注:
  23. *******************/
  24. void hc595Delay(uint16_t cnt)
  25. {
  26.     while (--cnt);
  27. }

  28. /******************************
  29. 函数名:hc595Init
  30. 功  能:初始化hc595的使能脚(EN),默认工作状态
  31. 形  参:pin--hc595引脚结构体
  32. 返回值:
  33. 备  注:0--器件屏蔽  1--器件工作
  34. *******************************/
  35. void hc595Init(const T_HC595_PIN *pin)
  36. {
  37.     GPIO_InitTypeDef GPIO_InitStructure;
  38.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);

  39.     GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_1 | GPIO_Pin_2;
  40.     GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
  41.     GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;
  42.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  43.     GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_4 | GPIO_Pin_8;
  44.     GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
  45.     GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;
  46.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  47.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  48. }

  49. /******************************
  50. 函数名:hc595DeInit
  51. 功  能:初始化hc595的使能脚(EN),默认休息状态
  52. 形  参:pin--hc595引脚结构体
  53. 返回值:
  54. 备  注:0--器件屏蔽  1--器件工作
  55. *******************************/
  56. void hc595DeInit(const T_HC595_PIN *pin)
  57. {
  58.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);
  59. }






  60. /***************************************下面是对LED的应用*****************************************************/



  61. /*********************************************
  62. 函数名:hc595LedOff
  63. 功  能:关闭全部LED
  64. 形  参:
  65. 返回值:
  66. 备  注:
  67. 作  者:薛建强
  68. 时  间:2019/06/22
  69. **********************************************/
  70. void hc595LedOff(const T_HC595_PIN *pin)
  71. {
  72.     hc595WriteData(pin, 0x00);
  73. }
  74. /*********************************************
  75. 函数名:hc595LedOn
  76. 功  能:开灯全部LED
  77. 形  参:
  78. 返回值:
  79. 备  注:
  80. 作  者:薛建强
  81. 时  间:2019/06/22
  82. **********************************************/
  83. void hc595LedOn(const T_HC595_PIN *pin)
  84. {
  85.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  86.     hc595WriteData(pin, 0xff);
  87. }

  88. /*********************************************
  89. 函数名:hc595WriteData
  90. 功  能:对hc595器件写入1字节,代表8个io口的输出状态
  91. 形  参:pin--hc595引脚结构体  pdata--数据字节
  92. 返回值:
  93. 备  注:
  94. 作  者:薛建强
  95. 时  间:2019/06/22
  96. **********************************************/
  97. void hc595WriteData(const T_HC595_PIN *pin, uint8_t pdata)
  98. {
  99.     uint8_t i = 0;
  100.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  101.     for (i = 0; i < 8; i++)
  102.     {
  103.         if ((pdata << i) & 0x80)
  104.         {
  105.             GPIO_WriteBit(pin->data_port, pin->data_pin, Bit_SET);//HC595_SI=1
  106.         }
  107.         else
  108.         {
  109.             GPIO_WriteBit(pin->data_port, pin->data_pin, Bit_RESET);//HC595_SI=0
  110.         }
  111.         hc595Delay(1);
  112.         GPIO_WriteBit(pin->sck_port, pin->sck_pin, Bit_RESET);//HC595_sck=0
  113.         GPIO_WriteBit(pin->sck_port, pin->sck_pin, Bit_SET);//HC595_sck=1
  114.     }
  115.     hc595Delay(1);
  116.     GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_RESET);//HC595_rck=0
  117.     GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_SET);//HC595_rck=1
  118.     hc595Delay(1);
  119.     GPIO_WriteBit(pin->rck_port, pin->rck_pin, Bit_RESET);//HC595_rck=0
  120. }



  121. /*********************************************
  122. 函数名:LED_AnnularPipelineLamp
  123. 功  能:LED环形流水灯,0->7顺时针  7->0逆时针
  124. 形  参:pin--hc595引脚结构体  ch--通道
  125. 返回值:
  126. 备  注:8个led灯连接到HC595器件
  127. 作  者:薛建强
  128. 时  间:2019/06/22
  129. **********************************************/
  130. void LED_AnnularPipelineLamp(const T_HC595_PIN *pin, uint8_t ch)
  131. {
  132.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  133.     switch (ch)
  134.     {
  135.         case 0:
  136.             hc595WriteData(pin, 0xF8);
  137.             break;
  138.         case 1:
  139.             hc595WriteData(pin, 0xF1);
  140.             break;
  141.         case 2:
  142.             hc595WriteData(pin, 0xE3);
  143.             break;
  144.         case 3:
  145.             hc595WriteData(pin, 0xC7);
  146.             break;
  147.         case 4:
  148.             hc595WriteData(pin, 0x8F);
  149.             break;
  150.         case 5:
  151.             hc595WriteData(pin, 0x1F);
  152.             break;
  153.         case 6:
  154.             hc595WriteData(pin, 0x3E);
  155.             break;
  156.         case 7:
  157.             hc595WriteData(pin, 0x7C);
  158.             break;
  159.         default:
  160.             break;
  161.     }
  162. }

  163. /*********************************************
  164. 函数名:LED_AnnularPipelineLamp_3
  165. 功  能:LED环形流水灯,0->7顺时针  7->0逆时针  3个灯流水
  166. 形  参:pin--hc595引脚结构体  ch--通道
  167. 返回值:
  168. 备  注:8个led灯连接到HC595器件
  169. 作  者:薛建强
  170. 时  间:2019/06/22
  171. **********************************************/
  172. void LED_AnnularPipelineLamp_3(const T_HC595_PIN *pin, uint8_t ch)
  173. {
  174.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  175.     switch (ch)
  176.     {
  177. //        case 0:
  178. //            hc595WriteData(pin, 0x07);
  179. //            break;
  180. //        case 1:
  181. //            hc595WriteData(pin, 0x0E);
  182. //            break;
  183. //        case 2:
  184. //            hc595WriteData(pin, 0x1C);
  185. //            break;
  186. //        case 3:
  187. //            hc595WriteData(pin, 0x38);
  188. //            break;
  189. //        case 4:
  190. //            hc595WriteData(pin, 0x70);
  191. //            break;
  192. //        case 5:
  193. //            hc595WriteData(pin, 0xE0);
  194. //            break;
  195. //        case 6:
  196. //            hc595WriteData(pin, 0xC1);
  197. //            break;
  198. //        case 7:
  199. //            hc595WriteData(pin, 0x83);
  200. //            break;
  201.         case 0:
  202.             hc595WriteData(pin, 0x03);
  203.             break;
  204.         case 1:
  205.             hc595WriteData(pin, 0x06);
  206.             break;
  207.         case 2:
  208.             hc595WriteData(pin, 0x0C);
  209.             break;
  210.         case 3:
  211.             hc595WriteData(pin, 0x18);
  212.             break;
  213.         case 4:
  214.             hc595WriteData(pin, 0x30);
  215.             break;
  216.         case 5:
  217.             hc595WriteData(pin, 0x60);
  218.             break;
  219.         case 6:
  220.             hc595WriteData(pin, 0x81);
  221.             break;
  222. //        case 7:
  223. //            hc595WriteData(pin, 0x03);
  224. //            break;
  225.         default:
  226.             break;
  227.     }
  228. }

  229. /*********************************************
  230. 函数名:LED_TwowayDescent
  231. 功  能:双路流水灯
  232. 形  参:pin--hc595引脚结构体  ch--通道
  233. 返回值:
  234. 备  注:
  235. 作  者:薛建强
  236. 时  间:2019/06/22
  237. **********************************************/
  238. void LED_TwowayDescent(const T_HC595_PIN *pin, uint8_t ch)
  239. {
  240.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  241.     switch (ch)
  242.     {
  243.         case 0:
  244.             hc595WriteData(pin, 0x01);
  245.             break;
  246.         case 1:
  247.             hc595WriteData(pin, 0x82);
  248.             break;
  249.         case 2:
  250.             hc595WriteData(pin, 0x44);
  251.             break;
  252.         case 3:
  253.             hc595WriteData(pin, 0x28);
  254.             break;
  255.         case 4:
  256.             hc595WriteData(pin, 0x10);
  257.             break;
  258.         default:
  259.             break;
  260.     }
  261. }

  262. /*********************************************
  263. 函数名:LED_CyclicMode
  264. 功  能:DV循环模式下的效果
  265. 形  参:pin--hc595引脚结构体  ch--通道
  266. 返回值:
  267. 备  注:
  268. 作  者:薛建强
  269. 时  间:2019/06/22
  270. **********************************************/
  271. void LED_CyclicMode(const T_HC595_PIN *pin, const uint8_t ch)
  272. {
  273.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  274.     switch (ch)
  275.     {
  276.         //  第一圈
  277.         case  0:
  278.             hc595WriteData(pin, 0xFE);
  279.             break;
  280.         case  1:
  281.             hc595WriteData(pin, 0xFC);
  282.             break;
  283.         case  2:
  284.             hc595WriteData(pin, 0xF8);
  285.             break;
  286.         case  3:
  287.             hc595WriteData(pin, 0xF0);
  288.             break;
  289.         case  4:
  290.             hc595WriteData(pin, 0xE0);
  291.             break;
  292.         case  5:
  293.             hc595WriteData(pin, 0xC0);
  294.             break;
  295.         case  6:
  296.             hc595WriteData(pin, 0x80);
  297.             break;
  298.         case  7:
  299.             hc595WriteData(pin, 0x00);
  300.             break;
  301.         //  第二圈
  302.         case  8:
  303.             hc595WriteData(pin, 0x01);
  304.             break;
  305.         case  9:
  306.             hc595WriteData(pin, 0x03);
  307.             break;
  308.         case 10:
  309.             hc595WriteData(pin, 0x07);
  310.             break;
  311.         case 11:
  312.             hc595WriteData(pin, 0x0F);
  313.             break;
  314.         case 12:
  315.             hc595WriteData(pin, 0x1F);
  316.             break;
  317.         case 13:
  318.             hc595WriteData(pin, 0x3F);
  319.             break;
  320.         case 14:
  321.             hc595WriteData(pin, 0x7F);
  322.             break;
  323.         case 15:
  324.             hc595WriteData(pin, 0xFF);
  325.             break;
  326.         default:
  327.             break;
  328.     }
  329. }


  330. /*********************************************
  331. 函数名:Batter_EleShow
  332. 功  能:电量显示
  333. 形  参:pin--hc595引脚结构体  Batter--电量的百分比
  334. 返回值:
  335. 备  注:
  336. 作  者:薛建强
  337. 时  间:2019/06/22
  338. **********************************************/
  339. uint8_t  LedFlash_Tmr = 0;
  340. void Batter_EleShow(const T_HC595_PIN *pin, const uint8_t Batter)
  341. {
  342.     GPIO_WriteBit(pin->en_port, pin->en_pin, Bit_SET);//打开使能脚
  343.     if (Batter < 12)                //   1格
  344.     {
  345.         if (Batter <= 10)            //   低电量提示,蜂鸣器开启
  346.         {
  347.             if (LedFlash_Tmr < 250 &&  ++LedFlash_Tmr < 2) //   指示灯闪烁
  348.             {
  349.                 hc595WriteData(pin, 0x01);
  350.             }
  351.             else if (LedFlash_Tmr >= 2 && LedFlash_Tmr < 3)
  352.             {
  353.                 hc595WriteData(pin, 0x00);
  354.             }
  355.             else
  356.             {
  357.                 LedFlash_Tmr = 0;
  358.             }
  359.         }
  360.         else // 5% ~ 12% 显示最后一格电量
  361.         {
  362.             LedFlash_Tmr = 0;
  363.             hc595WriteData(pin, 0x01);
  364.         }
  365.     }
  366.     else if (Batter >= 12 && Batter < 24) // 2格
  367.     {
  368.         hc595WriteData(pin, 0x03);
  369.     }
  370.     else if (Batter >= 24 && Batter < 36) // 3格
  371.     {
  372.         hc595WriteData(pin, 0x07);
  373.     }
  374.     else if (Batter >= 36 && Batter < 48) // 4格
  375.     {
  376.         hc595WriteData(pin, 0x0F);
  377.     }
  378.     else if (Batter >= 48 && Batter < 60) // 5格
  379.     {
  380.         hc595WriteData(pin, 0x1F);
  381.     }
  382.     else if (Batter >= 60 && Batter < 72) // 6格
  383.     {
  384.         hc595WriteData(pin, 0x3F);
  385.     }
  386.     else if (Batter >= 72 && Batter < 84) // 7格
  387.     {
  388.         hc595WriteData(pin, 0x7F);
  389.     }
  390.     else                                 // 8格
  391.     {
  392.         hc595WriteData(pin, 0xFF);
  393.     }
  394. }


  395. /*********************************************
  396. 函数名:Batter_ChargeShow
  397. 功  能:电池充电显示
  398. 形  参:pin--hc595引脚结构体  Batter--电量的百分比
  399. 返回值:
  400. 备  注:
  401. 作  者:薛建强
  402. 时  间:2019/06/22
  403. **********************************************/
  404. #define ChargeValue 3    // 充电时间值
  405. uint8_t  time = 0;      // 充电指示电路
  406. void Batter_ChargeShow(const T_HC595_PIN *pin, const uint8_t Batter)
  407. {
  408.     if (Batter < 12)                             //    1格
  409.     {
  410.         if (time < 250 && ++time < ChargeValue)
  411.         {
  412.             hc595WriteData(pin, 0x00);
  413.         }
  414.         else if (time >= ChargeValue && time < 2 * ChargeValue)
  415.         {
  416.             hc595WriteData(pin, 0x01);
  417.         }
  418.         else
  419.         {
  420.             time = 0;
  421.         }
  422.     }
  423.     else if (Batter >= 12 && Batter < 24)       //    2格
  424.     {
  425.         if (time < 250 && ++time <= ChargeValue)
  426.         {
  427.             hc595WriteData(pin, 0x01);
  428.         }
  429.         else if (time > ChargeValue && time < 2 * ChargeValue)
  430.         {
  431.             hc595WriteData(pin, 0x03);
  432.         }
  433.         else
  434.         {
  435.             time = 0;
  436.         }
  437.     }
  438.     else if (Batter >= 24 && Batter < 36)     //    3格
  439.     {
  440.         if (time < 250 && ++time <= ChargeValue)
  441.         {
  442.             hc595WriteData(pin, 0x03);
  443.         }
  444.         else if (time > ChargeValue && time < 2 * ChargeValue)
  445.         {
  446.             hc595WriteData(pin, 0x07);
  447.         }
  448.         else
  449.         {
  450.             time = 0;
  451.         }
  452.     }
  453.     else if (Batter >= 36 && Batter < 48)                        //    4格
  454.     {
  455.         if (time < 250 && ++time <= ChargeValue)
  456.         {
  457.             hc595WriteData(pin, 0x07);
  458.         }
  459.         else if (time > ChargeValue && time < 2 * ChargeValue)
  460.         {
  461.             hc595WriteData(pin, 0x0F);
  462.         }
  463.         else
  464.         {
  465.             time = 0;
  466.         }
  467.     }
  468.     else if (Batter >= 48 && Batter < 60)                         //    5格
  469.     {
  470.         if (time < 250 && ++time <= ChargeValue)
  471.         {
  472.             hc595WriteData(pin, 0x0F);
  473.         }
  474.         else if (time > ChargeValue && time < 2 * ChargeValue)
  475.         {
  476.             hc595WriteData(pin, 0x1F);
  477.         }
  478.         else
  479.         {
  480.             time = 0;
  481.         }
  482.     }
  483.     else if (Batter >= 60 && Batter < 72)                         //    6格
  484.     {
  485.         if (time < 250 && ++time <= ChargeValue)
  486.         {
  487.             hc595WriteData(pin, 0x1F);
  488.         }
  489.         else if (time > ChargeValue && time < 2 * ChargeValue)
  490.         {
  491.             hc595WriteData(pin, 0x3F);
  492.         }
  493.         else
  494.         {
  495.             time = 0;
  496.         }
  497.     }
  498.     else if (Batter >= 72 && Batter < 95)                       //    7格
  499.     {
  500.         if (time < 250 &&  ++time < ChargeValue)
  501.         {
  502.             hc595WriteData(pin, 0xFF);
  503.         }
  504.         else if (time >= ChargeValue && time < 2 * ChargeValue)
  505.         {
  506.             hc595WriteData(pin, 0x7F);
  507.         }
  508.         else
  509.         {
  510.             time = 0;
  511.         }
  512.     }
  513.     else                                                       //     8格
  514.     {
  515.         time = 0;
  516.         hc595WriteData(pin, 0xFF);
  517.     }
  518. }



 楼主| kmnqhaha 发表于 2023-6-28 15:14 | 显示全部楼层
  1. /* Define to prevent recursive inclusion -------------------------------------*/
  2. #ifndef __74HC595_HEADER__
  3. #define __74HC595_HEADER__


  4. /* USER CODE BEGIN Includes */
  5. #include "main.h"

  6. /* USER CODE END Includes */

  7. #define HC595_SCK_Pin       GPIO_Pin_1
  8. #define HC595_SCK_GPIO_Port GPIOB
  9. #define HC595_RCK_Pin       GPIO_Pin_2
  10. #define HC595_RCK_GPIO_Port GPIOB
  11. #define HC595_SI_Pin        GPIO_Pin_8
  12. #define HC595_SI_GPIO_Port  GPIOA
  13. #define HC595_EN_Pin        GPIO_Pin_4
  14. #define HC595_EN_GPIO_Port  GPIOA


  15. typedef struct
  16. {
  17.     GPIO_TypeDef* sck_port;
  18.     uint16_t      sck_pin;
  19.     GPIO_TypeDef* data_port;
  20.     uint16_t      data_pin;
  21.     GPIO_TypeDef* rck_port;
  22.     uint16_t      rck_pin;
  23.     GPIO_TypeDef* en_port;
  24.     uint16_t      en_pin;
  25. } T_HC595_PIN;

  26. extern const T_HC595_PIN hc595;

  27. /* Exported functions prototypes ---------------------------------------------*/
  28. void hc595Init(const T_HC595_PIN *pin);
  29. void hc595DeInit(const T_HC595_PIN *pin);
  30. void hc595WriteData(const T_HC595_PIN *pin, uint8_t pdata);


  31. /*流水灯的应用*/
  32. void hc595LedOn(const T_HC595_PIN *pin);
  33. void hc595LedOff(const T_HC595_PIN *pin);
  34. void LED_AnnularPipelineLamp(const T_HC595_PIN *pin,uint8_t ch);
  35. void LED_TwowayDescent(const T_HC595_PIN *pin, uint8_t ch);
  36. void LED_CyclicMode(const T_HC595_PIN *pin, const uint8_t ch);

  37. void Batter_EleShow(const T_HC595_PIN *pin, const uint8_t Batter);
  38. void Batter_ChargeShow(const T_HC595_PIN *pin, const uint8_t Batter);
  39. void LED_AnnularPipelineLamp_3(const T_HC595_PIN *pin, uint8_t ch);


  40. void hc595Delay(uint16_t cnt);
  41. #endif

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

本版积分规则

47

主题

271

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部