标题: 基于Arduino做的TM1638的电子计时练习程序,可调亮度 [打印本页]

作者: Daijt    时间: 2021-8-27 17:52
标题: 基于Arduino做的TM1638的电子计时练习程序,可调亮度
程序主题不长,本人萌新,制作了一个计时程序。
程序是利用Arduino软件写的,板子是Arduino UNO, 还有TM1638,8位数码管。

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



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;
    }
}  

作者: Tianxiayou    时间: 2022-5-1 17:42
我的软件烧上去后,上传有错误信息
作者: Tianxiayou    时间: 2022-5-5 11:33
我装上去的这个软件显示错误
作者: Tianxiayou    时间: 2022-5-5 11:34
我装上去的这个软件显示错误
作者: Tianxiayou    时间: 2022-5-5 11:42
下载不了 请问怎样下载
作者: heicad    时间: 2022-5-5 18:32
Tianxiayou 发表于 2022-5-5 11:42
下载不了 请问怎样下载

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

你估计没有楼主的板子吧,你把代码从网页上复制粘贴过去后,需要更改io端口为你自己的板子的电路连接
作者: bboroo    时间: 2022-12-20 10:38
用ESP8266  NODEMCU的板子试过,只要把对应的接线口修改一下就能正常运行,谢谢楼主,刚好想找TM1638调节亮度的程序。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1