美文网首页ArduinoArduino动手做雕爷学编程
【雕爷学编程】Arduino动手做(102)---TM1638按

【雕爷学编程】Arduino动手做(102)---TM1638按

作者: 驴友花雕 | 来源:发表于2022-06-05 11:33 被阅读0次

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    实验一百零二:TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块

    0.jpg

    TM1638
    是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动、键盘扫描等电路。本模块质量可靠、稳定性好、抗干扰能力强。主要应用于冰箱、空调 、家庭影院等产品的高段位显示屏驱动。

    01-1.jpg

    TM1638
    1、采用CMOS 工艺
    2、显示模式 10段×8 位
    3、键扫描(8×3bit)
    4、辉度调节电路(占空比8 级可调)
    5、串行接口(CLK,STB,DIO)
    6、振荡方式:RC 振荡
    7、内置上电复位电路
    8、封装形式:SOP28

    02 (1).jpg 02.jpg 02-1.jpg 02-2.jpg 02-3.jpg 02-4.jpg 02-5.jpg

    模块功能介绍,包括以下资源:

    1、8个按键,

    2、8个LED

    3、8位数码管,共阴极LED数码管;

    4、可以和STC等单片机直接连接;

    5、开始实验ardiuno驱动程序

    06 (1).jpg

    模块电原理图

    05.jpg 05-.jpg 05--.jpg

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

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


    09 (1).jpg 10.jpg

    实验程序一:TM1638模块的演示文件库(LED和键)

    (1)Arduino参考开源代码

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验一百零二: TM1638按键数码管LED显示模组8位数码管\LED\按键智控模块
    
    1、安装库:IDE-工具-管理库-搜索TM1638plus-安装
    
    2、项目:TM1638模块的演示文件库(LED和键)
    
    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;
    
      }
    
    }
    

    (2)实验场景图


    11.jpg

    实验程序二:自锁LED,按键计数器

    (1)Arduino参考开源代码

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验一百零二: 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);
    
    }
    

    (2)实验场景图


    12.jpg

    相关文章

      网友评论

        本文标题:【雕爷学编程】Arduino动手做(102)---TM1638按

        本文链接:https://www.haomeiwen.com/subject/rskrmrtx.html