找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3045|回复: 0
收起左侧

TM1640驱动程序及控制LED累加流水 源程序

[复制链接]
ID:885807 发表于 2021-8-20 15:44 | 显示全部楼层 |阅读模式
此程序为基于TM1640 驱动LED灯进行累加流水

单片机源程序如下:
  1. #include "ucos_ii.h"
  2. #include "driver_i2c1640.h"
  3. #include "driver_sys.h"
  4. #include "sys_time.h"
  5. //位选地址
  6. #define   DIG1      0xc0
  7. #define   DIG2      0xc1
  8. #define   DIG3      0xc2
  9. #define   DIG4      0xc3
  10. #define   DIG5      0xc4
  11. #define   DIG6      0xc5
  12. #define   DIG7      0xc6
  13. #define   DIG8      0xc7
  14. #define   DIG9      0xc8
  15. #define   DIG10     0xc9
  16. #define   DIG11     0xca
  17. #define   DIG12     0xcb
  18. #define   DIG13     0xcc
  19. #define   DIG14     0xcd
  20. #define   DIG15     0xce
  21. #define   DIG16     0xcf
  22. //显示亮度级别
  23. #define   LEVEL_OFF   0x80
  24. #define   LEVEL_1     0x88
  25. #define   LEVEL_2     0x89
  26. #define   LEVEL_3     0x8a
  27. #define   LEVEL_4     0x8b
  28. #define   LEVEL_5     0x8c
  29. #define   LEVEL_6     0x8d
  30. #define   LEVEL_7     0x8e
  31. #define   LEVEL_8     0x8f
  32. #define DATA_CMD_ADDR_INC      0x40        //数据命令设置 地址自动加1
  33. #define DATA_CMD_ADDR_FIXED    0x44        //固定地址
  34. #define     addr_TM1640   (0xc0+0x01)
  35. #define     DSPTM1640_DIS     0   
  36. #define     DSPTM1640_ENB     1  
  37. #define TM1640_DELAY  delay_us(2)
  38. /***************************TM1640显示缓冲区*********************************/
  39. unsigned char led_buffer[48]={0};      //8位数字缓冲区 //18个灯缓冲区
  40. /******************************************************************************
  41. * Function Name --> IIC_GPIO_Init
  42. * Description   --> GPIO初始化
  43. * Input         --> none
  44. * Output        --> none
  45. * Reaturn       --> none
  46. ******************************************************************************/
  47. void IIC_1640_GPIO_Init(void)
  48. {
  49.     GPIO_InitTypeDef  GPIO_InitStructure;
  50.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

  51.                 GPIO_InitStructure.GPIO_Pin = IIC_1642_SCL_PIN|IIC_1642_SDA_PIN;
  52.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  53.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  54.                 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  55.                 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
  56.                 GPIO_Init(IIC_1642_SCL_PORT, &GPIO_InitStructure);
  57.                 IIC_Init_1640LC();
  58. }

  59. //IIC初始化
  60. void IIC_Init_1640LC(void)
  61. {   
  62.     IIC_1642_SDA_H;
  63.     IIC_1642_SCL_H;
  64.        
  65.           IIC_Start_1640LC();
  66.     IIC_Send_Byte_1640LC(DATA_CMD_ADDR_INC);//设置地址自动+1模式
  67.     IIC_Stop_1640LC();

  68.                 IIC_Start_1640LC();
  69.                 IIC_Send_Byte_1640LC(LEVEL_8);//显示亮度
  70.                 IIC_Stop_1640LC();
  71.                 led_clr();
  72. }
  73. //产生IIC起始信号
  74. void IIC_Start_1640LC(void)
  75. {
  76.         IIC_1642_SCL_H;
  77.         TM1640_DELAY;
  78.         IIC_1642_SDA_H;       
  79.         TM1640_DELAY;       
  80.         IIC_1642_SDA_L;//START:when CLK is high,DATA change form high to low
  81.         TM1640_DELAY;
  82. }          
  83. //产生IIC停止信号
  84. void IIC_Stop_1640LC(void)
  85. {
  86.         IIC_1642_SCL_L;
  87.         TM1640_DELAY;
  88.         IIC_1642_SDA_L;//STOP:when CLK is high DATA change form low to high
  89.         TM1640_DELAY;
  90.         IIC_1642_SCL_H;
  91.         TM1640_DELAY;       
  92.         IIC_1642_SDA_H;//发送I2C总线结束信号
  93.         TM1640_DELAY;                                                                  
  94. }
  95. void IIC_Send_Byte_1640LC(u8 txd)
  96. {                        
  97.     u8 t;   
  98.     for(t=0;t<8;t++)
  99.     {      
  100.                         IIC_1642_SCL_L;//拉低时钟开始数据传输
  101.                         TM1640_DELAY;
  102.                         if(txd&0x01)       
  103.                         {
  104.                                 IIC_1642_SDA_H;
  105.                                 TM1640_DELAY;  //对TEA5767这三个延时都是必须的
  106.                         }       
  107.                         else                               
  108.                         {
  109.                                 IIC_1642_SDA_L;
  110.                                 TM1640_DELAY;  //对TEA5767这三个延时都是必须的
  111.                         }
  112.                 IIC_1642_SCL_H;
  113.                 txd = txd>>1;
  114.                 TM1640_DELAY;  //对TEA5767这三个延时都是必须的                       
  115.     }         
  116. }                                                      
  117. /*将TM1640显示缓冲区写入到芯片中*/
  118. /*可能需要在语句间增加必要的延时*/
  119. /*如果128个点全部用到,需要修改变量I的值*/
  120. void TM1640_display(uint8_t start_address,uint8_t data)
  121. {
  122.                 uint8_t i;
  123.                 IIC_Start_1640LC();
  124.     IIC_Send_Byte_1640LC(DATA_CMD_ADDR_FIXED);    //设置起始地址
  125.     IIC_Stop_1640LC();
  126.     IIC_Start_1640LC();
  127.                 IIC_Send_Byte_1640LC(start_address);    //设置起始地址
  128.                 IIC_Send_Byte_1640LC(data);
  129.     IIC_Stop_1640LC();  
  130.                 IIC_Start_1640LC();
  131.     IIC_Send_Byte_1640LC(LEVEL_8);    //设置起始地址
  132.     IIC_Stop_1640LC();                
  133. }
  134. void deal_Disp()
  135. {
  136.   u8 i,j;
  137.   u16 led_data=0xE0;
  138.         for(j=0;j<6;j++)
  139.         {               
  140.                 led_data |= (1<<j);
  141.                 for(i=0;i<5;i++)
  142.                 {
  143.                                         //最后、显示
  144.                         TM1640_display(DIG1+i,led_data);
  145.                         OSTimeDlyHMSM(0, 0, 0, 100);               
  146.                 }
  147.         }
  148.         led_clr();

  149. }
  150. void led_clr()
  151. {
  152.         uint8_t i;
  153.         u16 led_data=0;
  154.         for(i=0;i<16;i++)
  155.         {
  156.                         TM1640_display(DIG1+i,led_data);   
  157.         }
  158. }

  159. void led_green_full()
  160. {
  161.          uint8_t i;
  162.          u16 led_data=0xFF;
  163.                 u16 red_data = 0x00;
  164.                  for(i=0;i<5;i++)
  165.                 {
  166.                                 TM1640_display(DIG11+i,led_data);   
  167.                 }
  168.                 for(i=0;i<10;i++)
  169.                 {
  170.                                 TM1640_display(DIG1+i,red_data);   
  171.                 }
  172. }
  173. void led_red_full()
  174. {
  175.          uint8_t i;
  176.                 u16 led_data=0xFF;
  177.                 u16 blue_data = 0x00;

  178.                  for(i=0;i<5;i++)
  179.                 {
  180.                                 TM1640_display(DIG6+i,led_data);   
  181.                 }
  182.                 for(i=0;i<5;i++)
  183.                 {
  184.                                 TM1640_display(DIG1+i,blue_data);   
  185.                 }
  186.                 for(i=0;i<5;i++)
  187.                 {
  188.                                 TM1640_display(DIG11+i,blue_data);   
  189.                 }
  190. }
  191. void led_blue_full()
  192. {
  193.          uint8_t i;
  194.          u16 led_data=0xFF;
  195.          u16 green_data = 0x00;
  196.                  for(i=0;i<5;i++)
  197.                 {
  198.                                 TM1640_display(DIG1+i,led_data);   
  199.                 }
  200.                 for(i=0;i<10;i++)
  201.                 {
  202.                                 TM1640_display(DIG6+i,green_data);   
  203.                 }
  204. }
