找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5280|回复: 8
收起左侧

请问tm1637数码管中间的两个小点怎么点亮

[复制链接]
ID:404720 发表于 2018-11-25 19:54 | 显示全部楼层 |阅读模式
我看不懂数据手册,很迷
回复

使用道具 举报

ID:404720 发表于 2018-11-25 19:55 | 显示全部楼层
里面有数据手册

4位数码管显示模块.zip

519.01 KB, 下载次数: 101

回复

使用道具 举报

ID:155507 发表于 2018-11-26 09:22 | 显示全部楼层
你可以参考一下

  1. //基于TM1637的数码管控制

  2. #include<reg52.h>  //包含52单片机头文件
  3. #include<intrins.h> // _nop_ 头文件
  4. //定义端口
  5. sbit SCL=P1^2;    //定义模拟IIC总线的时钟线
  6. sbit SDA=P1^3;    //定义模拟IIC总线的数据线
  7. unsigned char t, shi, ge, bai;
  8. unsigned int dadt;
  9. unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
  10. /*********************************************************

  11. *IIC_delay

  12. *******************************************************/

  13. void IIC_delay(void)
  14. {
  15.         unsigned char i;
  16.         for(i=0;i<20;i++) _nop_();
  17. }

  18. /*********************************************************
  19. *
  20. 启动IIC
  21. *********************************************************/

  22. void start_IIC(void)
  23. {
  24.         SCL=1; //给芯片发送开始信号
  25.         SDA=1;
  26.         IIC_delay();
  27.         SDA=0;
  28.         IIC_delay();
  29.         SCL=0; //开始信号传送完
  30.         IIC_delay();
  31. }

  32. /*******************************************************
  33. *
  34. 停止IIC
  35. *******************************************************/
  36. void stop_IIC(void)
  37. {
  38.         SCL=0;
  39.         IIC_delay();
  40.         SDA=0;
  41.         IIC_delay();
  42.         SCL=1;
  43.         IIC_delay();
  44.         SDA=1;
  45. }
  46. /*******************************************************
  47. *
  48. 判断芯片发过来的ACK应答信号
  49. *******************************************************/
  50. void ack_IIC()
  51. {
  52.         SCL=0;
  53.         _nop_();_nop_();_nop_();
  54.         while(SDA);
  55.         SCL=1;
  56.         _nop_();_nop_();_nop_();
  57.         SCL=0;
  58. }

  59. /*******************************************************
  60. *
  61. 写一个字节数据
  62. *******************************************************/

  63. void WriteByte(unsigned char WriteData)
  64. {
  65.         unsigned char i;
  66.         for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
  67.         {
  68.                 SCL=0;
  69.                 IIC_delay();
  70.                 WriteData=WriteData>>1;
  71.                 SDA=CY;
  72.                 IIC_delay();
  73.                 SCL=1;
  74.                 IIC_delay();
  75.         }
  76.         //8位数据传送完
  77.         ack_IIC(); //判断芯片发过来的ACK应答信号
  78. }
  79. /*******************************************************

  80. /************************************************
  81. 写一字节数据到LEDSROM
  82. **************************************************/

  83. void write_LEDSROM(unsigned char addr,unsigned char WData)
  84. {
  85.         start_IIC(); //调用开始信号
  86.         WriteByte(addr); //写起始地址命令(0C0H),地址00H单元。
  87.         WriteByte(WData);//给显示寄存器写显示数据,值可根据实参改变
  88.         stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  89. }
  90. /************************************************
  91. /************************************************
  92. *
  93. 分开写数据到LED
  94. **************************************************/
  95. void xsled(void)
  96. {
  97.         SDA=1;
  98.         SCL=1;
  99.         start_IIC(); //调用开始信号
  100.         WriteByte(0x44);//写命令40H(数据设置)
  101.         stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  102.         write_LEDSROM(0xC0,0x00); //第一个数码管
  103.         write_LEDSROM(0xC1,xsbcdbuf[bai]|0x80);  //第二个数码管  0x80 点亮数码管中间的两个小点
  104.         write_LEDSROM(0xC2,xsbcdbuf[shi]); //第三个数码管
  105.         write_LEDSROM(0xC3,xsbcdbuf[ge]);//第四个数码管
  106.         IIC_delay();
  107.         start_IIC(); //调用开始信号
  108.         WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
  109.         stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  110. }

  111. void init()
  112. {
  113.         TMOD|=0X01; // Timer0
  114.         TH0=(65535-50000)/256; // 50ms
  115.         TL0=(65535-50000)%256;
  116.         ET0=1;
  117.         EA=1;
  118.         TR0=1;
  119. }

  120. void jisuan()
  121. {     
  122.         bai=dadt/100;
  123.         shi=dadt/10%10;
  124.         ge=dadt%10;
  125. }

  126. void main()
  127. {
  128.         //P1=0xff;
  129.         init();
  130.         while(1)
  131.         {
  132.                 jisuan();
  133.                 xsled();
  134.                 if(t>=20)  // 1s
  135.                 {
  136.                         t=0;
  137.                         dadt++;
  138.                         if(dadt>=1000) //能到999
  139.                         {
  140.                                 dadt=0;
  141.                         }
  142.                 }
  143.         }
  144. }

  145. void T0_time() interrupt 1  // 50ms
  146. {
  147.         TH0=(65535-50000)/256;
  148.         TL0=(65535-50000)%256;
  149.         t++;
  150. }

