51单片机驱动TM1637失败,请教

2020-01-19 19:42发布

用的万工的SOC芯片V9401,驱动TM1637,参考了天微电子厂家给的代码,还是不成功的。
  1. /*****************************************************************************
  2. *版权信息:深圳天微电子有限公司
  3. *文 件 名:TM1637-V1.0
  4. *当前版本:V1.0
  5. *MCU 型号:STC12C5608AD
  6. *开发环境:Keil uVision4
  7. *晶震频率:11.0592MHZ      
  8. *完成日期:2013-07-19
  9. *程序功能:数码管驱动和按键:驱动8段6位LED共阳数码管显示,当对应按键按下时显示1~7,原理图请参考TM1637规格书;         
  10. *免责声明:1.此程序为TM1637驱动共阳LED数码管和按键演示程序,仅作参考之用。
  11.             2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任            
  12. ********************************************************************************/
  13. #include <reg52.h>                                                //头文件
  14. #include "intrins.h"                                                //包含_nop_()指令头文件

  15. #define nop _nop_();_nop_();_nop_();_nop_();_nop_();                 //宏定义


  16. /********************定义控制端口**********************/
  17. sbit CLK=P2^2;                                                                 //定义CLK
  18. sbit DIO=P2^3;                                                                 //定义DIO


  19. /********************定义数据*************************/
  20. unsigned char code CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳显示数据0-F
  21.                                                         /* 0   1    2    3    4     5    6    7     8    9   a     b    c    d    e    f*/
  22. unsigned char code TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//数码管不显示

  23. /********************延时函数,延时nms******************/
  24. void delay_nms(unsigned int n)
  25. {
  26. unsigned int i;
  27. while(n--)
  28.    for(i=0;i<550;i++);
  29. }

  30. /********************Start函数*************************/
  31. void I2CStart()
  32. {
  33. DIO=1;
  34. CLK=1;
  35. nop;
  36. DIO=1;
  37. nop;
  38. DIO=0;
  39. nop;
  40. CLK=0;
  41. }

  42. /********************Stop函数*************************/
  43. void I2CStop()
  44. {
  45.     CLK=0;
  46.         nop;
  47.         nop;
  48.         DIO=0;
  49.         nop;
  50.         nop;
  51.         CLK=1;
  52.         nop;
  53.         nop;
  54.         nop;
  55.         DIO=1;
  56.         nop;
  57.         CLK=0;
  58.         DIO=0;
  59. }

  60. /***************发送8bit数据,从低位开始**************/
  61. void I2CWritebyte(unsigned char oneByte)
  62. {
  63.   unsigned char i;
  64.   for(i=0;i<8;i++)
  65.   {
  66.     CLK=0;
  67.         if(oneByte&0x01)
  68.           DIO=1;
  69.         else
  70.           DIO=0;
  71.         nop;
  72.     CLK=1;
  73.     oneByte=oneByte>>1;
  74.   }
  75.                                                                                   //8位数据传送完                 
  76.         CLK = 0;                                                                //判断芯片发过来的ACK应答信号
  77.         nop;
  78.         while(DIO==1);
  79.         nop;
  80.         CLK = 1;
  81.         nop;
  82. }

  83. /***************读按键程序**************/
  84. unsigned char read_key()
  85. {
  86. unsigned char rekey,i;
  87. I2CStart();
  88. I2CWritebyte(0x42);                                                         //写读键指令0x42
  89. DIO=1;
  90. for(i=0;i<8;i++)
  91. {
  92.         CLK=0;
  93.         nop;
  94.         nop;
  95.         rekey=rekey>>1;                                                           //先读低位
  96.         nop;
  97.         nop;
  98.         CLK=1;
  99.         if(DIO)
  100.           rekey=rekey|0x80;
  101.         else
  102.           rekey=rekey|0x00;
  103.         nop;
  104. }
  105.         CLK = 0;                                                          //判断芯片发过来的ACK应答信号
  106.         nop;
  107.         nop;
  108.         while(DIO==1);
  109.         nop;
  110.         nop;
  111.         CLK = 1;
  112.         nop;
  113.         nop;
  114.         I2CStop();
  115.        
  116.         return rekey;
  117. }

  118. /************显示函数,地址自加一************/
  119. void disp0(unsigned char *p)                              
  120. {
  121. unsigned char i;
  122. I2CStart();
  123. I2CWritebyte(0x40);                                  //数据命令设置:地址自动加1,写数据到显示寄存器
  124. I2CStop();

  125. I2CStart();
  126. I2CWritebyte(0xc0);                                  //地址命令设置:初始地址为00H
  127. for(i=0;i<6;i++)                                  //发送4字节数据到显存
  128. {
  129. I2CWritebyte(*p);
  130. p++;
  131. }
  132. I2CStop();

  133. I2CStart();
  134. I2CWritebyte(0x8C);                                 //显示控制命令:开显示,脉冲宽度为11/16.
  135. I2CStop();

  136. }

  137. /************显示函数,固定地址写数据************/
  138. void disp(unsigned char add, unsigned char value)
  139. {
  140. I2CStart();
  141. I2CWritebyte(0x44);                                 //数据命令设置:固定地址,写数据到显示寄存器
  142. I2CStop();

  143. I2CStart();
  144. I2CWritebyte(add);                                //地址命令设置:写入add对应地址

  145. I2CWritebyte(CODE[value]);                        //给add地址写数据
  146. I2CStop();

  147. I2CStart();
  148. I2CWritebyte(0x8C);                                //显示控制命令:开显示,脉冲宽度为11/16.
  149. I2CStop();

  150. }

  151. /************按键处理函数,按键数据低位在前高位在后************/
  152. void key_process()
  153. {
  154. unsigned char temp;
  155. temp=read_key();                                   //读取按键返回值
  156. if(temp!=0xff)
  157. {
  158.   disp0(TAB);                                           //清屏
  159.   switch(temp)
  160.   {
  161.     case 0xf7 : disp(0xc0,1);break;                  //K1与SG1对应按键按下,显示1
  162.         case 0xf6 : disp(0xc1,2);break;                  //K1与SG2对应按键按下,显示2
  163.         case 0xf5 : disp(0xc2,3);break;                  //K1与SG3对应按键按下,显示3
  164.         case 0xf4 : disp(0xc3,4);break;                  //K1与SG4对应按键按下,显示4
  165.         case 0xef : disp(0xc4,5);break;                  //K2与SG1对应按键按下,显示5
  166.         case 0xee : disp(0xc5,6);break;                  //K2与SG2对应按键按下,显示6
  167.         case 0xed : disp(0xc0,7);break;                  //K2与SG3对应按键按下,显示7
  168.         default   : break;
  169.   }
  170. }
  171. }

  172. void main()
  173. {

  174. disp0(CODE);                                      //上电数码管显示0~5
  175. delay_nms(1);
  176. while(1)                                     //按键后显示按键内容
  177. {
  178. key_process();
  179. delay_nms(100);
  180. }
  181. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。