分享一个595点灯程序

2019-12-17 21:34发布

两片595级联,可控制16路灯,只用了十路。
灯的状态,有常亮,灭,快闪,慢闪
1、初始化IO
2、设定灯状态
  1.         gIO[LEDALM].status = IO_SLOW;       
  2.         gIO[LED1].status = IO_SLOW;
  3.         gIO[LED2].status = IO_FAST;
  4.         gIO[LED2].status = IO_FAST;
  5.         gIO[LED3].status = IO_FAST;
  6.         gIO[LED4].status = IO_FAST;
  7.         gIO[LED5].status = IO_FAST;               
复制代码
               
3、定时调用
led_display()

  1. #ifndef _595_H
  2. #define _595_H


  3. //#include "stm32f0xx_hal.h"
  4. #include "stm32f10x.h"

  5. #define SLOW_SUM_TIME 30
  6. #define SLOW_ON_TIME  15

  7. #define FAST_SUM_TIME 4
  8. #define FAST_ON_TIME  1



  9. #define IONUM 11

  10. #define LED1MASK                                        (0x0001<<11)
  11. #define LED2MASK                                        (0x0001<<10)
  12. #define LED3MASK                                        (0x0001<<9)                       
  13. #define LED4MASK                                        (0x0001<<8)
  14. #define LED5MASK                                        (0x0001<<15)
  15. #define LED6MASK                                        (0x0001<<14)
  16. #define LED7MASK                                        (0x0001<<13)
  17. #define LED8MASK                                        (0x0001<<12)

  18. #define LEDPOWERMASK                        (0x0001<<0)
  19. #define LEDALMMASK                                (0x0001<<3)

  20. #define BEEPMASK                                        (0x0001<<7)

  21. #define LED1                                        0
  22. #define LED2                                        1
  23. #define LED3                                        2
  24. #define LED4                                        3
  25. #define LED5                                        4
  26. #define LED6                                        5
  27. #define LED7                                        6
  28. #define LED8                                        7

  29. #define LEDPOWER                        8
  30. #define LEDALM                                9
  31. #define BEEP                                  10



  32. typedef enum
  33. {
  34.         IO_OFF = 0,
  35.         IO_ON,                       
  36.         IO_FAST,                //¿ìÉÁ
  37.         IO_SLOW                //ÂýÉÁ
  38. }IO_STUTAS;

  39. typedef struct
  40. {
  41.         const uint16_t        mask;
  42.         IO_STUTAS status;
  43.         uint8_t  onCnt;
  44. }io_t;


  45. #define _595_RCLK_PORT                 GPIOC
  46. #define _595_RCLK_PIN                        GPIO_Pin_10         //´æ´¢¼Ä´æÆ÷ʱÖÓ

  47. #define _595_SRCLK_PORT         GPIOC
  48. #define _595_SRCLK_PIN                GPIO_Pin_11                //ÒÆλ¼Ä´æÆ÷ʱÖÓ

  49. #define _595_SER_PORT                 GPIOA
  50. #define _595_SER_PIN                        GPIO_Pin_11                 //´®ÐÐÊý¾ÝÊäÈë

  51. //#define _595_SER_PORT                 GPIOA
  52. //#define _595_SER_PIN                        GPIO_Pin_0                 //´®ÐÐÊý¾ÝÊäÈë


  53. //#define LED_Write(X) X>0?                 GPIO_WriteBit(LED_PORT,LED_PIN,GPIO_PIN_SET) : GPIO_WriteBit(LED_PORT,LED_PIN,GPIO_PIN_RESET)

  54. #define _595_RCLK_Write(X)          X>0? GPIO_WriteBit(_595_RCLK_PORT,_595_RCLK_PIN,Bit_SET) : GPIO_WriteBit(_595_RCLK_PORT,_595_RCLK_PIN,Bit_RESET)
  55. #define _595_SRCLK_Write(X)   X>0? GPIO_WriteBit(_595_SRCLK_PORT,_595_SRCLK_PIN,Bit_SET) : GPIO_WriteBit(_595_SRCLK_PORT,_595_SRCLK_PIN,Bit_RESET)
  56. #define _595_SER_Write(X)                  X>0? GPIO_WriteBit(_595_SER_PORT,_595_SER_PIN,Bit_SET) : GPIO_WriteBit(_595_SER_PORT,_595_SER_PIN,Bit_RESET)


  57. extern io_t  gIO[IONUM];


  58. void _595_GPIO_Init(void);
  59. void _595_WriteByte(uint8_t byte);
  60. void _595_WriteMultiByte(uint16_t multibyte);

  61. void led_display(void);
  62. void led_runTogle();

  63. void delay(uint16_t t);

  64. #endif
