標(biāo)題: 基于Arduino做的TM1638的電子計(jì)時(shí)練習(xí)程序,可調(diào)亮度 [打印本頁(yè)]

作者: Daijt    時(shí)間: 2021-8-27 17:52
標(biāo)題: 基于Arduino做的TM1638的電子計(jì)時(shí)練習(xí)程序,可調(diào)亮度
程序主題不長(zhǎng),本人萌新,制作了一個(gè)計(jì)時(shí)程序。
程序是利用Arduino軟件寫的,板子是Arduino UNO, 還有TM1638,8位數(shù)碼管。

該程序會(huì)從1數(shù)到100000,按鍵也可以使用,按第一個(gè)按鍵會(huì)使亮度降低,第二個(gè)會(huì)使亮度增高,亮度會(huì)利用數(shù)字上方的led燈顯示,共8級(jí)。
其余的按鍵則不會(huì)有用。
改程序并不長(zhǎng),寫法比較直白。程序?qū)?huì)列在下方,并有附件。謝謝大家。



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    時(shí)間: 2022-5-1 17:42
我的軟件燒上去后,上傳有錯(cuò)誤信息
作者: Tianxiayou    時(shí)間: 2022-5-5 11:33
我裝上去的這個(gè)軟件顯示錯(cuò)誤
作者: Tianxiayou    時(shí)間: 2022-5-5 11:34
我裝上去的這個(gè)軟件顯示錯(cuò)誤
作者: Tianxiayou    時(shí)間: 2022-5-5 11:42
下載不了 請(qǐng)問(wèn)怎樣下載
作者: heicad    時(shí)間: 2022-5-5 18:32
Tianxiayou 發(fā)表于 2022-5-5 11:42
下載不了 請(qǐng)問(wèn)怎樣下載

還下載干什么?直接復(fù)制粘貼代碼到編譯器不是一樣嗎?
樓主說(shuō)了附件里面就是以上代碼,所以根本不需要下載

你估計(jì)沒(méi)有樓主的板子吧,你把代碼從網(wǎng)頁(yè)上復(fù)制粘貼過(guò)去后,需要更改io端口為你自己的板子的電路連接
作者: bboroo    時(shí)間: 2022-12-20 10:38
用ESP8266  NODEMCU的板子試過(guò),只要把對(duì)應(yīng)的接線口修改一下就能正常運(yùn)行,謝謝樓主,剛好想找TM1638調(diào)節(jié)亮度的程序。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1