找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2900|回复: 2
打印 上一主题 下一主题
收起左侧

STM32F103驱动LED显示控制程序 可驱动多达384点阵LED TM1681

[复制链接]
跳转到指定楼层
楼主
TM1681是一种存储器交换LED显示控制的驱动芯片,可以选择多重的ROW/COM模式(32ROW/8COM和24ROW/16COM),可以用来驱动点阵LED。该芯片提供了软件设置的16 个级别的脉宽调制控制输出,可以调整LED 循环显示的亮度。

单片机源程序如下:
  1. #include "TM1681.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "Buzzer.h"
  5. #include "SysTick.h"
  6. /** Write multiple bits in an 8-bit device register.
  7. * @param slaveAddr I2C slave device address
  8. * @param regAddr Register regAddr to write to
  9. * @param bitStart First bit position to write (0-7)
  10. * @param length Number of bits to write (not more than 8)
  11. * @param data Right-aligned value to write
  12. */
  13. static unsigned char temp;
  14. static unsigned char x=1;
  15. //unsigned char channel_1=1;
  16. unsigned char Enable_1,Enable_2,Enable_3,Enable_4,Enable_5,Enable_6;
  17. extern unsigned char channel;
  18. extern unsigned char NumDis[24],TIME[10],G_1,K1;
  19. extern int16_t cache[6],data[6];
  20. //__IO u32 Time_1;
  21. extern __IO u32 Total_time;
  22. void TM1637_Delay_us(unsigned  int Nus)
  23. {
  24. for(;Nus>0;Nus--)
  25.         {
  26.           __nop();
  27.         }
  28. }

  29. void TM1637_Start(void)
  30. {
  31.         TM1637_DIO_OUT();
  32.   TM1637_CLK (1);
  33.         TM1637_OUT_DIO1 = 1;
  34.         TM1637_Delay_us(2);
  35.         TM1637_OUT_DIO1 = 0;
  36.         TM1637_Delay_us(2);
  37.         TM1637_CLK ( 0);
  38. }
  39. void TM1637_Ack(void)
  40. {
  41.         TM1637_DIO_IN();
  42.   TM1637_CLK ( 0);
  43.         TM1637_Delay_us(5);
  44.         while(TM1637_READ_DIO1);
  45.         TM1637_CLK (1);
  46.         TM1637_Delay_us(2);
  47. }
  48. void TM1637_Stop(void)
  49. {
  50.         TM1637_DIO_OUT();
  51.         TM1637_CLK ( 0);
  52.         TM1637_Delay_us(2);
  53.         TM1637_OUT_DIO1 = 0;
  54.         TM1637_Delay_us(2);
  55.         TM1637_CLK (1);
  56.         TM1637_Delay_us(2);
  57.         TM1637_OUT_DIO1 = 1;
  58.         TM1637_Delay_us(2);
  59.         TM1637_CLK( 0);
  60.         TM1637_OUT_DIO1 = 0;
  61. }
  62. void TM1637_WriteByte(unsigned char oneByte)
  63. {
  64. unsigned char i;
  65.         TM1637_DIO_OUT();
  66.         for(i=0;i<8;i++)
  67.         {
  68.          TM1637_CLK(0);
  69.                 if(oneByte&0x01)
  70.                 {
  71.                         TM1637_OUT_DIO1 = 1;
  72.                 }
  73.                 else
  74.                 {
  75.                         TM1637_OUT_DIO1 = 0;
  76.                 }
  77.                 TM1637_Delay_us(3);
  78.                 TM1637_CLK(1);
  79.                 oneByte=oneByte>>1;
  80.         }
  81. }

  82. void TM1637_DisplayChar_1(unsigned char ch,unsigned char p)
  83. {
  84.         if(ch>23)ch=0;//防止数组越界
  85.         TM1637_Start();
  86.         TM1637_WriteByte(0x44);//0x44固定模式有利于控制显示位,0x40则采用显示地址自加模式这里不使用
  87.         TM1637_Ack();
  88.         TM1637_Stop();
  89.         TM1637_Start();
  90.         
  91.         TM1637_WriteByte(0xC0+p);//0X00地址开始显示
  92.         TM1637_Ack();
  93.                
  94.         TM1637_WriteByte(NumDis[ch]);//显示
  95.         TM1637_Ack();
  96.         
  97.         TM1637_Stop();
  98.         TM1637_Start();
  99.         TM1637_WriteByte(0x8C);
  100.         TM1637_Ack();
  101.         TM1637_Stop();
  102.                
  103. }
  104. void TM1637_Display_1(void)
  105. {
  106.         unsigned char a=0,b=0,c=0,d=0;
  107.         if(cache[0]<0)
  108.         {
  109.                 d=((-cache[0])%60)%10;
  110.                 c=((-cache[0])%60)/10;
  111.                 b=((-cache[0])/60)%10;
  112.                 a=0x40;
  113.         }
  114.         else
  115.         {
  116.         d=(cache[0]%60)%10;
  117.         c=(cache[0]%60)/10;
  118.         b=(cache[0]/60)%10;
  119.         a=(cache[0]/60)/10;
  120.         }
  121.         TM1637_Start();
  122.         TM1637_WriteByte(0x40);//0x40则采用显示地址自加1模式
  123.         TM1637_Ack();
  124.         TM1637_Stop();
  125.         TM1637_Start();
  126.         TM1637_WriteByte(0xC0);//0X00地址开始显示
  127.         TM1637_Ack();
  128.                
  129.         TM1637_WriteByte(TIME[a]);//显示1
  130.         TM1637_Ack();
  131.         if(x==1)
  132.         {
  133.                 temp=TIME[b];
  134.                 x++;
  135.         }
  136.   temp^=0x80;  //10000000^11001111=01001111;01001111^10000000=11001111
  137.         TM1637_WriteByte(temp);//显示2和跳动的冒号
  138.         TM1637_Ack();
  139.         
  140.         TM1637_WriteByte(TIME[c]);//显示0
  141.         TM1637_Ack();
  142.                
  143.         TM1637_WriteByte(TIME[d]);//显示0
  144.         TM1637_Ack();
  145.                
  146.         TM1637_WriteByte(0xFF);
  147.         TM1637_Ack();
  148.                
  149.         TM1637_WriteByte(0xFF);
  150.         TM1637_Ack();
  151.         
  152.         TM1637_Stop();
  153.         TM1637_Start();
  154.         TM1637_WriteByte(0x8c);
  155.         TM1637_Ack();
  156.         TM1637_Stop();
  157. }

  158. void time_1(void)
  159. {
  160.         
  161.         if(x>=2)
  162.                         {
  163.                                                 if((Enable_1==1)&&(channel==0))
  164.                                                 {
  165.                                                                 G_1=1;
  166.                                                                 cache[0]--;
  167.                                                                 if(cache[0]<0)
  168.                                                                 {
  169.                                                                         if((-cache[0])>599)
  170.                                                                         {
  171.                                                                                 Enable_1=0;
  172.                                                                         }
  173.                                                                         K1=1;                                
  174.                                                                 }        
  175.                                                         }
  176.                                 x=1;
  177.                         }
  178. }

  179. void Digital_off_1(void)
  180. {
  181.         TM1637_Start();
  182.         TM1637_WriteByte(0x88);
  183.         TM1637_Ack();
  184.         TM1637_Stop();
  185.         
  186. }