复制代码
回复

使用道具 举报

ID:404720 发表于 2018-11-26 10:48 | 显示全部楼层

谢谢!今天我回去试一下
回复

使用道具 举报

ID:404720 发表于 2018-11-26 19:17 | 显示全部楼层

现在可以亮了,请问怎么让他闪烁起来呢
回复

使用道具 举报

ID:404720 发表于 2018-11-26 19:55 | 显示全部楼层

可以了闪烁好了谢谢
回复

使用道具 举报

ID:155507 发表于 2018-11-26 21:34 | 显示全部楼层
让他闪烁起来, 给你改了一下,你试试。

  1. //基于TM1637的数码管控制

  2. #include<reg52.h>  //包含52单片机头文件
  3. #include<intrins.h> // _nop_ 头文件
  4. //定义端口
  5. sbit SCL=P1^2;    //定义模拟IIC总线的时钟线
  6. sbit SDA=P1^3;    //定义模拟IIC总线的数据线
  7. unsigned char t, shi, ge, bai;
  8. unsigned int dadt;
  9. bit Blink = 0; //中间的两个小点闪烁起来标志位,=1表示点亮,=0表示不点亮
  10. unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
  11.                               // 0    1    2    3    4    5     6    7    8   9    0
  12. /*********************************************************

  13. *IIC_delay

  14. *******************************************************/
  15. void IIC_delay(void)
  16. {
  17.         unsigned char i;
  18.         for(i=0;i<20;i++) _nop_();
  19. }
  20. /*********************************************************
  21. *
  22. 启动IIC
  23. *********************************************************/
  24. void start_IIC(void)
  25. {
  26.         SCL=1; //给芯片发送开始信号
  27.         SDA=1;
  28.         IIC_delay();
  29.         SDA=0;
  30.         IIC_delay();
  31.         SCL=0; //开始信号传送完
  32.         IIC_delay();
  33. }
  34. /*******************************************************
  35. *
  36. 停止IIC
  37. *******************************************************/
  38. void stop_IIC(void)
  39. {
  40.         SCL=0;
  41.         IIC_delay();
  42.         SDA=0;
  43.         IIC_delay();
  44.         SCL=1;
  45.         IIC_delay();
  46.         SDA=1;
  47. }
  48. /*******************************************************
  49. *
  50. 判断芯片发过来的ACK应答信号
  51. *******************************************************/
  52. void ack_IIC()
  53. {
  54.         SCL=0;
  55.         _nop_();_nop_();_nop_();
  56.         while(SDA);
  57.         SCL=1;
  58.         _nop_();_nop_();_nop_();
  59.         SCL=0;
  60. }

  61. /*******************************************************
  62. *
  63. 写一个字节数据
  64. *******************************************************/

  65. void WriteByte(unsigned char WriteData)
  66. {
  67.         unsigned char i;
  68.         for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
  69.         {
  70.                 SCL=0;
  71.                 IIC_delay();
  72.                 WriteData=WriteData>>1;
  73.                 SDA=CY;
  74.                 IIC_delay();
  75.                 SCL=1;
  76.                 IIC_delay();
  77.         }
  78.         //8位数据传送完
  79.         ack_IIC(); //判断芯片发过来的ACK应答信号
  80. }
  81. /*******************************************************

  82. /************************************************
  83. 写一字节数据到LEDSROM
  84. **************************************************/

  85. void write_LEDSROM(unsigned char addr,unsigned char WData)
  86. {
  87.         start_IIC(); //调用开始信号
  88.         WriteByte(addr); //写起始地址命令(0C0H),地址00H单元。
  89.         WriteByte(WData);//给显示寄存器写显示数据,值可根据实参改变
  90.         stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  91. }
  92. /************************************************
  93. /************************************************
  94. *
  95. 分开写数据到LED
  96. **************************************************/
  97. void xsled(void)
  98. {
  99.         SDA=1;
  100.         SCL=1;
  101.         start_IIC(); //调用开始信号
  102.         WriteByte(0x44);//写命令40H(数据设置)
  103.         stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  104.         write_LEDSROM(0xC0,0x00); //第一个数码管
  105.         write_LEDSROM(0xC1,xsbcdbuf[bai]|(Blink ? 0x80 : 0x00)); //第二个数码管  0x80 点亮数码管中间的两个小点
  106.         write_LEDSROM(0xC2,xsbcdbuf[shi]); //第三个数码管
  107.         write_LEDSROM(0xC3,xsbcdbuf[ge]);//第四个数码管
  108.         IIC_delay();
  109.         start_IIC(); //调用开始信号
  110.         WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
  111.         stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  112. }

  113. void init()
  114. {
  115.         TMOD|=0X01; // Timer0
  116.         TH0=(65535-50000)/256; // 50ms
  117.         TL0=(65535-50000)%256;
  118.         ET0=1;
  119.         EA=1;
  120.         TR0=1;
  121. }
  122. void jisuan()
  123. {     
  124.         bai=dadt/100;
  125.         shi=dadt/10%10;
  126.         ge=dadt%10;
  127. }
  128. void main()
  129. {
  130.         //P1=0xff;

  131.         init();
  132.         while(1)
  133.         {
  134.                 jisuan();
  135.                 xsled();
  136.                 if(t>=20)  // 1s
  137.                 {
  138.                         t=0;
  139.                         dadt++;
  140.                         if(dadt>=1000) //能到999
  141.                         {
  142.                                 dadt=0;
  143.                         }
  144.                 }
  145.         }
  146. }

  147. void T0_time() interrupt 1  // 50ms
  148. {
  149.         TH0=(65535-50000)/256;
  150.         TL0=(65535-50000)%256;
  151.         t++;
  152.         if(t%2==0)
  153.          Blink =~Blink; //中间的两个小点闪烁起来
  154. }
复制代码
回复

使用道具 举报

ID:19680 发表于 2018-11-26 21:35 | 显示全部楼层
zhengaohui 发表于 2018-11-26 19:17
现在可以亮了,请问怎么让他闪烁起来呢

用个延时函数就行了 跟led闪烁的原理是一样的
回复

使用道具 举报

ID:404720 发表于 2018-11-27 07:14 来自手机 | 显示全部楼层
angmall 发表于 2018-11-26 21:34
让他闪烁起来, 给你改了一下,你试试。

谢谢大佬,感觉又涨姿势了!我的方法是直接在百位那边加了个delay,先“|0x80”,然后再delay不“|0x80”,
感觉没你的程序精妙。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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