找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 751|回复: 3
打印 上一主题 下一主题
收起左侧

单片机TM1637驱动数码管程序TM1637.c和TM1637.h文件

[复制链接]
跳转到指定楼层
楼主
ID:600825 发表于 2025-10-23 22:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
资料详见:http://www.51hei.com/bbs/dpj-240321-1.html

TM1637.h程序文件:
  1. #ifndef __TM1637_H__
  2. #define __TM1637_H__
  3. #include <STC8H.H>

  4. //定义端口
  5. sbit clk = P1^0;
  6. sbit dio = P3^7;
  7. extern unsigned char xdata smg_hc[4];                                  //数码管缓存
  8. extern  unsigned char shu;

  9. void SmgDisplay(unsigned char *p,char L);                                //指定数组显示。*p:数码管段码 L:0-9亮度
  10. void Smg_ctrl_dot(bit dot);                                                                //控制小数点亮灭。0:小数点熄灭,1:小数点亮起
  11. void Smg_ctrl_bit(unsigned char i,unsigned char dat);        //控制单独数码管。i:要控制的数码管位 dat:要写入的数据:0~9; 10为熄灭该数码管
  12. void Smg_ctrl_lum(unsigned char R);                                                //亮度控制。亮度等级:1~8;0为熄灭
  13. void Smg_ctrl_all(unsigned char a,unsigned char b,unsigned char c,unsigned char d,bit t,char R);
  14. //数码管,a,b,c,d为4位显示数字,t:小数点0|1,R亮度:0~8                                                                                               
  15. void Fnshu(unsigned int a);                                                                //指定4位数拆份并显示
  16. void ZUDisplay(unsigned char *p);

  17. #endif
复制代码

