找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15742|回复: 24
收起左侧

51单片机+TM1638驱动数码管测试程序

  [复制链接]
ID:351504 发表于 2018-6-13 23:44 | 显示全部楼层 |阅读模式
某宝上买的TM1638模块测试程序 根据数据手册搞出来的
骑远飞TM1638 按键数码管模块
电路原理图如下:
0.png

0.png

单片机源程序如下:
  1. #ifndef        _TM1638_H
  2. #define        _TM1638_H

  3. #include        <REGX51.H>

  4. #define        DATA_COMMAND        0X40
  5. #define        DISP_COMMAND        0x80
  6. #define        ADDR_COMMAND        0XC0

  7. //TM1638模块引脚定义
  8. sbit        DIO=P1^0;
  9. sbit        CLK=P1^1;
  10. sbit        STB=P1^2;

  11. //共阴数码管显示代码
  12. unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  13.                            0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};


  14. void TM1638_Write(unsigned char        DATA)                        //写数据函数
  15. {
  16.         unsigned char i;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 CLK=0;
  20.                 if(DATA&0X01)
  21.                         DIO=1;
  22.                 else
  23.                         DIO=0;
  24.                 DATA>>=1;
  25.                 CLK=1;
  26.         }
  27. }
  28. unsigned char TM1638_Read(void)                                        //读数据函数
  29. {
  30.         unsigned char i;
  31.         unsigned char temp=0;
  32.         DIO=1;        //设置为输入
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 temp>>=1;
  36.                 CLK=0;
  37.                 if(DIO)
  38.                         temp|=0x80;
  39.                 CLK=1;
  40.         }
  41.         return temp;
  42. }
  43. void Write_COM(unsigned char cmd)                //发送命令字
  44. {
  45.         STB=0;
  46.         TM1638_Write(cmd);
  47.         STB=1;
  48. }
  49. unsigned char Read_key(void)
  50. {
  51.         unsigned char c[4],i,key_value=0;
  52.         STB=0;
  53.         TM1638_Write(0x42);                           //读键扫数据 命令
  54.         for(i=0;i<4;i++)               
  55.                 c[i]=TM1638_Read();
  56.         STB=1;                                                   //4个字节数据合成一个字节
  57.         for(i=0;i<4;i++)
  58.                 key_value|=c[i]<<i;
  59.         for(i=0;i<8;i++)
  60.                 if((0x01<<i)==key_value)
  61.                         break;
  62.         return i;
  63. }
  64. void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址写入数据
  65. {
  66.         Write_COM(0x44);
  67.         STB=0;
  68.         TM1638_Write(0xc0|add);
  69.         TM1638_Write(DATA);
  70.         STB=1;
  71. }
  72. /*
  73. void Write_oneLED(unsigned char num,unsigned char flag)        //单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮
  74. {
  75.         if(flag)
  76.                 Write_DATA(2*num+1,1);
  77.         else
  78.                 Write_DATA(2*num+1,0);
  79. }          */
  80. void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函数,LED_flag表示各个LED状态
  81. {
  82.         unsigned char i;
  83.         for(i=0;i<8;i++)
  84.                 {
  85.                         if(LED_flag&(1<<i))
  86.                                 //Write_DATA(2*i+1,3);
  87.                                 Write_DATA(2*i+1,1);
  88.                         else
  89.                                 Write_DATA(2*i+1,0);
  90.                 }
  91. }

  92. //TM1638初始化函数
  93. void init_TM1638(void)
  94. {
  95.         unsigned char i;
  96.         Write_COM(0x8b);       //亮度 (0x88-0x8f)8级亮度可调
  97.         Write_COM(0x40);       //采用地址自动加1
  98.         STB=0;                           //
  99.         TM1638_Write(0xc0);    //设置起始地址

  100.         for(i=0;i<16;i++)           //传送16个字节的数据
  101.                 TM1638_Write(0x00);
  102.         STB=1;
  103. }
  104. #endif
复制代码


  1. #include        <REGX51.H>
  2. #include        <tm1638.h>

  3. unsigned char num[8];                //各个数码管显示的值

  4. int main(void)
  5. {
  6.         unsigned char i;
  7.         init_TM1638();                                   //初始化TM1638
  8.         for(i=0;i<8;i++)
  9.         Write_DATA(i<<1,tab[0]);                       //初始化寄存器
  10.         
  11.         while(1)
  12.         {
  13.                 i=Read_key();                          //读按键值
  14.                 if(i<8)
  15.                 {
  16.                         num[i]++;
  17.                         while(Read_key()==i);                       //等待按键释放
  18.                         if(num[i]>15)
  19.                         num[i]=0;
  20.                         Write_DATA(i*2,tab[num[i]]);
  21.                         Write_allLED(1<<i);
  22.                 }
  23.         }
  24. }

复制代码

所有资料51hei提供下载:

TM1638 按键数码管模块.zip (802.45 KB, 下载次数: 395)

评分

参与人数 2黑币 +55 收起 理由
火火火火~ + 5 谢谢
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:95542 发表于 2018-8-3 17:50 | 显示全部楼层
下载来学习一下
回复

使用道具 举报

