单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:754|回复:3
打印上一主题下一主题

51单片机+TM1680驱动数码显示屏源程序

[复制链接]
跳转到指定楼层
楼主
ID:369412发表于 2023-12-9 11:08|只看该作者回帖奖励
单片机源程序如下:
  1. /***************************************************************************
  2. 深圳天微电子
  3. *文 件 名:TM1680-V1.0
  4. *当前版本:V1.0
  5. *注意事项:1、A1\A0 采用MCU进行控制,实际使用时,可以将A1\A0任意接高低电平,TM1680 ID改为相应指令即可;
  6.          2、该程序采用STC15W芯片模拟IIC协议,IO口为双向IO口(无需设置输入与输出),如果MCU的IO口需要设置输入和输出,则在ACK时需要设置为输入
  7.          3、该芯片支持标准IIC协议
  8.          4、SDA、SCL需要外接上拉电阻;
  9.          5、不同的MCU需要根据芯片时钟频率调整延时时间;
  10. *免责声明:1.此程序为TM1680驱动LED演示程序,仅作参考之用。
  11. ********************************************************************************/

  12. #include< reg52.h>
  13. #include< intrins.h>
  14. #include< tm1680.h>


  15. /***端口定义***/
  16. //sbit SDA=P3^0;   //TM1680通讯端口设置
  17. //sbit SCL=P3^1;

  18. sbit SDA=P1^0;   //TM1680通讯端口设置
  19. sbit SCL=P1^1;

  20. sbit KEY=P3^2;

  21. //sbit MA1=P1^6;
  22. //sbit MA0=P1^7;

  23. ///***按键功能设置***/
  24. //sbit KEY0=P3^2;
  25. //sbit KEY1=P3^3;
  26. //sbit KEY2=P3^6;


  27. /***显示数据***/

  28. unsigned char TM1680perseg[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x8};
  29. //unsigned char DispA[8]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10};

  30.                //地址   00   01   02   03   04  05   06   07  08  09   10   11   12   13  14  15   16   17  18   19  20   21   22   23
  31. unsigned char code table0[24]={0xff,0xff,0xff,0xff,0xF0,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};  //0 ok

  32.                //地址   00   01   02   03   04  05   06   07  08   09   10   11   12   13  14  15   16   17  18   19  20   21   22   23
  33. unsigned char code table1[24]={0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0xFF,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0x00,0x00,0x00,0xff};  //1 ok

  34.                //地址   00   01   02   03   04   05   06   07  08   09   10   11   12   13   14   15   16   17  18   19   20   21   22   23
  35. unsigned char code table2[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0c,0xff,0xff,0xff,0xff};  //2 ok
  36.     
  37.                    //地址   00   01   02   03   04   05   06   07  08   09   10   11   12   13  14   15   16   17  18   19   20   21  22   23
  38. unsigned char code table3[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0xff,0xff,0xff,0xff};  //3 ok
  39.     
  40.                    //地址   00   01   02   03   04   05   06   07  08   09   10   11   12   13   14  15   16   17  18   19   20   21  22   23
  41. unsigned char code table4[24]={0xff,0xf0,0x00,0xff,0xf0,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0x00,0x00,0x00,0xff};  //4  ok
  42.     
  43.                    //地址   00   01   02   03   04  05   06   07  08   09   10   11   12   13   14  15   16   17  18  19   20   21  22   23
  44. unsigned char code table5[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x0C,0xff,0xff,0xff,0xff,0xff,0xff,0xff};  //5 ok
  45.     
  46.                    //地址   00   01   02   03   04  05   06   07  08   09   10   11   12   13   14  15   16   17  18  19   20   21  22   23
  47. unsigned char code table6[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};   //6  ok
  48.     
  49.                    //地址   00   01   02   03   04  05   06   07  08   09   10   11   12   13   14  15   16   17  18  19   20   21  22   23
  50. unsigned char code table7[24]={0xff,0xff,0xff,0xFF,0xF0,0x00,0x00,0xFF,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0x00,0x00,0x00,0xff};   //7  ok
  51.     
  52.                    //地址     00   01   02   03   04  05   06   07  08   09   10   11   12   13   14  15   16   17   18  19   20   21  22   23
  53. unsigned char code table8[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};   //8 ok
  54.     
  55.                    //地址     00   01   02   03   04  05   06   07  08   09   10   11   12   13   14  15   16   17   18  19   20   21  22   23
  56. unsigned char code table9[24]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0C,0xff,0xff,0xff,0xff,0xff,0xff,0xff};   //9 ok

  57.     
  58. unsigned char  KEY_TEMP;
  59. /*******************************/
  60. /******     函数功能:延时函数 *****/
  61. /*******************************/
  62. void delayms(unsigned int n)  
  63. {
  64.      unsigned int i;
  65.      while(n--)
  66.      {
  67.          for(i=0;i<300;i++);
  68.      }
  69. }

  70. /*******************************/
  71. /******     函数功能:延时函数 *****/
  72. /*******************************/
  73. void delayus(unsigned char n)  //256
  74. {
  75.      while (--n)
  76.      {
  77.          _nop_();
  78.      }
  79. }

  80. /*******************************/
  81. /******     函数功能:起始操作  *****/
  82. /*******************************/

  83. void TM1680start(void)
  84. {
  85.    SDA=1;  
  86.        SCL=1;    
  87.    SDA=1;
  88.        delayus(4);
  89.    delayus(10);
  90.    SDA=0;
  91.    delayus(14);  //起始信号,必须大于4.7us
  92.    SCL=0;
  93. }

  94. /*******************************/
  95. /******     函数功能:反馈操作  *****/
  96. /*******************************/
  97. void Ack(void)
  98. {
  99.    SCL = 0;  
  100.    delayus(8);    
  101.    SCL = 1;            
  102.    delayus(8);
  103.          while(SDA);
  104.          SCL=0;
  105.          delayus(15);
  106. }


  107. /*******************************/
  108. /******     函数功能:反馈操作  *****/
  109. /*******************************/
  110. /*void TM1680SetAck(bit ack)
  111. {
  112.    SCL=0; delayus(5);
  113.    SDA = ack;             //写应答信号
  114.    SCL = 1;               //拉高时钟线
  115.    delayus(5);             //延时
  116.    SCL = 0;               //拉低时钟线
  117.    delayus(5);             //延时
  118. }*/

  119. /*******************************/
  120. /******     函数功能:停止操作  *****/
  121. /*******************************/
  122. void TM1680stop(void)
  123. {
  124.    SDA=0;
  125.        SCL=1;
  126.    delayus(10);
  127.    SDA=1;     //停止信号,大于5us
  128.    delayus(10);
  129.    SCL=1;
  130.        SDA=1;
  131. }



  132. /*******************************/
  133. /******     函数功能:送数据   *****/
  134. /*******************************/
  135. void TM1680SendByte(unsigned char sbyte)
  136. {
  137.    unsigned char i=0;
  138.    for(i=0; i<8; i++)
  139.    {
  140.        SCL=0;delayus(2);
  141.        if(sbyte&0x80)
  142.        {
  143.            SDA=1;   //高位先发
  144.        }else{
  145.            SDA=0;
  146.        }
  147.        delayus(5);
  148.        SCL=1;
  149.        delayus(5); //高电平的时间大于4us
  150.        sbyte<<=1;  
  151.        delayus(3);
  152.    }
  153.    SCL=0; delayus(5);
  154.    SDA=0; delayus(5);
  155. }



  156. /*******************************/
  157. /******     函数功能:  读操作  *****/
  158. /*******************************/
  159. /*unsigned char  TM1680RecvByte(void)
  160. {
  161.          unsigned char i=0, sbyte;
  162.   
  163.        SDA=1;delayus(6);
  164.        for(i=0; i<8; i++)
  165.        {
  166.          SCL=0;delayus(6);
  167.          if(SDA)
  168.          {
  169.            sbyte |= 0x01 ;   //置1
  170.          }else{
  171.            sbyte& = 0xfe;   //置0
  172.          }
  173.          delayus(3);
  174.          SCL=1;
  175.          delayus(5); //高电平的时间大于4us
  176.          sbyte<<=1;
  177.        }
  178.        SCL=0;
  179.        return sbyte;
  180. }*/
  181. /******************************底层函数结束**************************/


  182. /******************************功能函数**************************/
  183. /***单字节写操作函数***/
  184. /***写命令函数:开始--ID-ACK--命令-ACK--结束***/
  185. /****************************************************************/
  186. /*
  187. void TM1680WriteCmd(unsigned char scmd)
  188. {
  189.      TM1680start();

  190.      TM1680SendByte(TM1680ID);    
  191.      Ack();

  192.      TM1680SendByte(scmd);  
  193.      Ack();

  194.      TM1680stop();
  195. }*/

  196. /*************  写一个字节数据:***********************/
  197. /********** 开始--ID-ACK-内部地址-ACK--数据-ACK-结束**/
  198. /***************************************************/
  199.     
  200.     
  201. void TM1680WriteOneByte(unsigned char faddr, unsigned char sdate)
  202. {  
  203.    TM1680start();
  204.   
  205.    TM1680SendByte(TM1680ID);     //写TM1680器件地址
  206.    Ack();

  207.    TM1680SendByte(faddr);  //eeprom 地址
  208.    Ack();
  209.   
  210.    TM1680SendByte(sdate); //写数据
  211.    Ack();
  212.   
  213.    TM1680stop();
  214. }


  215. /******************************************/
  216. /****   函数功能:函数功能:页操作   *******/
  217. /*****************************************/
  218.       
  219. void TM1680PageAllWrite(unsigned char faddr, unsigned char sdat1,unsigned char sdat2,unsigned char cnt)
  220. {
  221.    unsigned char i=0;
  222.    TM1680start();
  223.   
  224.    TM1680SendByte(TM1680ID);  
  225.    Ack();

  226.    TM1680SendByte(faddr);  //eeprom 地址
  227.    Ack();

  228.    for(i=0; i<cnt;i++)
  229.    {
  230.      TM1680SendByte(sdat1);  //写数据
  231.                Ack();
  232.                TM1680SendByte(sdat2);  //写数据
  233.        Ack();
  234.    }

  235.    TM1680stop();
  236. }



  237. void TM1680PageAll_GD_Write(unsigned char faddr, unsigned char sdat1, unsigned char sdat2,unsigned char cnt)
  238. {
  239.    unsigned char i=0;

  240.    for(i=0; i<cnt; i=i+2)
  241.    {
  242.      TM1680WriteOneByte( faddr+i, sdat1);
  243.                TM1680WriteOneByte( faddr+2, sdat2);
  244.             
  245.    }

  246.    TM1680stop();
  247. }


  248. /******************************************/
  249. /****   按键函数功能:函数功能:  按键 *******/
  250. /*****************************************/
  251.       
  252. void KEY_DEL()
  253. {

  254.   if(KEY==0)
  255.    {
  256.            delayus(30);
  257.        if(KEY==0);
  258.    {
  259.            delayus(10);
  260.                  while(KEY==0);
  261.                KEY_TEMP++;        
  262.          }
  263.      }
  264. if( KEY_TEMP==20)
  265.      KEY_TEMP=0;
  266.           
  267. }          


  268. /********************************************************/
  269. /****   函数功能: 先初始化后  再写命令+写数据     *******/
  270. /******************************************************/
  271. /*void TM1680WriteCmdDate(unsigned char faddr, unsigned char sdate, unsigned char cnt)
  272. {
  273.    unsigned char i=0;    
  274.      TM1680start();
  275.      TM1680SendByte(TM1680ID);    
  276.      Ack();
  277.      TM1680SendByte(SYSDIS);  
  278.      Ack();
  279.      TM1680SendByte(COM8NMOS);
  280.      Ack();
  281.      TM1680SendByte(RCMODE1);
  282.      Ack();
  283.      TM1680SendByte(SYSEN);  
  284.      Ack();
  285.      TM1680SendByte(LEDON);
  286.      Ack();
  287.      TM1680SendByte(PWM16);  
  288.      Ack();
  289.      TM1680SendByte(BLINKOFF);
  290.      Ack();
  291.     
  292.      TM1680SendByte(faddr);
  293.      Ack();
  294.       
  295.      for(i=0; i<cnt; i++)
  296.      {
  297.              TM1680SendByte(sdate);
  298.              Ack();    
  299.      }
  300.     
  301.      TM1680stop();
  302. }
  303.      */

  304. /******************************************/
  305. /****   函数功能: TM1680 初始化   *******/
  306. /*****************************************/

  307. void TM1680Init(void)
  308. {
  309.      TM1680start();

  310.      TM1680SendByte(TM1680ID);    
  311.      Ack();
  312.      TM1680SendByte(SYSDIS);  
  313.      Ack();
  314.      TM1680SendByte(COM16NMOS);   //根据需求进行选择
  315.      Ack();
  316.      TM1680SendByte(RCMODE1);
  317.      Ack();
  318.      TM1680SendByte(SYSEN);  
  319.      Ack();
  320.      TM1680SendByte(LEDON);
  321.      Ack();
  322. //     TM1680SendByte(LEDOFF);
  323. //     Ack();
  324.      TM1680SendByte(PWM12);  
  325.      Ack();
  326.      TM1680SendByte(BLINKOFF);
  327.      Ack();
  328.     
  329.      TM1680stop();    
  330.      delayms(50);
  331. }


  332. /******************************************/
  333. /*************   PWM调节测试   ***********/
  334. /*****************************************/

  335. //void PWMTest(unsigned char sTime)
  336. //{
  337. //       unsigned char i=0;
  338. //    
  339. //       for(i=0;i<16;i++)
  340. //     {
  341. //             TM1680WriteCmd(PWM01 | i);
  342. //             delayms(sTime);
  343. //             delayms(sTime);
  344. //     }
  345. //}

  346. /******************************************/
  347. /*************   TM1680ID判断   *********/
  348. /*****************************************/

  349. //void TM1680IDChange(void)
  350. //{
  351. //         switch(TM1680ID)
  352. //         {
  353. //                 case 0xe4: MA1=0; MA0=0; break;
  354. //                 case 0xe5: MA1=0; MA0=1; break;
  355. //                 case 0xe6: MA1=1; MA0=0; break;
  356. //                 case 0xe7: MA1=1; MA0=1; break;
  357. //                 default:break;
  358. //         }
  359. //}

  360. /******************************************/
  361. /********     函数功能:逐渐点亮每一段 *********/
  362. /*****************************************/
  363. void TM1680PerDisp(void)
  364. {
  365.        unsigned char i=0,j=0;
  366.        unsigned char faddr=0x00, fdate=TM1680perseg[0];
  367.          for(i=0;i<24; i++)
  368.          {
  369.                  for(j=0;j<8;j++)
  370.                  {
  371.                      fdate=fdate|TM1680perseg[j];
  372.                      TM1680WriteOneByte(faddr,fdate);
  373.                      delayms(20);
  374.                  }
  375.                  faddr+=2;
  376.                  fdate=TM1680perseg[0];
  377.          }
  378. }




  379. void TM1680_SZR(unsigned char *ss)  small
  380. {
  381.      unsigned char dd;
  382.   unsigned char *tab;
  383.   tab=ss;
  384.     
  385.        for(dd=0;dd<24;dd++)
  386.          {
  387.                TM1680WriteOneByte(4*dd,*tab) ;
  388.                tab = tab+1;
  389.          }
  390.      }
  391.     
  392. ///////////////////////////////////////////////
  393.     
  394. void TM1680_SZG(unsigned char *ss)  small
  395. {
  396.      unsigned char dd;
  397.   unsigned char *tab;
  398.   tab=ss;
  399.     
  400.        for(dd=0;dd<24;dd++)
  401.          {
  402.                TM1680WriteOneByte((4*dd+2),*tab) ;
  403.                tab = tab+1;
  404.          }
  405.      }
  406.     
  407.     
  408.     
  409.     
  410.     
  411.     

  412. //void TM1680_SZ0(void)
  413. //{
  414. //  TM1680WriteOneByte(0,table0[0]);
  415. //     TM1680WriteOneByte(4,table0[1]);
  416. //  TM1680WriteOneByte(8,table0[2]);
  417. //     TM1680WriteOneByte(12,table0[3]);    
  418. //  TM1680WriteOneByte(16,table0[4]);
  419. //     TM1680WriteOneByte(20,table0[5]);
  420. //  TM1680WriteOneByte(24,table0[6]);
  421. //     TM1680WriteOneByte(28,table0[7]);
  422. //  TM1680WriteOneByte(32,table0[8]);
  423. //     TM1680WriteOneByte(36,table0[9]);    
  424. //  TM1680WriteOneByte(40,table0[10]);
  425. //     TM1680WriteOneByte(44,table0[11]);    
  426. //  TM1680WriteOneByte(48,table0[12]);
  427. //     TM1680WriteOneByte(52,table0[13]);
  428. //  TM1680WriteOneByte(56,table0[14]);
  429. //     TM1680WriteOneByte(60,table0[15]);    
  430. //  TM1680WriteOneByte(64,table0[16]);
  431. //     TM1680WriteOneByte(68,table0[17]);    
  432. //  TM1680WriteOneByte(72,table0[18]);
  433. //     TM1680WriteOneByte(76,table0[19]);
  434. //  TM1680WriteOneByte(80,table0[20]);
  435. //     TM1680WriteOneByte(84,table0[21]);    
  436. //  TM1680WriteOneByte(88,table0[22]);
  437. //     TM1680WriteOneByte(92,table0[23]);
  438. //    
  439. //}
  440. //    
  441. //    
  442. //    
  443.     
  444.     
  445. ////////////////////////////////////////////
  446. //////////////     主函数   ///////////////
  447. ///////////////////////////////////////////
  448. void main(void)
  449. {
  450.      //unsigned char i=0,j=0,//fdate=0x10;
  451.      //TM1680IDChange();
  452.      delayms(200);    
  453.     
  454.      TM1680Init();
  455.     
  456.      TM1680PageAllWrite(0x00, 0x00, 0x00,48);  //上电清零
  457.      //TM1680PageAll_GD_Write(0x00, 0x00, 0x00,96);
  458.      delayms(20);
  459.     
  460.      TM1680PageAllWrite(0x00, 0xff,0xff, 48);  //上电全部显示
  461.      //TM1680PageAll_GD_Write(0x00, 0xFF, 0xff,96);
  462.      delayms(800);
  463.     
  464.      TM1680Init();
  465.      TM1680PageAllWrite(0x00, 0x00, 0x00,48);  //上电清零
  466.      delayms(20);
  467.     
  468.      TM1680PageAllWrite(0x00, 0xff,0x00, 48);
  469.      //TM1680PageAll_GD_Write(0x00, 0x00, 0x00,96);
  470.      ///delayms(20);
  471.     
  472.      ///TM1680PageAll_GD_Write(0x00, 0xFF,0x00,96);
  473.      delayms(800);
  474.     
  475.     
  476.          TM1680Init();
  477.      TM1680PageAllWrite(0x00, 0x00, 0x00,48);  //上电清零
  478.      delayms(20);
  479.      TM1680PageAllWrite(0x00, 0x00,0xff, 48);  //清零
  480.      //TM1680PageAll_GD_Write(0x00, 0x00, 0xFF,96);
  481.    delayms(800);
  482.      //TM1680PerDisp();               //每一段显示
  483.      //TM1680Init();
  484.      TM1680Init();
  485.      TM1680PageAllWrite(0x00, 0x00, 0x00,48);  //上电清零
  486.      delayms(20);

  487. //     TM1680WriteOneByte(0,0xff);
  488. //     TM1680WriteOneByte(4,0xff);
  489. //     TM1680WriteOneByte(8,0xff);
  490. //    
  491. //    
  492. //    
  493.     
  494.     
  495.     
  496.      //TM1680WriteOneByte(4,0xff);
  497.      //  delayms(20);
  498.     
  499.     
  500.      //TM1680_SZ0( );
  501.         
  502.      while(1)
  503.      {

  504.    KEY_DEL() ;

  505.          switch(KEY_TEMP)
  506.        {        
  507.         
  508.            case 0:
  509.                {
  510.        TM1680_SZR(table0);
  511.                   
  512.                }
  513.              break;
  514.         
  515.            case 1:
  516.                {
  517.               
  518.        TM1680_SZR(table1);        
  519.         
  520.                 
  521.                }
  522.              break;
  523.         

  524.            case 2:
  525.                {

  526.            TM1680_SZR(table2);      
  527.                }
  528.            break;
  529.               

  530.            case 3:
  531.                {

  532.        TM1680_SZR(table3);          
  533.                }
  534.            break;              
  535.               

  536.            case 4:
  537.                {
  538.        TM1680_SZR(table4);        
  539.                       
  540.                }
  541.            break;              
  542.               
  543.            case 5:
  544.                {
  545.        TM1680_SZR(table5);        
  546.                                     
  547.                }
  548.            break;    

  549.            case 6:
  550.                {
  551.        TM1680_SZR(table6);        
  552.                                                     
  553.                }
  554.            break;    


  555.            case 7:
  556.                {
  557.        TM1680_SZR(table7);        
  558.                                     
  559.                }
  560.            break;    
  561.     
  562.            case 8:
  563.                {
  564.        TM1680_SZR(table8);        
  565.                                     
  566.                }
  567.            break;        
  568.     
  569.                case 9:
  570.                {
  571.        TM1680_SZR(table9);        
  572.                }
  573.            break;    
  574.     
  575.     
  576.         
  577.            case 10:
  578.                {
  579.                  TM1680PageAllWrite(0x00, 0x00, 0x00,48);  //上电清零
  580.            delayms(20);
  581.                   
  582.        TM1680_SZG(table0);
  583.                   
  584.                }
  585.              break;
  586.         
  587. ……………………

  588. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
原理图: 无
仿真: 无
代码: TM1680CX-16X24.zip(44.66 KB, 下载次数: 38)

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:230398发表于 2024-2-29 11:23|只看该作者
下载学习一下!
板凳
ID:1064915发表于 2024-2-29 16:11|只看该作者
1680多重的ROW/COM模式(32ROW/8COM和24ROW/16COM),可以给个原理图
地板
ID:433219发表于 2024-3-1 15:07|只看该作者
多重的ROW/COM模式   什么意思?初次没看懂

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

Powered by 单片机教程网