Translate

2023年11月29日 星期三

arduino使用七段顯示器,腳位使用可以簡化程式碼並使用PORT暫存器直接一次將值送給七段

unsigned long time_delay=0;
byte state_7=0;
byte segCount=0;
//共陽極 dp a b c d e f g
byte seven_seg_digits[10] = {0b00000001,  // = 0
                             0b01001111,  // = 1
                             0b00010010,  // = 2
                             0b00000110,  // = 3
                             0b01001100,  // = 4
                             0b00100100,  // = 5
                             0b00100000,  // = 6
                             0b00001111,  // = 7
                             0b00000000,  // = 8
                             0b00000100   // = 9
                             };

void setup() {                
  pinMode(2, OUTPUT);   //a
  pinMode(3, OUTPUT);  //b
  pinMode(4, OUTPUT); //c
  pinMode(5, OUTPUT); //d
  pinMode(6, OUTPUT); //e
  pinMode(7, OUTPUT); //f
  pinMode(8, OUTPUT); //g
}
    
void sevenSegWrite(byte digit) {  //顯示特定數字的副程式
  byte pin = 2;  //我們的七段顯示是從pin2開始的
  for (byte i = 0; i < 7;i++) {
    digitalWrite(pin+i, (seven_seg_digits[digit]>>(6-i))&0b00000001);
  }
}

void loop() {
  //數字從9開始倒數,每個數字間隔1秒
  if (state_7==0)
  {
    sevenSegWrite(segCount);
    time_delay=millis();
    state_7=1;
  }
  else
  {
    if((millis()-time_delay)>1000)
    {
      state_7=0;
      
      if(segCount==9)
      {
        segCount=0;
      }
      else
      {
        segCount++;
      }
    }
  }

}

unsigned long time_delay=0;
byte state_7=0;
byte segCount=0;
//共陽極 dp a b c d e f g
byte seven_seg_digits[10] = {0b00000001,  // = 0
                             0b01001111,  // = 1
                             0b00010010,  // = 2
                             0b00000110,  // = 3
                             0b01001100,  // = 4
                             0b00100100,  // = 5
                             0b00100000,  // = 6
                             0b00001111,  // = 7
                             0b00000000,  // = 8
                             0b00000100   // = 9
                             };

void setup() {    
  DDRD=0x7f;//設定0~7腳為輸出
}
void loop() {
  //數字從9開始倒數,每個數字間隔1秒
  if (state_7==0)
  {
    PORTD=seven_seg_digits[segCount];
    time_delay=millis();
    state_7=1;
  }
  else
  {
    if((millis()-time_delay)>1000)
    {
      state_7=0;
      
      if(segCount==9)
      {
        segCount=0;
      }
      else
      {
        segCount++;
      }
    }
  }

}

利用tinkercad模擬arduino控制LCD自建字型

 參考網站:臺南市教育局科技教育網-自建字型





#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(32,16,2);
 
byte yearChar[8]={B01000,B11111,B00010,B01111,B01010,B11111,B00010,B00000};
byte moonChar[8]={B01111,B01001,B01111,B01001,B01111,B01001,B11101,B00000};
byte dayChar[8]={B01111,B01001,B01001,B01111,B01001,B01001,B01111,B00000};
int years=2023;
byte moons=11;
byte days=29;
void setup() 
{
  lcd.init();
  lcd.backlight(); 
  lcd.createChar(0,yearChar);
  lcd.createChar(1,moonChar);
  lcd.createChar(2,dayChar);  
}   
void loop() 
{
  lcd.setCursor(0,0);
  lcd.print(years);
  lcd.write(byte(0)); 
  lcd.print(moons);
  lcd.write(byte(1));
  lcd.print(days);
  lcd.write(byte(2));
}