复制代码

  1. #include "595.h"

  2. #define DELAY 10000

  3. io_t  gIO[IONUM] =
  4. {
  5.         {LED1MASK,IO_OFF,0},
  6.         {LED2MASK,IO_OFF,0},
  7.         {LED3MASK,IO_OFF,0},
  8.         {LED4MASK,IO_OFF,0},
  9.         {LED5MASK,IO_OFF,0},
  10.         {LED6MASK,IO_OFF,0},
  11.         {LED7MASK,IO_OFF,0},
  12.         {LED8MASK,IO_OFF,0},
  13.         {LEDPOWERMASK,IO_ON,0},
  14.         {LEDALMMASK,IO_OFF,0},
  15.         {BEEPMASK,IO_OFF,0}       
  16. };


  17. void _595_GPIO_Init()
  18. {
  19.        
  20.         GPIO_InitTypeDef  GPIO_InitStructure;

  21.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //ʹÄÜPC¶Ë¿ÚʱÖÓ
  22.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //ʹÄÜPA¶Ë¿ÚʱÖÓ
  23.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);         //ʹÄÜPA¶Ë¿ÚʱÖÓ
  24.        
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;                                 
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //ÍÆÍìÊä³ö
  27.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿ÚËÙ¶ÈΪ50MHz
  28.         GPIO_Init(GPIOC, &GPIO_InitStructure);                                                          //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯

  29.         GPIO_InitStructure.GPIO_Pin = _595_SER_PIN;                                 
  30.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //ÍÆÍìÊä³ö
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿ÚËÙ¶ÈΪ50MHz
  32.         GPIO_Init(_595_SER_PORT, &GPIO_InitStructure);                         //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯       

  33.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;                                 
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //ÍÆÍìÊä³ö
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO¿ÚËÙ¶ÈΪ50MHz
  36.         GPIO_Init(GPIOE, &GPIO_InitStructure);                                                          //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯       
  37.        
  38.         GPIO_WriteBit(GPIOE,GPIO_Pin_0,Bit_SET);
  39.        
  40.         _595_SER_Write(0);       
  41.         _595_SRCLK_Write(0);
  42.         _595_RCLK_Write(0);                       
  43. }



  44. void _595_WriteByte(uint8_t byte)
  45. {
  46.         uint8_t i;
  47.         for(i=0;i<8;i++)
  48.         {
  49.                 if(byte&0x80)
  50.                         _595_SER_Write(1);
  51.                 else
  52.                         _595_SER_Write(0);
  53.                 _595_SRCLK_Write(0);
  54.                 delay(DELAY);
  55.                 _595_SRCLK_Write(1);               
  56.                 delay(DELAY);
  57.                 byte <<= 1;
  58.         }
  59. }
  60. void _595_WriteMultiByte(uint16_t multibyte)
  61. {
  62.         uint16_t temp = 0;
  63.         temp = multibyte&0x00ff;
  64.         _595_WriteByte(temp);
  65.         temp = (multibyte>>8)&0x00ff;
  66.         _595_WriteByte(temp);
  67.         _595_RCLK_Write(0);
  68.         delay(DELAY);
  69.         _595_RCLK_Write(1);       
  70.         delay(DELAY);               
  71. }

  72. void led_display()
  73. {
  74.         uint8_t i;
  75.         uint16_t iobuff = 0;
  76.        
  77.         for(i = 0 ;i<IONUM;i++)
  78.         {
  79.                 if(gIO[i].status == IO_ON)
  80.                 {
  81.                         iobuff &= (~gIO[i].mask);                               
  82.                 }
  83.                 else if(gIO[i].status == IO_OFF)
  84.                 {
  85.                         iobuff |= gIO[i].mask;                       
  86.                 }
  87.                 else if(gIO[i].status == IO_FAST)
  88.                 {               
  89.                         if(gIO[i].onCnt < FAST_ON_TIME)
  90.                         {
  91.                                 iobuff &= (~gIO[i].mask);                                               
  92.                         }
  93.                         else
  94.                         {
  95.                                 iobuff |= gIO[i].mask;                               
  96.                         }
  97.                         gIO[i].onCnt++;       
  98.                         if(gIO[i].onCnt >= FAST_SUM_TIME)
  99.                                 gIO[i].onCnt = 0;                       
  100.                 }
  101.                 else if(gIO[i].status == IO_SLOW)
  102.                 {                       
  103.                         if(gIO[i].onCnt < SLOW_ON_TIME)
  104.                         {
  105.                                 iobuff &= (~gIO[i].mask);                                                       
  106.                         }
  107.                         else
  108.                         {
  109.                                 iobuff |= gIO[i].mask;                       
  110.                         }
  111.                         gIO[i].onCnt++;       
  112.                         if(gIO[i].onCnt >= SLOW_SUM_TIME)
  113.                                 gIO[i].onCnt = 0;                       
  114.                 }
  115.         }
  116.         _595_WriteMultiByte(iobuff);
  117. }

  118. void led_runTogle()
  119. {
  120.         uint8_t flag = 0;
  121.        
  122.         if(flag == 0)
  123.         {
  124.                 flag = 1        ;       
  125.                 GPIO_WriteBit(GPIOE,GPIO_Pin_0,Bit_RESET);               
  126.         }
  127.         else
  128.         {
  129.                 flag = 0        ;                       
  130.                 GPIO_WriteBit(GPIOE,GPIO_Pin_0,Bit_SET);               
  131.         }
  132. }

  133. void delay(uint16_t t)
  134. {
  135.         for(;t!=0;t--);
  136. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。