ID:583100 发表于 2019-7-17 20:19 | 显示全部楼层
很好,可以直接用。
回复

使用道具 举报

ID:361722 发表于 2019-8-12 13:35 | 显示全部楼层
新手进来学习下
回复

使用道具 举报

ID:361722 发表于 2019-8-12 13:35 | 显示全部楼层
新手进来学习
回复

使用道具 举报

ID:383374 发表于 2019-8-14 08:27 来自手机 | 显示全部楼层
写的还不错
回复

使用道具 举报

ID:98880 发表于 2019-8-14 10:55 | 显示全部楼层
TM1638的代码,我下载看下,
回复

使用道具 举报

ID:410680 发表于 2020-1-31 23:34 | 显示全部楼层
好文章,正好需要
回复

使用道具 举报

ID:148715 发表于 2020-2-1 11:21 | 显示全部楼层
新手过来学习一i下。感觉非常不错
回复

使用道具 举报

ID:410680 发表于 2020-2-1 12:38 | 显示全部楼层
下载测试很好用,谢谢分享
回复

使用道具 举报

ID:398504 发表于 2020-2-28 00:15 | 显示全部楼层
非常感谢,下载来试试看
回复

使用道具 举报

ID:462827 发表于 2020-2-28 10:01 | 显示全部楼层
这个不就是TM1638自带的例程?!
回复

使用道具 举报

ID:372579 发表于 2020-3-12 10:13 | 显示全部楼层
非常感谢,刚好再找呢,谢谢
回复

使用道具 举报

ID:198286 发表于 2020-3-14 15:00 | 显示全部楼层
模块早买了,商家程序也给了,就是不会点
回复

使用道具 举报

ID:518869 发表于 2020-6-28 14:15 | 显示全部楼层
这个读函数 DIO=1设置为输入,是啥意思呢?
unsigned char TM1638_Read(void)                                        //读数据函数
{
        unsigned char i;
        unsigned char temp=0;
        DIO=1;        //设置为输入
        for(i=0;i<8;i++)
        {
                temp>>=1;
                CLK=0;
                if(DIO)
                        temp|=0x80;
                CLK=1;
        }
        return temp;
}
回复

使用道具 举报

ID:593106 发表于 2021-3-13 00:03 | 显示全部楼层
12MHZ晶振,跑在1T的单片机会有错误,跑在12T单片机正常
回复

使用道具 举报

ID:593106 发表于 2021-3-13 00:06 | 显示全部楼层
lastreg 发表于 2020-6-28 14:15
这个读函数 DIO=1设置为输入,是啥意思呢?
unsigned char TM1638_Read(void)                             ...

单片机把DIO拉高,就是说对应管脚是单片机内部电阻在拉高,如果TM1638的DIO管脚输出电平为低,单片机对应bit为0,反之是1
回复

使用道具 举报

ID:5501 发表于 2021-4-14 23:39 | 显示全部楼层
51单片机IO 读 一般设置1 为输入
回复

使用道具 举报

ID:187802 发表于 2021-9-17 10:04 | 显示全部楼层
不错,刚好手上有个这片子的表头。
回复

使用道具 举报

ID:42615 发表于 2022-5-6 10:07 | 显示全部楼层
Write_oneLED(unsigned char num,unsigned char flag);
Write_allLED(unsigned char LED_flag) ;

这两个函数没有用吧?
回复

使用道具 举报

ID:1011444 发表于 2022-5-8 21:25 | 显示全部楼层
资料很有用,已下载看过了,谢谢分享!
回复

使用道具 举报

ID:884711 发表于 2022-8-6 13:51 | 显示全部楼层
zxy2266 发表于 2020-3-14 15:00
模块早买了,商家程序也给了,就是不会点

俺也是,反复的都是一样的全程,总是学到实际应用的技术,只想把每一个按键应用到各自的功能,LED发光管也能对应的显示不同的IO口状态。
回复

使用道具 举报

ID:884711 发表于 2022-8-21 07:44 | 显示全部楼层
void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函数,LED_flag表示各个LED状态
{
        unsigned char i;
        for(i=0;i<8;i++)
                {
                        if(LED_flag&(1<<i))
                                //Write_DATA(2*i+1,3);
                                Write_DATA(2*i+1,1);
                        else
                                Write_DATA(2*i+1,0);
                }
}
看了N多全程,这个LED显示都这么写的,总不会灵活应用
回复

使用道具 举报

ID:1081040 发表于 2023-8-1 20:37 | 显示全部楼层
void Write_allLED(u8 LED_flag)                                        //控制全部LED函数,LED_flag表示各个LED状态
{
        u8 i;
        for(i=0;i<8;i++)
                {
                        if(LED_flag&(1<<i))
                                {
                                //Write_DATA(2*i+1,3);
                                Write_DATA(2*i+1,1);
                                }
                        else
                                Write_DATA(2*i+1,0);
                }
}

这里报下面的警告要怎么 解决呐

main.c(32): warning C188: 'parameter 1': value truncated
回复

使用道具 举报

ID:433219 发表于 2023-8-3 19:37 | 显示全部楼层
1638 驱动10个数码管+3x8个按键,最优综合ic
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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