这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】+Arduino驱动TM1638模块

共2条 1/1 1 跳转至

【换取手持数字示波器】+Arduino驱动TM1638模块

专家
2024-06-10 21:46:27   被打赏 28 分(兑奖)     打赏

     Arduino应用相对于单片机开发人员来讲并不陌生,现在许多MCU厂商设计开发板都会预留相对应的Arduino接口,管脚分布非常规范。适合Arduino应用开发有许多芯片型号,可以从Arduino IDE中可查询,本次讲解是以ATMEGA328P做为Arduino UNO主控,通过杜邦线与TM1638按键控制数码管显示模块进行通讯。

      关于ATMEGA328P型与Arduino UNO端口引脚对应图见如下:

管脚分布.png    在使用该开发板前,我们当然得先安装arduino-ide,这里笔者安装的版本如下:

版本.png

      TM1638模块带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调、家庭影院等产品的高段位显示屏驱动。

TM1638模块特性如下:

  • 采用功率CMOS 工艺

  • 显示模式 10 段×8 位

  • 键扫描(8×3bit)

  • 辉度调节电路(占空比8 级可调)

  • 串行接口(CLK,STB,DIO)

  • 振荡方式:RC 振荡(450KHz+5%)

  • 内置上电复位电路

  • 采用SOP28封装

    TM1638模块集成以下资源:

①、8个按键开关

②、8颗LED指示灯

③、8位数码管(共阴极LED数码管)

④、外部通讯扩展接口

模块实物.jpg

       TM1638模块的电路原理图如下:

TM1638电路原理图.png      启动Arduino IDE后需要在“工具”菜单栏下的“开发板管理器”中搜索“TM1638plus”,并点击安装。连接Arduino UNO开发板,选择“Arduino Uno”,并选择对应的串口。

安装TM1638plus库.png     编写Arduino驱动TM1638模块的程序,实现LED自锁,按键计数。Arduino UNO与TM1638模块的连线关系如下:

Arduino UNOTM1638模块
5VVCC
GNDGND
4
STB
6CLK
7
DIO

编写Arduino程序如下:

#include <TM1638plus.h>

#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;
  unsigned char num;

  init_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[i]=TM1638_Read();
  }
  digitalWrite(STB,HIGH);            //4个字节数据合成一个字节
  for(i=0;i<4;i++)
  {
    key_value|=c[i]<<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);
}

程序下载到Arduino NUO开发板中,然后通过TM1638模块上的按键进行操作,可成功点亮各数码管。

1.jpg2.jpg3.jpg   分享到最后,提供一下关于本次成功驱动TM1638模块Arduino源码与参考资料。

sketch_jun9a.zip

tm1638芯片数据手册.pdf

Arduino_URO端口与AtMega328p引脚对应图.doc



专家
2024-06-11 06:10:05     打赏
2楼

自己也能搞一台


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]