复制代码
  1. /*******************************************************************************
  2. * @file    TM1637.h
  3. * @author  
  4. * @date     
  5. *******************************************************************************/
  6. #ifndef TM1637_H
  7. #define TM1637_H

  8. #include "sys.h"

  9. #define TM1637_OUT_DIO1           PCout(0)

  10. #define TM1637_READ_DIO1           PCin(0)

  11. //IO方向设置
  12. #define TM1637_DIO_IN()     {GPIOC->CRL&=0XF000000F;GPIOC->CRL|=0X08888880;}
  13. #define TM1637_DIO_OUT()    {GPIOC->CRL&=0XF000000F;GPIOC->CRL|=0X03333330;}

  14. /**
  15.   * @brief  Configuration Dots's Mode enumeration  
  16.   */
  17. typedef enum
  18. {
  19.         DulDot = 0x00,
  20.   LowDot= 0x01,
  21.   HighDot= 0x2,
  22. }DisDotSetting;
  23. typedef enum
  24. {
  25.         sty = 0x00,
  26.   Jep = 0x01,
  27. }DisDotMode;



  28. void TM1637_Delay_us(unsigned  int Nus);

  29. void TM1637_Display_1(void);
  30. void TM1637_DisplayChar_1(unsigned char ch,unsigned char p);
  31. void time_1(void);

  32. void TM1637_Display_2(void);
  33. void TM1637_DisplayChar_2(unsigned char ch,unsigned char p);
  34. void time_2(void);

  35. void TM1637_Display_3(void);
  36. void TM1637_DisplayChar_3(unsigned char ch,unsigned char p);
  37. void time_3(void);

  38. void TM1637_Display_4(void);
  39. void TM1637_DisplayChar_4(unsigned char ch,unsigned char p);
  40. void time_4(void);

  41. void TM1637_Display_5(void);
  42. void TM1637_DisplayChar_5(unsigned char ch,unsigned char p);
  43. void time_5(void);

  44. void TM1637_Display_6(void);
  45. void TM1637_DisplayChar_6(unsigned char ch,unsigned char p);
  46. void time_6(void);

  47. void Digital_off_1(void);
  48. void Digital_off_2(void);
  49. void Digital_off_3(void);
  50. void Digital_off_4(void);
  51. void Digital_off_5(void);
  52. void Digital_off_6(void);
  53. #endif
复制代码



上面2个文件  帖到网页上面了

原理图参考:http://www.51hei.com/bbs/dpj-213103-1.html

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-10-27 14:41 | 只看该作者
电路连接是怎么样的?
回复

使用道具 举报

板凳
ID:116831 发表于 2021-12-28 13:52 | 只看该作者
这不是TM1637的程序,不是TM1681的啊。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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