找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3893|回復(fù): 2
收起左側(cè)

STM32F103驅(qū)動(dòng)LED顯示控制程序 可驅(qū)動(dòng)多達(dá)384點(diǎn)陣LED TM1681

[復(fù)制鏈接]
ID:266546 發(fā)表于 2020-10-27 13:00 | 顯示全部樓層 |閱讀模式
TM1681是一種存儲(chǔ)器交換LED顯示控制的驅(qū)動(dòng)芯片,可以選擇多重的ROW/COM模式(32ROW/8COM和24ROW/16COM),可以用來驅(qū)動(dòng)點(diǎn)陣LED。該芯片提供了軟件設(shè)置的16 個(gè)級(jí)別的脈寬調(diào)制控制輸出,可以調(diào)整LED 循環(huán)顯示的亮度。

單片機(jī)源程序如下:
  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;//防止數(shù)組越界
  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和跳動(dòng)的冒號(hào)
  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. }
復(fù)制代碼
  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方向設(shè)置
  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
復(fù)制代碼


51hei.png
上面2個(gè)文件  帖到網(wǎng)頁上面了

原理圖參考:http://www.torrancerestoration.com/bbs/dpj-213103-1.html

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2020-10-27 14:41 | 顯示全部樓層
電路連接是怎么樣的?
回復(fù)

使用道具 舉報(bào)

ID:116831 發(fā)表于 2021-12-28 13:52 | 顯示全部樓層
這不是TM1637的程序,不是TM1681的啊。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表