复制代码

  1. #ifndef _DRIVER_I2C1640_H
  2. #define _DRIVER_I2C1640_H

  3. #include "stdlib.h"       
  4. #include "stm32f2xx.h"

  5. typedef unsigned char         u8;
  6. typedef unsigned short         u16;
  7. typedef unsigned int                 u32;


  8. /*  IIC_SCL时钟端口、引脚定义 */
  9. #define IIC_1642_SCL_PORT                         GPIOF   
  10. #define IIC_1642_SCL_PIN                         (GPIO_Pin_1)
  11. #define IIC_1642_SCL_PORT_RCC                RCC_AHB1Periph_GPIOF
  12. /*  IIC_SDA时钟端口、引脚定义 */
  13. #define IIC_1642_SDA_PORT                         GPIOF  
  14. #define IIC_1642_SDA_PIN                         (GPIO_Pin_0)
  15. #define IIC_1642_SDA_PORT_RCC                RCC_AHB1Periph_GPIOF
  16. /******************************************************************************
  17.                                 位带操作
  18. ******************************************************************************/
  19. #define IIC_1642_SCL_H                                GPIO_SetBits(IIC_1642_SCL_PORT, IIC_1642_SCL_PIN)
  20. #define IIC_1642_SCL_L                                GPIO_ResetBits(IIC_1642_SCL_PORT, IIC_1642_SCL_PIN)
  21. #define IIC_1642_SDA_H                                GPIO_SetBits(IIC_1642_SDA_PORT, IIC_1642_SDA_PIN)
  22. #define IIC_1642_SDA_L                                GPIO_ResetBits(IIC_1642_SDA_PORT, IIC_1642_SDA_PIN)
  23. #define IN_1642_SDA                                        GPIO_ReadInputDataBit(IIC_1642_SDA_PORT, IIC_1642_SDA_PIN)            //IIC读取数据用

  24. //IIC所有操作函数
  25. void IIC_1640_GPIO_Init(void);
  26. void IIC_Init_1640LC(void);                //初始化IIC的IO口                                 
  27. void IIC_Start_1640LC(void);                                //发送IIC开始信号
  28. void IIC_Stop_1640LC(void);                                  //发送IIC停止信号
  29. void IIC_Send_Byte_1640LC(u8 txd);
  30. void IIC_Send_Byte_1640(unsigned char name,unsigned char display);
  31. void deal_Disp();
  32. void led_clr();
  33. void led_green_full();
  34. void led_red_full();
  35. void led_blue_full();

  36. #endif

复制代码


51hei.png


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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