楼主: eagler8

[经验] 【Arduino】108种传感器模块系列实验(106)---TM1638按键数码管

[复制链接]
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 16:48 | 显示全部楼层
    模块电原理图

    05.jpg
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 16:50 | 显示全部楼层
    05-.jpg
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 16:51 | 显示全部楼层
    05--.jpg
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 16:54 | 显示全部楼层
    该模块所用芯片为TM1638,集合了单片机常见外围电路,最大特点是只需占用单片机三个IO口即可驱动,扫描显示和按键扫描不需要单片机干预,只需要读写相关寄存器送显示数据或检测按键,节省MCU资源。试想下,我们平时使用单片机外接8个LED,8位数码管,8个按键这需占用多少个IO口,远不止3个IO口吧,但用这个模块就可以实现。经实际应用,按键灵敏显示效果良好。

    接线方法:
    VCC GND接5V电源, STB CLK DIO接单片机IO口。

    09 (1).jpg

  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 16:57 | 显示全部楼层
    本帖最后由 eagler8 于 2019-9-6 05:03 编辑

    07 (1).jpg

    10.jpg
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 17:47 | 显示全部楼层
    [mw_shl_code=arduino,true]/*
    【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
    实验一百零六: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
    1、安装库:IDE-工具-管理库-搜索TM1638plus-安装
    2、项目:TM1638模块的演示文件库(LED和键)
    《作者:加文·莱昂斯(Gavin Lyons)》
    3、接脚:
    VCC  → 5V
    GND → GND
    STROBE_TM  D4
    CLOCK_TM   D6
    DIO_TM     D7
    */

    #include <TM1638plus.h>

    // GPIO I/O pins on the Arduino connected to strobe, clock, data,
    //pick on any I/O you want.
    #define  STROBE_TM 4
    #define  CLOCK_TM 6
    #define  DIO_TM 7

    //Constructor object
    TM1638plus tm(STROBE_TM, CLOCK_TM , DIO_TM);


    void setup() {
       // Test 0 reset test
       tm.setLED(0, 1);
       delay(1000);
       tm.reset();
      
      // Test 1  Brightness and reset
       for (uint8_t brightness = 0; brightness < 8; brightness++)
       {
              tm.brightness(brightness);
              tm.displayText("00000000");
              delay(1500);
       }
       tm.reset();
       
       // restore default brightness
       tm.brightness(0x02);
      
       //Test 2 ASCII display 2.348
       
       tm.displayASCIIwDot(0, '2');
       tm.displayASCII(1, '3');
       tm.displayASCII(2, '4');
       tm.displayASCII(3, '8');
       delay(2000);
      
       //TEST 3 single segment
       //In this case  segment g (middle dash) of digit position 7
       tm.display7Seg(7,0b01000000);
       delay(2000);
       
       // Test 4 Hex digits.
       tm.displayHex(0, 1);
       tm.displayHex(1, 2);
       tm.displayHex(2, 3);
       tm.displayHex(3, 4);
       tm.displayHex(4, 5);
       tm.displayHex(5, 6);
       tm.displayHex(6, 7);
       tm.displayHex(7, 8);
       delay(2000);
       tm.displayHex(0, 8);
       tm.displayHex(1, 9);
       tm.displayHex(2, 10);
       tm.displayHex(3, 11);
       tm.displayHex(4, 12);
       tm.displayHex(5, 13);
       tm.displayHex(6, 14);
       tm.displayHex(7, 15);
       delay(2000);

       // Test 5 TEXT  with dec point
       // abcdefgh with decimal point for c and d
       tm.displayText("abc.d.efgh");
       delay(3000);
       
       // Test6  TEXT + ASCII combo
       // ADC=2.548
       char text1[]= "ADC=.";
       tm.displayText(text1);
       tm.displayASCIIwDot(4, '2');
       tm.displayASCII(5, '5');
       tm.displayASCII(6, '4');
       tm.displayASCII(7, '8');
       delay(2000);
      
       //Test 7 buttons and LED test
       tm.displayText("EAGLER8 ");
    }


    void loop() {
       uint8_t buttons = tm.readButtons();
       doLEDs(buttons);
    }

    // scans the individual bits of value
    void doLEDs(uint8_t value) {
      for (uint8_t position = 0; position < 8; position++) {
        tm.setLED(position, value & 1);
        value = value >> 1;
      }
    }[/mw_shl_code]
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 17:49 | 显示全部楼层
    11.jpg
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 18:29 | 显示全部楼层
    [mw_shl_code=arduino,true]/*
    【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
    实验一百零六: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
    1、安装库:IDE-工具-管理库-搜索TM1638-安装
    2、项目:自锁LED,按键计数器
    3、接脚:
    VCC  → 5V
    GND → GND
    STROBE_TM  D4
    CLOCK_TM   D6
    DIO_TM     D7
    */

    #define        DATA_COMMAND        0X40
    #define        DISP_COMMAND        0x80
    #define        ADDR_COMMAND        0XC0

    //TM1638模块引脚定义
    int DIO = 7;
    int CLK = 6;
    int STB = 4; //这里定义了那三个脚
    //共阴数码管显示代码
    unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
                               0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
    unsigned char num[8];                //各个数码管显示的值                     
    void setup ()
    {
      pinMode(STB,OUTPUT);
      pinMode(CLK,OUTPUT);
      pinMode(DIO,OUTPUT); //让三个脚都是输出状态
    }
    void loop()
        {
            unsigned char i;
            init_TM1638();                                   //初始化TM1638
            for(i=0;i<8;i++)
            Write_DATA(i<<1,tab[0]);                       //初始化寄存器       
            while(1)
            {
                    i=Read_key();                          //读按键值
                    if(i<8)
                    {
                      num++;
                      while(i==Read_key());                       //等待按键释放
                      if(num>15)
                      num=0;
                      Write_DATA(i*2,tab[num]);
                      Write_allLED(1<<i);
                    }
            }
    }



    void TM1638_Write(unsigned char        DATA)                        //写数据函数
    {
            unsigned char i;
            pinMode(DIO,OUTPUT);
            for(i=0;i<8;i++)
            {
                digitalWrite(CLK,LOW);
                if(DATA&0X01)
                   digitalWrite(DIO,HIGH);
                else
                   digitalWrite(DIO,LOW);
                DATA>>=1;
                digitalWrite(CLK,HIGH);
            }
    }
    unsigned char TM1638_Read(void)                                        //读数据函数
    {
            unsigned char i;
            unsigned char temp=0;;       
            pinMode(DIO,INPUT);//设置为输入
            for(i=0;i<8;i++)
            {
                  temp>>=1;
                digitalWrite(CLK,LOW);
                  if(digitalRead(DIO)==HIGH)
                    temp|=0x80;
                digitalWrite(CLK,HIGH);
                   
            }
            return temp;
    }
    void Write_COM(unsigned char cmd)                //发送命令字
    {
            digitalWrite(STB,LOW);
            TM1638_Write(cmd);
            digitalWrite(STB,HIGH);
    }
    unsigned char Read_key(void)
    {
            unsigned char c[4],i,key_value=0;
            digitalWrite(STB,LOW);
            TM1638_Write(0x42);                           //读键扫数据 命令
            for(i=0;i<4;i++)               
              {
                c=TM1638_Read();
            }
            digitalWrite(STB,HIGH);                                                   //4个字节数据合成一个字节
            for(i=0;i<4;i++)
            {
                key_value|=c<<i;
            }       
            for(i=0;i<8;i++)
            {
                if((0x01<<i)==key_value)
                break;
            }
            return i;
    }
    void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址写入数据
    {
            Write_COM(0x44);
            digitalWrite(STB,LOW);
            TM1638_Write(0xc0|add);
            TM1638_Write(DATA);
            digitalWrite(STB,HIGH);
    }
    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,1);
                else
                  Write_DATA(2*i+1,0);
            }
    }

    //TM1638初始化函数
    void init_TM1638(void)
    {
            unsigned char i;
            Write_COM(0x8b);       //亮度 (0x88-0x8f)8级亮度可调
            Write_COM(0x40);       //采用地址自动加1
            digitalWrite(STB,LOW);                           //
            TM1638_Write(0xc0);    //设置起始地址
            for(i=0;i<16;i++)           //传送16个字节的数据
              TM1638_Write(0x00);
            digitalWrite(STB,HIGH);
    }
    [/mw_shl_code]
  • TA的每日心情
    开心
    2020-8-10 09:31
  • 签到天数: 416 天

    [LV.9]以坛为家II

     楼主| 发表于 2019-9-5 18:30 | 显示全部楼层
    12.jpg
  • TA的每日心情
    开心
    2020-6-4 13:14
  • 签到天数: 64 天

    [LV.6]常住居民II

    发表于 2019-9-6 10:38 | 显示全部楼层
    收藏,我的板子买很多年了,最后我发现二极管没焊,所以一直没点亮
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    未见过的TFT屏,是什么驱动芯片?
    未见过的TFT屏,是什么驱
    这两块屏是从POS机里拆的,准备做几个锂电池组电压监测,在网上没找到资料,在这里问
    win10系统显示不出端口信息,编译后显示serial port not selected。
    win10系统显示不出端口信
    求各位哥哥帮忙,小兄弟实在不懂是win10系统的原因,还是需要安装什么驱动程式?具体
    更智能的电脑远程开关机-基于继电器
    更智能的电脑远程开关机-
    我只是刚刚入门的萌新,所以有不足请指出 先展示下 功能:开关机,开关机检测,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表