[技术问答] 新塘驱动TM1637

[复制链接]
 楼主| xinruan 发表于 2014-10-23 14:33 | 显示全部楼层 |阅读模式
本帖最后由 xinruan 于 2014-10-25 09:35 编辑

编译通过,试机LED不显示,请老师指教
上传TM1637资料

main.rar

1.43 KB, 下载次数: 19

TM1637_V2.3.pdf

808.76 KB, 下载次数: 12

niuyaliang 发表于 2014-10-23 19:31 | 显示全部楼层
建议贴出代码来
niuyaliang 发表于 2014-10-23 19:32 | 显示全部楼层

  1. #include "SmartM_M0.h"
  2.                                //0     1     2     3     4     5     6     7     8     9
  3. const uint8_t  TM1637_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
  4.                                                                                                                          //A     B     C     D     E     F
  5.                                                                                                                                 0x77, 0X7F, 0x39, 0x3F, 0x79, 0x71};

  6. #define I2C_CLOCK               13
  7.                                                                                                                                
  8. VOID I2CInit(VOID)
  9. {
  10.   P3_PMD &= ~(Px4_PMD | Px5_PMD | Px2_PMD);
  11.         P3_PMD |= (Px4_OD | Px5_OD | Px2_OUT);                       //使能I2C0引脚

  12.   P3_MFP &= ~(P34_T0_I2CSDA | P35_T1_I2CSCL);
  13.         P3_MFP |= (I2CSDA | I2CSCL);                             //选择P3.4,P3.5作为I2C0功能引脚   
  14.    
  15.         APBCLK |= I2C0_CLKEN;                       //使能I2C0时钟
  16.   I2CLK = I2C_CLOCK;

  17.   I2CON |= ENSI;                                     //使能I2C
  18. }

  19. void TM1637_Write(UINT8 led)
  20. {
  21.     UINT8 i, ge, shi, bai, qian;

  22.     I2CON |= STA;        //启动
  23.     /* 40H地址自动加1模式,44H固定地址模式,本程序采用自加1模式 */
  24.     I2DAT = 0x40;
  25.         I2CON &= (~AA);        //发送ACK
  26.         I2CON |= STO;        //停止
  27.     /*写起始地址命令(0C0H),地址从00H单元开始。*/
  28.        
  29.         I2CON |= STA;        //启动
  30.     I2DAT = 0xc0;
  31.         I2CON &= (~AA);        //发送ACK
  32.        
  33.         /*写数据,显示4位数码管,地址自动加1*/
  34.         for(i=0; i<4; i++)
  35.         {
  36.                 if(i==0)        //第一位数码管
  37.                 {
  38.                         ge = led%10;
  39.                         I2DAT = TM1637_CODE[ge];
  40.                         I2CON &= (~AA);        //发送ACK
  41. //                        I2CON |= SI;
  42. //            while ((I2CON & SI) != SI);
  43.                 }
  44.                 if(i==1)        //第二位数码管
  45.                 {
  46.                         shi = led%100/10;
  47.                         I2DAT = TM1637_CODE[shi];
  48.                         I2CON &= (~AA);        //发送ACK
  49. //                        I2CON |= SI;
  50. //            while ((I2CON & SI) != SI);
  51.                 }
  52.                 if(i==2)        //第三位数码管
  53.                 {
  54.                         bai = led%1000/100;
  55.                         I2DAT = TM1637_CODE[bai];
  56.                         I2CON &= (~AA);        //发送ACK
  57. //                        I2CON |= SI;
  58. //            while ((I2CON & SI) != SI);
  59.                 }
  60.                 if(i==3)        //第四位数码管
  61.                 {
  62.                         qian = led/1000;
  63.                         I2DAT = TM1637_CODE[qian];
  64.                         I2CON &= (~AA);        //发送ACK
  65.                 }
  66.         }
  67.        
  68.     I2CON |= STO;        //停止                                                                                         
  69. }

  70. void TM1637_Read(u8 Rkey)
  71. {
  72.         UINT8 i;

  73.     I2CON |= STA;                                      //启动
  74.     I2CON |= SI;                              
  75.     while ((I2CON & SI) != SI);                
  76.     I2CON &= ((~STA)&(~SI));
  77.         //写入读地址
  78.     I2DAT = 0x42;
  79.     I2CON |= SI;
  80.     while ((I2CON & SI) != SI);
  81.         //读取数据
  82.         I2CON |= AA;
  83.         for(i=0; i<8; i++)
  84.         {
  85.             I2CON |= SI;
  86.             while ((I2CON & SI) != SI);
  87.                         I2DAT = Rkey>>1;       
  88.         }
  89.     //发送NACK到TM1637,执行断开连接操作
  90.     I2CON &= (~AA);
  91.     I2CON |= SI;
  92.     while ((I2CON & SI) != SI);
  93.     I2CON |= STO;    //停止
  94. //    I2CON |= SI;
  95. //    while (I2CON & STO);
  96. //        return TRUE;
  97. }

  98. INT32 main(VOID)
  99. {
  100.          UINT8 i, dadt = 128, key;

  101.    Un_Lock_Reg();                                                                //ISP下载时保护FLASH存储器
  102.          PWRCON |= OSC22M_EN;                                                //默认时钟源为外部晶振
  103.          while((CLKSTATUS & OSC22M_STB) == 0);                 //等待12MHz时钟稳定
  104.          CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_22M;        //设置外部晶振为系统时钟
  105.          I2CInit();
  106.        
  107.          while(1)
  108.          {
  109.                   TM1637_Write(dadt);                //执行写操作  
  110.                   Delayms(500);
  111.                  
  112.                   TM1637_Read(key);           //执行读操作
  113.                   for(i=0; i<4; i++)
  114.                   {
  115.                                 if(key != 0xff)
  116.                                 {
  117.                                         switch(key)
  118.                                         {
  119.                                                 case 0xf7:
  120.                                                 P2_DOUT &= 0X01;
  121.                                                 break;
  122.                                                 case 0xf6:
  123.                                                 if(dadt<255)
  124.                                                 {
  125.                                                         dadt++;
  126.                                                 }
  127.                                                 break;
  128.                                                 case 0xf5:
  129.                                                 if(dadt>0)
  130.                                                 {
  131.                                                         dadt--;
  132.                                                 }
  133.                                                 break;
  134.                                                 case 0xf4:
  135.                                                 P2_DOUT |= 0x01;
  136.                                                 break;
  137.                                                 default:
  138.                                                 break;
  139.                                         }
  140.                                 }
  141.                   }
  142.                   Delayms(500);
  143.          }
  144. }
niuyaliang 发表于 2014-10-23 19:33 | 显示全部楼层
1.你先保证你的时序是对的
2.抓波形,看看波形和要求的波形是否一致
蓝魔大师弟 发表于 2015-3-13 14:06 | 显示全部楼层
学习了。。。。。。。。。。。
wright0418 发表于 2015-3-14 00:29 | 显示全部楼层
為何在這邊要回應 ACK ? ACK 不是TM1637回應的嗎?

    I2DAT = 0x40;
        I2CON &= (~AA);        //发送ACK
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部