找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4546|回复: 6
收起左侧

基于Arduino做的TM1638的电子计时练习程序,可调亮度

[复制链接]
ID:962653 发表于 2021-8-27 17:52 | 显示全部楼层 |阅读模式
程序主题不长,本人萌新,制作了一个计时程序。
程序是利用Arduino软件写的,板子是Arduino UNO, 还有TM1638,8位数码管。

该程序会从1数到100000,按键也可以使用,按第一个按键会使亮度降低,第二个会使亮度增高,亮度会利用数字上方的led灯显示,共8级。
其余的按键则不会有用。
改程序并不长,写法比较直白。程序将会列在下方,并有附件。谢谢大家。

tm1638.jpg

Arduino源程序如下:
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
const int TM1638_STB = 7;
const int TM1638_CLK = 9;
const int TM1638_DIO = 8;

int brightness=0x88;                         //set light,0x88-0x8f
int Led_light=1;
//----------------------------------------------------------------
void writeByte(int value)
{
  unsigned char i;
  pinMode(TM1638_DIO,OUTPUT);
  for(i=0;i<8;i++)
  {
     digitalWrite(TM1638_CLK,LOW);
     if(value&0X01){
       digitalWrite(TM1638_DIO,HIGH);
     }
     else{
       digitalWrite(TM1638_DIO,LOW);
     }
     value>>=1;
     digitalWrite(TM1638_CLK,HIGH);
  }
  digitalWrite(TM1638_CLK,LOW);
}
//-----------------------------------------------------------------------
void sendCommand(uint8_t value)
{
  digitalWrite(TM1638_STB, LOW);
  writeByte(value);
  digitalWrite(TM1638_STB, HIGH);
}
//------------------------------------------------------------------------
void reset()
{
  sendCommand(0x40);                         // set auto increment mode
  digitalWrite(TM1638_STB, LOW);
  writeByte(0xc0);                           // set starting address to 0
  for(uint8_t i = 0; i < 8; i++)
  {
    writeByte(0x00);
  }
  digitalWrite(TM1638_STB, HIGH);
}
//---------------------------------------------------------------------
void setup()
{
//Serial.begin(9600);                     // 初始化串口
  pinMode(TM1638_STB, OUTPUT);
  pinMode(TM1638_CLK, OUTPUT);
  pinMode(TM1638_DIO, OUTPUT);
  reset();
  sendCommand(brightness);
}
//---------------------------------------------------------------------
void loop()
{
  for(int i = 0;i < 10000000; i++)
  {
    showNumber(i);
    //------------------------------
    buttonLoop();
    //------------------------------
    brightnessSet();
  }
}
//--------------------------------------------------------------------------
int readByte(void)                            //read a byte.
{
  unsigned char i;
  int value=0;;
  pinMode(TM1638_DIO,INPUT);                  //set input mode.
  for(i=0;i<8;i++)
  {
    value>>=1;
    digitalWrite(TM1638_CLK,LOW);
    delay(1);                                 
    if(digitalRead(TM1638_DIO)==HIGH)
      value|=0x80;
    digitalWrite(TM1638_CLK,HIGH);
  }
  digitalWrite(TM1638_CLK,LOW);
  pinMode(TM1638_DIO,OUTPUT);//set output mode.
  return value;
}
//--------------------------------------------------------------------------
int readButtons(void)
{
  int buttons = 0;
  digitalWrite(TM1638_STB, LOW);
  pinMode(TM1638_DIO, OUTPUT);
  shiftOut(TM1638_DIO, TM1638_CLK, LSBFIRST, 0x42);
  pinMode(TM1638_DIO, INPUT);
  for (uint8_t i = 0; i < 4; i++)
  {
    int v = readByte() << i;
    buttons |= v;
  }
  pinMode(TM1638_DIO, OUTPUT);
  digitalWrite(TM1638_STB, HIGH);
  return buttons;
}
//--------------------------------------------------------------------------
void setLed(int value, int position)
{
  pinMode(TM1638_DIO, OUTPUT);
  sendCommand(0x44);
  digitalWrite(TM1638_STB, LOW);
  writeByte(0xC1 + (position << 1));
  writeByte(value);
  digitalWrite(TM1638_STB, HIGH);
}
//-----------------------------------------------------------------------
void showNumber(int number)
{
  const int digital[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
  int pos = 7;
  while(pos >=0){
    digitalWrite(TM1638_STB, LOW);
    writeByte(0xc0 + pos * 2);
    if(number > 0){
      int dig = number % 10;
      writeByte(digital[dig]);
      number /= 10;
    }
    else{
      writeByte(0);
    }
    digitalWrite(TM1638_STB, HIGH);
    pos--;
  }
}
//------------------------------------------------------------------
void buttonLoop()
{
  int buttons = readButtons();
  int  xx;
  for(int position = 0; position < 8; position++)
  {
    int mask = 0x01 << position;
  setLed(buttons & mask ? 1 : 0 , position);    // ?前面条件为真,取:前面的1
  switch(brightness)
      {
       case 0x88:
                setLed(1 , 8);
       break;         
       case 0x89:
                setLed(1 , 8);setLed(1 , 1);
       break;
       case 0x8a:
                setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);
       break;
       case 0x8b:
                setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);
       break;
       case 0x8c:
                setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);
       break;
       case 0x8d:
                setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);setLed(1 , 5);
       break;
       case 0x8e:
                setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);setLed(1 , 5);setLed(1 , 6);
       break;
       case 0x8f:
                setLed(1 , 8);setLed(1 , 1);setLed(1 , 2);setLed(1 , 3);setLed(1 , 4);setLed(1 , 5);setLed(1 , 6);setLed(1 , 7);
       break;
       }
  }
}
//------------------------------------------------------------------
void brightnessSet()
{
  int buttons = readButtons();
    switch(buttons)
    {
    case 1:
          if   (brightness > 0x88)
          {
          brightness--;
          sendCommand(brightness);
          }
          else brightness = 0x88;
          delay(200);
    break;
    case 2:
          if   (brightness < 0x8f)
          {
            brightness++;
          sendCommand(brightness);
          }
          else brightness = 0x8f;
          delay(200);
    break;
    }
}  

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1022586 发表于 2022-5-1 17:42 来自手机 | 显示全部楼层
我的软件烧上去后,上传有错误信息
回复

使用道具 举报

ID:1022586 发表于 2022-5-5 11:33 来自手机 | 显示全部楼层
我装上去的这个软件显示错误
回复

使用道具 举报

ID:1022586 发表于 2022-5-5 11:34 来自手机 | 显示全部楼层
我装上去的这个软件显示错误
回复

使用道具 举报

ID:1022586 发表于 2022-5-5 11:42 来自手机 | 显示全部楼层
下载不了 请问怎样下载
回复

使用道具 举报

ID:262 发表于 2022-5-5 18:32 | 显示全部楼层
Tianxiayou 发表于 2022-5-5 11:42
下载不了 请问怎样下载

还下载干什么?直接复制粘贴代码到编译器不是一样吗?
楼主说了附件里面就是以上代码,所以根本不需要下载

你估计没有楼主的板子吧,你把代码从网页上复制粘贴过去后,需要更改io端口为你自己的板子的电路连接
回复

使用道具 举报

ID:634587 发表于 2022-12-20 10:38 | 显示全部楼层
用ESP8266  NODEMCU的板子试过,只要把对应的接线口修改一下就能正常运行,谢谢楼主,刚好想找TM1638调节亮度的程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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