TM1637.c程序:
  1. #include <TM1637.H>
  2. #include <intrins.h>

  3. static unsigned char data t_display[]={                       //标准字库
  4. //   0    1    2    3    4    5    6    7    8    9   black
  5.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
  6. unsigned char xdata smg_hc[4];                                  //数码管缓存
  7. unsigned char luminance=0;                                      //亮度存储
  8. unsigned char shu;
  9. bit dot_f=0;                                                    //小数点标志位

  10. void Delay1us()                //@24.000MHz
  11. {
  12.         unsigned long  i;

  13.         _nop_();
  14.         _nop_();
  15.         _nop_();
  16.         i = 4UL;
  17.         while (i) i--;
  18. }

  19. /*******************************************************************************
  20. * 函 数 名: Delay_us
  21. * 函数功能: 延时接口
  22. * 输    入: 微秒延时
  23. * 输    出: 无
  24. *******************************************************************************/
  25. void Delay_us(unsigned int i)
  26. {
  27.         for(;i>0;i--)
  28.         {            //延时接口
  29.         Delay1us();
  30.         }
  31. }
  32. /*******************************************************************************
  33. * 函 数 名: TM1637_Start
  34. * 函数功能: 1637起始信号
  35. * 输    入: 无
  36. * 输    出: 无
  37. *******************************************************************************/
  38. void TM1637_Start(void)
  39. {
  40.         clk = 1;
  41.         dio = 1;
  42.         Delay_us(2);
  43.         dio = 0;
  44. }
  45. /*******************************************************************************
  46. * 函 数 名: TM1637_ask
  47. * 函数功能: 1637 应答信号
  48. * 输    入: 无
  49. * 输    出: 无
  50. *******************************************************************************/
  51. void TM1637_ask(void)
  52. {
  53.   clk = 0;
  54.   Delay_us(5); //在第八个时钟下降沿之后延时 5us,开始判断 ACK 信号
  55.   while(dio);
  56.   clk = 1;
  57.   Delay_us(2);
  58.   clk=0;
  59. }
  60. /*******************************************************************************
  61. * 函 数 名: TM1637_Stop
  62. * 函数功能: 1637 停止信号
  63. * 输    入: 无
  64. * 输    出: 无
  65. *******************************************************************************/
  66. void TM1637_Stop(void)
  67. {
  68.          clk = 0;
  69.          Delay_us(2);
  70.          dio = 0;
  71.          Delay_us(2);
  72.          clk = 1;
  73.          Delay_us(2);
  74.          dio = 1;
  75. }
  76. /*******************************************************************************
  77. * 函 数 名: TM1637_WrByte
  78. * 函数功能: 写一个字节
  79. * 输    入: char数据
  80. * 输    出: 无
  81. *******************************************************************************/
  82. void TM1637_WrByte(unsigned char oneByte)
  83. {
  84.          unsigned char i;
  85.          for(i=0;i<8;i++)
  86.          { clk = 0;
  87.          if(oneByte&0x01) //低位在前
  88.          {
  89.          dio = 1;
  90.          }
  91.          else
  92.          {
  93.          dio = 0;
  94.          }
  95.          Delay_us(3);
  96.          oneByte=oneByte>>1;
  97.          clk=1;
  98.          Delay_us(3);
  99.          }
  100. }
  101. /*******************************************************************************
  102. * 函 数 名: SmgDisplay
  103. * 函数功能: 写显示寄存器
  104. * 输    入: *p:数码管段码 L:0-9亮度
  105. * 输    出: 无
  106. *******************************************************************************/
  107. void SmgDisplay(unsigned char *p,char L)
  108. {
  109.          unsigned char i;
  110.          TM1637_Start();
  111.          TM1637_WrByte(0x40); // 40H 地址自动加 1 模式,44H 固定地址模式,本程序采用自加 1 模式
  112.          TM1637_ask();
  113.          TM1637_Stop();
  114.          TM1637_Start();
  115.          TM1637_WrByte(0xc0); //设置首地址,
  116.          TM1637_ask();
  117.          
  118.          for(i=0;i<6;i++) //地址自加,不必每次都写地址
  119.          {
  120.            TM1637_WrByte(*p++); //送数据
  121.            TM1637_ask();
  122.          }

  123.          TM1637_Stop();
  124.          TM1637_Start();
  125.          if((L>0)&&(L<9)) TM1637_WrByte((unsigned char)(0x88+(L-1))); //开显示 ,最大亮度
  126.          else TM1637_WrByte(0x80);
  127.          
  128.          TM1637_ask();
  129.          TM1637_Stop();
  130. }
  131. /*******************************************************************************
  132. * 函 数 名: Smg_ctrl_dot
  133. * 函数功能: 控制小数点亮灭
  134. * 输    入: 0:小数点熄灭1:小数点亮起
  135. * 输    出: 无
  136. *******************************************************************************/
  137. void Smg_ctrl_dot(bit dot)
  138. {
  139.         if(dot) smg_hc[1]-=0x80;
  140.         SmgDisplay(smg_hc,luminance);
  141. }
  142. /*******************************************************************************
  143. * 函 数 名: Smg_ctrl_bit
  144. * 函数功能: 控制单独数码管
  145. * 输    入: i:要控制的数码管位 dat:要写入的数据:0~9; 10为熄灭该数码管
  146. * 输    出: 无
  147. *******************************************************************************/
  148. void Smg_ctrl_bit(unsigned char i,unsigned char dat)
  149. {
  150.         smg_hc[i+1]=t_display[dat];
  151.         SmgDisplay(smg_hc,luminance);
  152. }
  153. /*******************************************************************************
  154. * 函 数 名: Smg_ctrl_lum
  155. * 函数功能: 数码管亮度控制
  156. * 输    入: 亮度等级:1~8;  0为熄灭
  157. * 输    出: 无
  158. *******************************************************************************/
  159. void Smg_ctrl_lum(unsigned char R)
  160. {
  161.         luminance=R;
  162.         SmgDisplay(smg_hc,luminance);
  163. }
  164. /*******************************************************************************
  165. * 函 数 名: Smg_ctrl_all
  166. * 函数功能: 数码管全部资源控制
  167. * 输    入: a:第一位数码管 0~9
  168.                         b:第二位数码管 0~9
  169.                         c:第三位数码管 0~9
  170.             d:第四位数码管 0~9
  171.             t:小数点       0|1
  172.             R:亮度         0~8
  173. * 输    出: 无
  174. *******************************************************************************/
  175. void Smg_ctrl_all(unsigned char a,unsigned char b,unsigned char c,unsigned char d,bit t,char R)
  176. {         
  177.         smg_hc[0]=t_display[a];        //将标准字库赋于数码管缓存
  178.         smg_hc[1]=t_display[b];
  179.         dot_f=t;
  180.         if(t) smg_hc[1]-=0x80;
  181.         smg_hc[2]=t_display[c];
  182.         smg_hc[3]=t_display[d];
  183.         luminance=R;
  184.         SmgDisplay(smg_hc,luminance);
  185. }
  186. /*******************************************************************************
  187. * 函 数 名: Fnshu
  188. * 函数功能: 将接收到的自然数拆份并显示
  189. * 输    入: a:值的范围0-65535
  190.                          luminance:亮度  0~8
  191. * 输    出: 无
  192. *******************************************************************************/
  193. void Fnshu(unsigned int a)
  194. {         
  195.         smg_hc[3] = t_display[a%10];                                   //个
  196.         smg_hc[2] = t_display[a/10%10];                                   //十
  197.         smg_hc[1] = t_display[a/100%10];                           //百
  198.         smg_hc[0] = t_display[a/1000%10];                           //千
  199.         luminance=1;
  200.         SmgDisplay(smg_hc,luminance);
  201. }
  202. /*******************************************************************************
  203. * 函 数 名: Fnshu
  204. * 函数功能: 显示指定数组
  205. * 输    入: a:值的范围0-65535
  206.                          luminance:亮度  0~8
  207. * 输    出: 无
  208. *******************************************************************************/
  209. void ZUDisplay(unsigned char *p)
  210. {         
  211.         unsigned char i;
  212.         for(i=0;i<4;i++)
  213.         {
  214.                 smg_hc[i] = t_display[*p];
  215.                 p++;                                           //个
  216.         }
  217.         
  218.         luminance=1;
  219.         SmgDisplay(smg_hc,luminance);
  220. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:654797 发表于 2025-10-25 07:07 | 只看该作者
dcc60 发表于 2025-10-24 09:50
TM1638还没搞明白,TM1637又来了。

8高级点还是七高级点
回复

使用道具 举报

板凳
ID:584814 发表于 2025-10-24 17:38 | 只看该作者
貌似还少了读取键值的功能
回复

使用道具 举报

沙发
ID:1144680 发表于 2025-10-24 09:50 | 只看该作者
TM1638还没搞明白,TM1637又来了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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