Arduino Mega 2560 & CHH-144 範例

Development Board Program

Arduino Mega 2560 & CHH-144 範例

繼電器控制 範例 2-2-1 p7

int RY5V = A4;
void setup(){
  pinMode(RY5V, OUTPUT);
  digitalWrite(RY5V, LOW);
}

void loop(){
  digitalWrite(RY5V, HIGH);
  delay(100);
  digitalWrite(RY5V, LOW);
  delay(1000);
}

可變電阻控制蜂鳴器的頻率 範例 2-3-2 p10

int buzzer = A9;
int VR_pin = A0;
int VR_value = 0; 
void setup(){
  pinMode(buzzer, OUTPUT);
  pinMode(VR_pin, INPUT);
}

void loop(){
  VR_value = analogRead(VR_pin);
  digitalWrite(buzzer, HIGH);
  delay(VR_value);
  digitalWrite(buzzer, LOW);
  delay(VR_value);
}

七段顯示器-顯示4位數 範例 2-4-3 p19

#define CA1 30
#define CA2 31
#define CA3 32
int delayTime = 1; //延遲4毫秒
byte segs[7] = {2,3,4,5,6,7,8};
byte sSD[10][7] = { //七段顯示器數據,0表示低電阻也就 on,反之1代表 off
// f a b c d e g
  {0,0,0,0,0,0,1}, //0 
  {1,0,0,1,1,1,1}, //1
  {0,0,1,0,0,1,0}, //2
  {0,0,0,0,1,1,0}, //3
  {1,0,0,1,1,0,0}, //4
  {0,1,0,0,1,0,0}, //5
  {0,1,0,0,0,0,0}, //6
  {0,0,0,1,1,1,1}, //7
  {0,0,0,0,0,0,0}, //8
  {0,0,0,0,1,0,0}, //9
};


void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH); //不顯示小數點

  pinMode(CA1, OUTPUT);
  pinMode(CA2, OUTPUT);
  pinMode(CA3, OUTPUT);
  pinMode(A13, OUTPUT);
  digitalWrite(A13, LOW);
}

void loop() {
  for(unsigned int number = 0; number < 10000; number++){
    unsigned long startTime = millis();
    for(unsigned long elapsed = 0; elapsed < 300; elapsed = millis()-startTime){
      lightDigit1(number%10);
      delay(delayTime);
      lightDigit2((number/10)%10);
      delay(delayTime);
      lightDigit3((number/100)%10);
      delay(delayTime);
      lightDigit4((number/1000)%10);
      delay(delayTime);
    }
  }
}

void pickDigit(int x){ //透過 74LS138 解碼器讓第 x 位的七段顯示器亮
  // 參考 手冊 p29 真值表
  digitalWrite(CA1, HIGH);
  digitalWrite(CA2, HIGH);
  digitalWrite(CA3, HIGH);

  switch(x){
    case 1:
      digitalWrite(CA1, LOW);
      digitalWrite(CA2, LOW);
      digitalWrite(CA3, LOW);
      break;
    case 2:
      digitalWrite(CA1, HIGH);
      digitalWrite(CA2, LOW);
      digitalWrite(CA3, LOW);
      break;
    case 3:
      digitalWrite(CA1, LOW);
      digitalWrite(CA2, HIGH);
      digitalWrite(CA3, LOW);
      break;
    case 4:
      digitalWrite(CA1, HIGH);
      digitalWrite(CA2, HIGH);
      digitalWrite(CA3, LOW);
      break;
  }  
}

void lightDigit1(byte number){
  pickDigit(1);
  lightSegments(number);
}

void lightDigit2(byte number){
  pickDigit(2);
  lightSegments(number);
}

void lightDigit3(byte number){
  pickDigit(3);
  lightSegments(number);
}

void lightDigit4(byte number){
  pickDigit(4);
  lightSegments(number);
}

void lightSegments(byte number){
  for(int i = 0; i < 7; i++){
    digitalWrite(segs[i], sSD[number][i]);
  }
}

RGB LED 混光 範例 2-5-1(透過迴圈漸變顔色) p26

int redPin = 44;
int greenPin = 45;
int bluePin = 46;
int speed = 10;
void setup(){
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
}

void loop(){
  analogWrite(redPin, 255); // 關閉紅色
  analogWrite(greenPin, 255); // 關閉綠色
  analogWrite(bluePin, 255); // 關閉藍色
  for(int i = 0; i < 255; i++){ //紅色從最亮到最暗
    analogWrite(redPin, i);
    delay(speed);
  }
  delay(100);
  for(int i = 0; i < 255; i++){ //綠色從最亮到最暗
    analogWrite(greenPin, i);
    delay(speed);
  }
  delay(100);
    for(int i = 0; i < 255; i++){ //藍色從最亮到最暗
    analogWrite(bluePin, i);
    delay(speed);
  }
  delay(100);
}

8x8點矩陣顯示器 範例 2-6-1 p31

#define Ls138_A 30
#define Ls138_B 31
#define Ls138_C 32
#define R0 2
#define R1 3
#define R2 4
#define R3 5
#define R4 6
#define R5 7
#define R6 8
#define R7 9
#define rowSize 8
#define colSize 8
#define delayTime 300
#define data_A {0,0,0,1,1,0,0,0,\
                0,0,1,0,0,1,0,0,\
                0,0,1,0,0,1,0,0,\
                0,1,0,0,0,0,1,0,\
                0,1,1,1,1,1,1,0,\
                0,1,0,0,0,0,1,0,\
                0,1,0,0,0,0,1,0,\
                0,1,0,0,0,0,1,0 }
boolean wordArray[4][rowSize][colSize] = {data_A};
boolean led[rowSize][colSize];
byte rowPin[rowSize] = {R0,R1,R2,R3,R4,R5,R6,R7};
void setup(){
  pinMode(Ls138_A, OUTPUT);
  pinMode(Ls138_B, OUTPUT);
  pinMode(Ls138_C, OUTPUT);
  pinMode(R0, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(R3, OUTPUT);
  pinMode(R4, OUTPUT);
  pinMode(R5, OUTPUT);
  pinMode(R6, OUTPUT);
  pinMode(R7, OUTPUT);
  clearLed();
  pinMode(A14, OUTPUT);
  digitalWrite(A14, LOW);
}

void loop(){
  wordToLed(0);
  displayLed(led,1000);
}

void wordToLed(int n){
  for(int i = 0; i< rowSize; i++){
    for(int j = 0; j< colSize; j++){
      led[i][j] = wordArray[n][i][j];
    }
  }
}

void clearLed(){
  for(int i = 0; i < rowSize; i++){
    digitalWrite(rowPin[i], LOW);
  }
}

void displayLed(bool led[rowSize][colSize], int continueTime){
  for(int k = 0; k < continueTime; k++){
    for(int i = 0; i < colSize; i++){
      clearLed();
      low_74138pin(i);
      for(int j = 0; j < rowSize; j++){
        if(led[j][i] == 1)
          digitalWrite(rowPin[j], HIGH);
      }
    }
  }
}

void low_74138pin(int num){
  switch(num){
    case 0:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 1:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 2:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 3:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 4:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 5:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 6:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 7:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
  }
}

4位指撥開關 範例 2-7-1 p37

int DIPSWbase = 2;
int num = 4;
int DIPSWbase1 = 37; // 第一個指撥開關的 I/O 脚位
int DIPSW1state, DIPSW2state, DIPSW3state, DIPSW4state; //儲存指撥開關的狀態

void setup() {
  Serial.begin(9600);

  for(int i = DIPSWbase; i< DIPSWbase + num; i++){
    pinMode(i, OUTPUT);
  }
  for(int i = DIPSWbase1; i < DIPSWbase1 + num; i++){
    pinMode(i, INPUT_PULLUP);
  }
  pinMode(A15, OUTPUT);
  digitalWrite(A15, LOW);
}

void loop() {
  DIPSW1state = digitalRead(37); // 讀取指撥開關的狀態
  digitalWrite(2, DIPSW1state);  // 將指撥開關狀態寫進對應的led燈
  Serial.print("DIPSW1state: ");
  Serial.println(DIPSW1state);  // 在serial monitor 查看輸出 on = 0; off = 1;

  DIPSW2state = digitalRead(38);
  digitalWrite(3, DIPSW2state);

  DIPSW3state = digitalRead(39);
  digitalWrite(4, DIPSW3state);

  DIPSW4state = digitalRead(40);
  digitalWrite(5, DIPSW4state);
}

4位按鈕開關 範例 2-8-1 p41

int BTNbase = 6;
int num = 4;
int BTNbase1 = 33; // 第一個按鈕的 I/O 脚位
int BTN1state, BTN2state, BTN3state, BTN4state; //儲存按鈕的狀態
void setup() {
  Serial.begin(9600);
  for(int i = BTNbase; i < BTNbase + num; i++){
    pinMode(i, OUTPUT);
  }
  for(int i = BTNbase1; i < BTNbase1 + num; i++){
    pinMode(i, INPUT_PULLUP);
  }
  pinMode(A15, OUTPUT);
  digitalWrite(A15, LOW);
}

void loop() {
  BTN1state =  digitalRead(33); // 讀取開關的狀態
  digitalWrite(9, BTN1state); // 將開關狀態寫進對應的led燈
  // Serial.print("BTN1state: ");
  // Serial.println(BTN1state); // 在serial monitor 查看輸出 on = 0; off = 1;

  BTN2state =  digitalRead(34);
  digitalWrite(8, BTN2state);

  BTN3state =  digitalRead(35);
  digitalWrite(7, BTN3state);

  BTN4state =  digitalRead(36);
  digitalWrite(6, BTN4state);
}

4x4鍵盤 範例 2-9-1 p45

#include <Keypad.h>
const byte rows = 4;
const byte cols = 4;
char kb[rows][cols] = {
                        {'F','E','D','C'},
                        {'B','3','6','9'},
                        {'A','2','5','8'},
                        {'0','1','4','7'}
                      };
byte rowPins[rows] = {25,24,23,22};
byte colPins[cols] = {29,28,27,26};
Keypad customKeypad = Keypad(makeKeymap(kb), rowPins, colPins, rows, cols);

void setup(){
  Serial.begin(9600);
}

void loop(){
  char customKey = customKeypad.getKey();
  if(customKey){
    Serial.println(customKey);
  }
}

雙軸搖桿模組 範例 2-11-1 p49

int joyPinX = A1;
int joyPinY = A2;
int sw = A3;
int value = 0;
int xzero = 0;
int yzero = 0;
int swState = 0;
void setup(){
  Serial.begin(9600);
  pinMode(sw, INPUT_PULLUP);
  yzero = analogRead(joyPinY);
  xzero = analogRead(joyPinX);
}

void loop(){
  int x,y,value;
  value = analogRead(joyPinX);
  x = value - xzero;
  value = analogRead(joyPinY);
  y = value - yzero;
  swState = digitalRead(sw);
  Serial.print("X = ");
  Serial.print(x);
  Serial.print("; Y = ");
  Serial.print(y);
  Serial.print("; SW = ");
  Serial.print(swState);  
  Serial.println();
  delay(100);
}

LCD液晶模組 範例 2-12-1 p55

#include <LiquidCrystal.h>
LiquidCrystal lcd(49,48,47,43,42,41);
void setup(){
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("How are you?");
  lcd.setCursor(0,1);
  lcd.print("LCD testing!");
}

void loop(){
  lcd.noDisplay();
  delay(500);
  lcd.display();
  delay(500);
}

LCD與4x4鍵盤 範例 2-12-2 p56

#include <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(49,48,47,43,42,41);
const byte rows = 4;
const byte cols = 4;
char kb[rows][cols] = {
                        {'F','E','D','C'},
                        {'B','3','6','9'},
                        {'A','2','5','8'},
                        {'0','1','4','7'}
                      };
byte rowPins[rows] = {25,24,23,22};
byte colPins[cols] = {29,28,27,26};
Keypad customKeypad = Keypad(makeKeymap(kb), rowPins, colPins, rows, cols);

void setup(){
  lcd.begin(16, 2);
  lcd.print("KEY IN: ");
}

void loop(){
  lcd.setCursor(7, 0);
  char customKey = customKeypad.getKey();
  if(customKey){
    lcd.print(customKey);
  }
}

Arduino Mega 2560 & CHH-144 - 習題

由左而右跑馬燈,顯示Hello World (改成你的英文名字)

#define Ls138_A 30
  #define Ls138_B 31
  #define Ls138_C 32
  #define R0 2
  #define R1 3
  #define R2 4
  #define R3 5
  #define R4 6
  #define R5 7
  #define R6 8
  #define R7 9
  #define row_size 8
  #define col_size 8
  #define delay_time 300
  // Letter A
// Letter A
#define data_A {\
  0,0,0,1,1,0,0,0,\
  0,0,1,0,0,1,0,0,\
  0,0,1,0,0,1,0,0,\
  0,1,1,1,1,1,1,0,\
  0,1,0,0,0,0,1,0,\
  0,1,0,0,0,0,1,0,\
  1,1,0,0,0,0,1,1,\
  0,0,0,0,0,0,0,0\
}

// Letter B
#define data_B {\
  0,1,1,1,1,1,0,0,\
  0,1,0,0,0,0,1,0,\
  0,1,0,0,0,0,1,0,\
  0,1,1,1,1,1,0,0,\
  0,1,0,0,0,0,1,0,\
  0,1,0,0,0,0,1,0,\
  0,1,1,1,1,1,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter C
#define data_C { \
  0,0,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,1,\
  0,0,1,1,1,1,1,0\
}

// Letter D
#define data_D { \
  0,1,1,1,1,1,1,0,\
  0,1,0,0,0,0,1,0,\
  0,1,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,1,\
  0,1,0,0,0,0,1,0,\
  0,1,1,1,1,1,1,0\
}

// Letter E
#define data_E { \
  0,1,1,1,1,1,1,1,\
  0,1,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  0,1,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  0,1,1,1,1,1,1,1,\
  0,0,0,0,0,0,0,0\
}

// Letter F
#define data_F { \
  0,1,1,1,1,1,1,1,\
  0,1,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  0,1,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter G
#define data_G { \
  0,0,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,1,1,1,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,1,\
  0,0,1,1,1,1,1,0\
}

// Letter H
#define data_H { \
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,1,1,1,1,1,1,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  0,0,0,0,0,0,0,0\
}

// Letter I
#define data_I { \
  0,0,1,1,1,1,1,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,1,1,1,1,1,0,\
  0,0,0,0,0,0,0,0\
}

// Letter J
#define data_J { \
  0,0,1,1,1,1,1,1,\
  0,0,0,0,0,1,1,0,\
  0,0,0,0,0,1,1,0,\
  0,0,0,0,0,1,1,0,\
  0,0,0,0,0,1,1,0,\
  1,0,0,0,0,1,0,0,\
  0,1,1,1,1,0,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter K
#define data_K { \
  1,0,0,0,0,0,1,0,\
  1,0,0,0,0,1,0,0,\
  1,0,0,0,1,0,0,0,\
  1,0,0,1,0,0,0,0,\
  1,0,1,0,0,0,0,0,\
  1,1,0,1,0,0,0,0,\
  1,0,0,0,1,0,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter L
#define data_L { \
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,1,1,1,1,1,1,1,\
  0,0,0,0,0,0,0,0\
}

// Letter M
#define data_M { \
  1,0,0,0,0,0,0,1,\
  1,1,0,0,0,0,1,1,\
  1,0,1,0,0,1,0,1,\
  1,0,0,1,1,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  0,0,0,0,0,0,0,0\
}

// Letter N
#define data_N { \
  1,0,0,0,0,0,0,1,\
  1,1,0,0,0,0,0,1,\
  1,0,1,0,0,0,0,1,\
  1,0,0,1,0,0,0,1,\
  1,0,0,0,1,0,0,1,\
  1,0,0,0,0,1,0,1,\
  1,0,0,0,0,0,1,1,\
  0,0,0,0,0,0,0,0\
}


// Letter O
#define data_O { \
  0,0,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,1,\
  0,0,1,1,1,1,1,0\
}

// Letter P
#define data_P { \
  0,1,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,1,\
  0,1,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter Q
#define data_Q { \
  0,0,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  1,0,0,0,0,0,0,0,\
  0,1,0,0,0,1,0,1,\
  0,0,1,1,1,1,1,0\
}

// Letter R
#define data_R { \
  0,1,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,1,\
  0,1,1,1,1,1,1,0,\
  0,1,0,0,1,0,0,0,\
  0,1,0,0,0,1,0,0,\
  0,1,0,0,0,0,1,0,\
  0,0,0,0,0,0,0,0\
}

// Letter S
#define data_S { \
  0,0,1,1,1,1,1,0,\
  0,1,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,0,\
  0,0,1,1,1,1,1,0,\
  0,0,0,0,0,0,0,1,\
  0,0,0,0,0,0,0,1,\
  0,1,0,0,0,0,1,0,\
  0,0,1,1,1,1,0,0\
}

// Letter T
#define data_T { \
  0,1,1,1,1,1,1,1,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter U
#define data_U { \
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  0,1,0,0,0,0,0,1,\
  0,0,1,1,1,1,1,0\
}

// Letter V
#define data_V { \
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  0,1,0,0,0,0,1,0,\
  0,1,0,0,0,0,1,0,\
  0,0,1,0,0,1,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter W
#define data_W { \
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,0,0,0,0,1,\
  1,0,0,1,1,0,0,1,\
  0,1,1,0,0,1,1,0,\
  0,0,0,0,0,0,0,0\
}

// Letter X
#define data_X { \
  1,0,0,0,0,0,0,1,\
  0,1,0,0,0,0,1,0,\
  0,0,1,0,0,1,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,1,0,0,1,0,0,\
  0,1,0,0,0,0,1,0,\
  1,0,0,0,0,0,0,1\
}

// Letter Y
#define data_Y { \
  1,0,0,0,0,0,0,1,\
  0,1,0,0,0,0,1,0,\
  0,0,1,0,0,1,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,1,1,0,0,0,\
  0,0,0,0,0,0,0,0\
}

// Letter Z
#define data_Z { \
  1,1,1,1,1,1,1,1,\
  0,0,0,0,0,0,1,0,\
  0,0,0,0,0,1,0,0,\
  0,0,0,0,1,0,0,0,\
  0,0,0,1,0,0,0,0,\
  0,0,1,0,0,0,0,0,\
  0,1,0,0,0,0,0,0,\
  1,1,1,1,1,1,1,1\
}

  boolean word_array[36][row_size][col_size] = {data_A,data_B,data_C,data_D,data_E,
                                                data_F,data_G,data_H,data_I,data_J,
                                                data_K,data_L,data_M,data_N,data_O,
                                                data_P,data_Q,data_R,data_S,data_T,
                                                data_U,data_V,data_W,data_X,data_Y,data_Z};
  boolean led[row_size][col_size];
  byte row_pin [row_size] ={R0, R1, R2, R3, R4, R5, R6, R7};
  int namestring[6]={3,4,13,13,8,18 };  
void setup() {
  pinMode(Ls138_A, OUTPUT);
  pinMode(Ls138_B, OUTPUT);
  pinMode(Ls138_C, OUTPUT);
  pinMode(R0, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(R3, OUTPUT);
  pinMode(R4, OUTPUT);
  pinMode(R5, OUTPUT);
  pinMode(R6, OUTPUT);
  pinMode(R7, OUTPUT);
  clear_led();
  pinMode(A14, OUTPUT);
  digitalWrite(A14, LOW);
}

void loop() {
  for(int i=0; i < 6; i++){
    word_to_led(namestring[i]);
    display_led(led, 100);
  }
}

void word_to_led(int n){
  for(int i = 0; i< row_size; i++){
    for(int j = 0; j< col_size; j++){
      led[i][j]= word_array[n][j][i];
    }
  }
}
void clear_led(){
  for(int i = 0; i< row_size; i++){
    digitalWrite(row_pin[i], LOW);
  }
}
void display_led(boolean led[row_size][col_size], int continue_time){
  for(int moves = 0; moves <6; moves++){
    for (int k = 0; k< continue_time; k++){
      for(int i = 0; i< col_size; i++){
        clear_led();
        low_74138pin(i);
        for(int j = 0; j< row_size; j++){
          if(i+ moves <8){
            if (led[i+moves][j]==1){
              digitalWrite(row_pin[j], HIGH);
            }
          }
        }
      }  
    }
  }
}
void low_74138pin(int num){
  switch(num){
    case 0:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 1:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 2:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 3:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 4:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 5:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 6:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 7:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
  }
}

以4位按紐分別做為LED四位的加1減1按紐,利用4位指撥開關向上為加、向下為減。其中若0009,個位數再加1會進位變0010

  • 有接脚位衝突的問題
int num = 4;
int DIPSWbase1 = 37, BTNbase1 = 33; // 第一個按鈕以及指撥開關的 I/O 脚位
int DIPSW1state, DIPSW2state, DIPSW3state, DIPSW4state; //儲存指撥開關的狀態
int BTN1state, BTN2state, BTN3state, BTN4state; //儲存按鈕的狀態
int displayVal = 0; //記錄七段顯示器要顯示的值
int adjustVal = 0;//要調整的值
#define CA1 30
#define CA2 31
#define CA3 32
int delayTime = 1; //延遲4毫秒
byte segs[7] = {2,3,4,5,6,7,8};
// byte segs[7] = {11,12,13,14,15,16,17};
byte sSD[10][7] = { //七段顯示器數據
  {0,0,0,0,0,0,1}, //0
  {1,0,0,1,1,1,1}, //1
  {0,0,1,0,0,1,0}, //2
  {0,0,0,0,1,1,0}, //3
  {1,0,0,1,1,0,0}, //4
  {0,1,0,0,1,0,0}, //5
  {0,1,0,0,0,0,0}, //6
  {0,0,0,1,1,1,1}, //7
  {0,0,0,0,0,0,0}, //8
  {0,0,0,0,1,0,0}, //9
};

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH); //不顯示小數點

  pinMode(CA1, OUTPUT);
  pinMode(CA2, OUTPUT);
  pinMode(CA3, OUTPUT);
  pinMode(A13, OUTPUT);
  digitalWrite(A13, LOW);

  for(int i = BTNbase1; i < BTNbase1 + num; i++){
    pinMode(i, INPUT_PULLUP);
  }
  
  for(int i = DIPSWbase1; i < DIPSWbase1 + num; i++){
    pinMode(i, INPUT_PULLUP);
  }
  display7Seg(displayVal);
}

void loop() {

  //--------------------------------處理指撥開關
  DIPSW1state = digitalRead(37);
  digitalWrite(2, DIPSW1state);
  Serial.print("DIPSW1state: ");
  Serial.println(DIPSW1state);  // 在serial monitor 查看輸出 on = 0; off = 1;

  DIPSW2state = digitalRead(38);
  digitalWrite(3, DIPSW2state);

  DIPSW3state = digitalRead(39);
  digitalWrite(4, DIPSW3state);

  DIPSW4state = digitalRead(40);
  digitalWrite(5, DIPSW4state);

  //--------------------------------處理按鈕
  BTN1state =  digitalRead(33);
  digitalWrite(9, BTN1state);
  // Serial.print("BTN1state: ");
  // Serial.println(BTN1state); // 在serial monitor 查看輸出 on = 0; off = 1;

  BTN2state =  digitalRead(34);
  digitalWrite(8, BTN2state);

  BTN3state =  digitalRead(35);
  digitalWrite(7, BTN3state);

  BTN4state =  digitalRead(36);
  digitalWrite(6, BTN4state);


  //--------------------------------處理個別位數加減問題
   if (BTN4state == 0) { // 當按鈕4被按下 (個位數)
    adjustVal = (DIPSW1state == 0) ? 1 : -1; // 根據DIPSW4判斷加減
    displayVal += adjustVal;
    if (displayVal < 0) {
      displayVal += 10000; // 如果小於0,環繞到9999
    } else if (displayVal > 9999) {
      displayVal %= 10000; // 如果超過9999,環繞到0
    }
  }

  if (BTN3state == 0) { // 當按鈕3被按下 (十位數)
    adjustVal = (DIPSW2state == 0) ? 10 : -10; // 根據DIPSW3判斷加減
    displayVal += adjustVal;
    if (displayVal < 0) {
      displayVal += 10000; // 如果小於0,環繞到9999
    } else if (displayVal > 9999) {
      displayVal %= 10000; // 如果超過9999,環繞到0
    }
  }

  if (BTN2state == 0) { // 當按鈕2被按下 (百位數)
    adjustVal = (DIPSW3state == 0) ? 100 : -100; // 根據DIPSW2判斷加減
    displayVal += adjustVal;
    if (displayVal < 0) {
      displayVal += 10000; // 如果小於0,環繞到9999
    } else if (displayVal > 9999) {
      displayVal %= 10000; // 如果超過9999,環繞到0
    }
  }

  if (BTN1state == 0) { // 當按鈕1被按下 (千位數)
    adjustVal = (DIPSW4state == 0) ? 1000 : -1000; // 根據DIPSW1判斷加減
    displayVal += adjustVal;
    if (displayVal < 0) {
      displayVal += 10000; // 如果小於0,環繞到9999
    } else if (displayVal > 9999) {
      displayVal %= 10000; // 如果超過9999,環繞到0
    }
  }

  Serial.print("4-digit val: ");
  Serial.println(displayVal);

  //--------------------------------處理將displayVal在4位7段顯示器上輸出
  display7Seg(displayVal);
  delay(200);
}

void display7Seg(int number) {
    unsigned long startTime = millis();
    for(unsigned long elapsed = 0; elapsed < 300; elapsed = millis()-startTime){
      lightDigit1(number%10);
      delay(delayTime);
      lightDigit2((number/10)%10);
      delay(delayTime);
      lightDigit3((number/100)%10);
      delay(delayTime);
      lightDigit4((number/1000)%10);
      delay(delayTime);
    }
}

void pickDigit(int x){ //用來選定某個位數的顯示器
  digitalWrite(CA1, HIGH);
  digitalWrite(CA2, HIGH);
  digitalWrite(CA3, HIGH);

  switch(x){
    case 1:
      digitalWrite(CA1, LOW);
      digitalWrite(CA2, LOW);
      digitalWrite(CA3, LOW);
      break;
    case 2:
      digitalWrite(CA1, HIGH);
      digitalWrite(CA2, LOW);
      digitalWrite(CA3, LOW);
      break;
    case 3:
      digitalWrite(CA1, LOW);
      digitalWrite(CA2, HIGH);
      digitalWrite(CA3, LOW);
      break;
    case 4:
      digitalWrite(CA1, HIGH);
      digitalWrite(CA2, HIGH);
      digitalWrite(CA3, LOW);
      break;
  }  
}

void lightDigit1(byte number){
  pickDigit(1);
  lightSegments(number);
}

void lightDigit2(byte number){
  pickDigit(2);
  lightSegments(number);
}

void lightDigit3(byte number){
  pickDigit(3);
  lightSegments(number);
}

void lightDigit4(byte number){
  pickDigit(4);
  lightSegments(number);
}

void lightSegments(byte number){
  for(int i = 0; i < 7; i++){
    digitalWrite(segs[i], sSD[number][i]);
  }
  delay(1);
}

實作紅綠燈小綠人,使用按鈕開關,從右到左依序為紅黃綠,按下按鈕後,給出特定動作

  #define Ls138_A 30
  #define Ls138_B 31
  #define Ls138_C 32
  #define R0 2
  #define R1 3
  #define R2 4
  #define R3 5
  #define R4 6
  #define R5 7
  #define R6 8
  #define R7 9
  #define row_size 8
  #define col_size 8
  #define delay_time 300
  int BASE1 = 33;
  int DIPSW1state;
  int DIPSW2state;
  int DIPSW3state;
  int DIPSW4state;
// Number 0
#define data_Arrow { \
   0,0,0,1,1,1,0,0, \
   0,0,1,1,1,1,1,0, \
   0,1,1,1,1,1,1,1, \
   1,1,1,1,1,0,0,0, \
   1,1,1,1,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
}
#define data_empty { \
  0,0,0,0,1,1,0,0,\
  0,0,0,1,1,1,1,0,\
  0,0,0,0,1,1,0,0,\
  0,0,1,1,1,1,0,0,\
  0,1,0,1,1,0,1,0,\
  0,0,0,1,1,0,0,0,\
  0,0,1,0,0,1,0,0,\
  0,1,1,0,0,1,1,0,\
}
#define data_monster { \
   0,0,0,1,0,0,0,0, \
   0,0,1,1,1,0,0,0, \
   0,1,1,1,1,1,0,0, \
   1,1,1,1,1,1,1,0, \
   0,0,0,1,0,0,0,0, \
   0,0,0,1,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
}
#define data_s { \
   0,0,0,1,0,0,0,0, \
   0,0,1,1,1,0,0,0, \
   0,1,1,1,1,1,0,0, \
   1,1,1,1,1,1,1,0, \
   0,0,0,1,0,0,0,0, \
   0,0,0,1,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
}
#define data_rock { \
   0,0,0,1,0,0,0,0, \
   0,0,1,1,1,0,0,0, \
   0,1,1,1,1,1,0,0, \
   1,1,1,1,1,1,1,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
}
#define data_papper { \
   0,0,0,1,1,0,0,0, \
   0,0,1,0,0,1,0,0, \
   0,1,0,0,0,0,1,0, \
   0,1,0,0,0,0,1,0, \
   0,0,1,0,0,1,0,0, \
   0,0,0,1,1,0,0,0, \
   0,0,0,0,0,0,0,0, \
   0,0,0,0,0,0,0,0, \
}


  boolean word_array[36][row_size][col_size] = {data_empty, data_Arrow,data_monster, data_s, data_papper, data_rock};
  boolean led[row_size][col_size];
  byte row_pin [row_size] ={R0, R1, R2, R3, R4, R5, R6, R7};
void setup() {
  pinMode(Ls138_A, OUTPUT);
  pinMode(Ls138_B, OUTPUT);
  pinMode(Ls138_C, OUTPUT);
  pinMode(R0, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(R3, OUTPUT);
  pinMode(R4, OUTPUT);
  pinMode(R5, OUTPUT);
  pinMode(R6, OUTPUT);
  pinMode(R7, OUTPUT);
  clear_led();
  pinMode(A14, OUTPUT);
  digitalWrite(A14, LOW);
  for (int i= BASE1; i< BASE1+ 4; i++){
    pinMode(i, INPUT_PULLUP);
  }
}
int hex=0;
void loop() {
  hex=0;
  DIPSW1state = digitalRead(33);
  DIPSW2state = digitalRead(34);
  DIPSW3state = digitalRead(35);
  DIPSW4state = digitalRead(36);
  if(DIPSW1state== LOW){
    hex=1;
  }
  if(DIPSW2state== LOW){
    hex=2;
  }
  if(DIPSW3state== LOW){
    hex=3;
  }
  if(DIPSW4state== LOW){
    hex=4;
  }
  if (hex == 3){
    word_to_led(hex);
    display_led(led, 500, hex);
   
    word_to_led(hex+1);
    display_led(led, 500, hex);
   
    word_to_led(hex+2);
    display_led(led, 500, hex);
  }
  else{
    word_to_led(hex);
    display_led(led, 100, hex);
  }
 
}

void word_to_led(int n){
  for(int i = 0; i< row_size; i++){
    for(int j = 0; j< col_size; j++){
      led[i][j]= word_array[n][j][i];
    }
  }
}
void clear_led(){
  for(int i = 0; i< row_size; i++){
    digitalWrite(row_pin[i], LOW);
  }
}
void display_led(boolean led[row_size][col_size], int continue_time, int hex){
  if (hex <= 1){
  for(int moves = 0; moves <8; moves++){
    for (int k = 0; k< continue_time; k++){
      for(int i = 0; i< col_size; i++){
        clear_led();
        low_74138pin(i);
        for(int j = 0; j< row_size; j++){
          if(i- moves >=0){
            if (led[i-moves][j]==1){
              digitalWrite(row_pin[j], HIGH);
            }
          }
        }
      }  
    }
  }
  }else if(hex == 2){
    for(int moves = 0; moves <8; moves++){
    for (int k = 0; k< continue_time; k++){
      for(int i = 0; i< col_size; i++){
        clear_led();
        low_74138pin(i);
        for(int j = 0; j< row_size; j++){
          if(j- moves >=0){
            if (led[i][j-moves]==1){
              digitalWrite(row_pin[j], HIGH);
            }
          }
        }
      }  
    }
  }
  }else{
 
    for (int k = 0; k< continue_time; k++){
      for(int i = 0; i< col_size; i++){
        clear_led();
        low_74138pin(i);
        for(int j = 0; j< row_size; j++){
         
            if (led[i][j]==1){
              digitalWrite(row_pin[j], HIGH);
            }
         
        }
      }  
    }
  }
}

void low_74138pin(int num){
  switch(num){
    case 0:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 1:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 2:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 3:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 4:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 5:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 6:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 7:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
  }
}

8x8點矩陣亮㇐個燈,利用雙軸搖桿可控制上下左右

#define Ls138_A 30
#define Ls138_B 31
#define Ls138_C 32
#define R0 2
#define R1 3
#define R2 4
#define R3 5
#define R4 6
#define R5 7
#define R6 8
#define R7 9
#define rowSize 8
#define colSize 8
#define delayTime 300

boolean data_A[8][8] = {
                        {1,0,0,0,0,0,0,0}, // 初始點在左上角
                        {0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0}
                        };

boolean led[rowSize][colSize];
byte rowPin[rowSize] = {R0,R1,R2,R3,R4,R5,R6,R7};

int joyPinX = A1;
int joyPinY = A2;
int sw = A3;
int xzero = 0;
int yzero = 0;
int swState = 0;

int point[2] = {0, 0};

void setup(){
  Serial.begin(9600);
  pinMode(sw, INPUT_PULLUP);
  yzero = analogRead(joyPinY);
  xzero = analogRead(joyPinX);
  pinMode(Ls138_A, OUTPUT);
  pinMode(Ls138_B, OUTPUT);
  pinMode(Ls138_C, OUTPUT);
  pinMode(R0, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(R3, OUTPUT);
  pinMode(R4, OUTPUT);
  pinMode(R5, OUTPUT);
  pinMode(R6, OUTPUT);
  pinMode(R7, OUTPUT);
  clearLed();
  pinMode(A14, OUTPUT);
  digitalWrite(A14, LOW);
}

void loop(){
  int x, y, value;
  
  value = analogRead(joyPinX);
  x = value - xzero;
  value = analogRead(joyPinY);
  y = value - yzero;
  
  if (y < -100) {
    point[1] = (point[1] + 1) % colSize;
    delay(200); 
  }
  if (y > 100) {
    point[1] = (point[1] - 1 + colSize) % colSize;
    delay(200);
  }
  if (x > 100) {
    point[0] = (point[0] + 1) % rowSize;
    delay(200);
  }
  if (x < -100) {
    point[0] = (point[0] - 1 + rowSize) % rowSize;
    delay(200);
  }
  
  // 清空 data_A 並更新新位置
  resetDataA();
  data_A[point[0]][point[1]] = 1;  // 在新位置設置點

  updateLed();

  displayLed(led, 1);
}

void resetDataA() {
  for (int i = 0; i < rowSize; i++) {
    for (int j = 0; j < colSize; j++) {
      data_A[i][j] = 0;
    }
  }
}

void updateLed() {
  for (int i = 0; i < rowSize; i++) {
    for (int j = 0; j < colSize; j++) {
      led[i][j] = data_A[i][j];
    }
  }
}

void clearLed(){
  for(int i = 0; i < rowSize; i++){
    digitalWrite(rowPin[i], LOW);
  }
}

void displayLed(boolean led[rowSize][colSize], int continueTime){
  for(int k = 0; k < continueTime; k++){
    for(int i = 0; i < colSize; i++){
      clearLed();
      low_74138pin(i);
      for(int j = 0; j < rowSize; j++){
        if(led[j][i] == 1)
          digitalWrite(rowPin[j], HIGH);
      }
    }
  }
}

void low_74138pin(int num){
  switch(num){
    case 0:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 1:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, LOW);
      break;
    case 2:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 3:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, LOW);
      break;
    case 4:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 5:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, LOW);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 6:
      digitalWrite(Ls138_A, LOW);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
    case 7:
      digitalWrite(Ls138_A, HIGH);
      digitalWrite(Ls138_B, HIGH);
      digitalWrite(Ls138_C, HIGH);
      break;
  }
}

利用數字鍵與LCD做㇐個加減乘除的計算機

#include <Keypad.h>
#include <LiquidCrystal.h>

// 初始化LCD,使用 Arduino 的 49,48,47,43,42,41 來控制
LiquidCrystal lcd(49,48,47,43,42,41);

const byte rows = 4;
const byte cols = 4;

// 鍵盤的映射
char kb[rows][cols] = {
                        {'F','E','D','C'},
                        {'B','3','6','9'},
                        {'A','2','5','8'},
                        {'0','1','4','7'}
                      };

byte rowPins[rows] = {25,24,23,22};
byte colPins[cols] = {29,28,27,26};

// 初始化 Keypad
Keypad customKeypad = Keypad(makeKeymap(kb), rowPins, colPins, rows, cols);

// 全局變量來保存計算數據
String input1 = "";  // 儲存第一個數字
String input2 = "";  // 儲存第二個數字
char operation = 0;  // 儲存運算符
bool isSecondInput = false; // 判斷是否正在輸入第二個數字

void setup(){
  lcd.begin(16, 2);  // 初始化 LCD
  lcd.clear();
}

void loop(){
  char customKey = customKeypad.getKey();  // 獲取按鍵輸入

  if(customKey){
    if (customKey >= '0' && customKey <= '9') {  // 輸入數字
      if (isSecondInput) {
        input2 += customKey;  // 將數字追加到第二個輸入中
        lcd.print(customKey);
      } else {
        input1 += customKey;  // 將數字追加到第一個輸入中
        lcd.print(customKey);
      }
    } else if (customKey == 'A' || customKey == 'E' || customKey == 'D' || customKey == 'F') {  // 選擇運算符
      if (!isSecondInput && input1.length() > 0) {  // 確保已經有第一個數字
        operation = customKey;
        isSecondInput = true;  // 開始輸入第二個數字
        lcd.setCursor(1, 0);  // 將光標移到第二行
        char c;
        if (customKey == 'A')
          c = '+';
        else if (customKey == 'E')
          c = '-';
        else if (customKey == 'F')
          c = '*';
        else
          c = '/';
        lcd.print(c);
      }
    } else if (customKey == 'C') {  // 清空按鈕
      clearAll();
    } else if (customKey == 'B') {  // 等號,進行計算
      if (input1.length() > 0 && input2.length() > 0 && operation != 0) {
        calculateResult();
      }
    }
  }
}

// 清除所有輸入和顯示
void clearAll() {
  input1 = "";
  input2 = "";
  operation = 0;
  isSecondInput = false;
  lcd.clear();  // 清空 LCD 顯示
}

// 計算結果並顯示
void calculateResult() {
  float num1 = input1.toFloat();
  float num2 = input2.toFloat();
  float result = 0;

  switch (operation) {
    case 'A':  // 加法
      result = num1 + num2;
      break;
    case 'E':  // 減法
      result = num1 - num2;
      break;
    case 'D':  // 除法
      if (num2 != 0) {
        result = num1 / num2;
      } else {
        lcd.clear();
        lcd.print("Err: Div by 0");  // 防止除以0
        delay(2000);  // 顯示2秒
        clearAll();  // 清空顯示
        return;
      }
      break;
    case 'F':  // 乘法
      result = num1 * num2;
      break;
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(result);  // 顯示計算結果
  delay(2000);  // 停留2秒
  clearAll();  // 清空以便重新輸入
}

按鍵對應到七段顯示器,並輸入密碼1450,若輸入正確RGB LED亮綠燈,反之亮紅燈。按下C清除(七段顯示不亮)

  • 7段顯示器在輸入之後會顯示跑到最左邊,也就是不管輸入幾位數雖然看得到數字的殘影,但是到最後都會只顯示千位數
#include <Keypad.h>

const byte rows = 4;
const byte cols = 4;
char kb[rows][cols] = {
                        {'F','E','D','C'},
                        {'B','3','6','9'},
                        {'A','2','5','8'},
                        {'0','1','4','7'}
                      };
byte rowPins[rows] = {25, 24, 23, 22};
byte colPins[cols] = {29, 28, 27, 26};
Keypad customKeypad = Keypad(makeKeymap(kb), rowPins, colPins, rows, cols);

#define CA1 30
#define CA2 31
#define CA3 32
#define RED_PIN 44
#define GREEN_PIN 45
#define BLUE_PIN 46

int delayTime = 10; // Set to a more visible delay
byte segs[7] = {2, 3, 4, 5, 6, 7, 8};
byte sSD[10][7] = {
  {0, 0, 0, 0, 0, 0, 1}, //0 
  {1, 0, 0, 1, 1, 1, 1}, //1
  {0, 0, 1, 0, 0, 1, 0}, //2
  {0, 0, 0, 0, 1, 1, 0}, //3
  {1, 0, 0, 1, 1, 0, 0}, //4
  {0, 1, 0, 0, 1, 0, 0}, //5
  {0, 1, 0, 0, 0, 0, 0}, //6
  {0, 0, 0, 1, 1, 1, 1}, //7
  {0, 0, 0, 0, 0, 0, 0}, //8
  {0, 0, 0, 0, 1, 0, 0}, //9
};

String enteredCode = "";  // Store entered password
String correctCode = "1450";  // Correct password

void setup() {
  Serial.begin(9600);

  // Set segment pins as output
  for (int i = 2; i <= 8; i++) {
    pinMode(i, OUTPUT);
  }
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH); // Turn off decimal point

  // Set common anode pins as output
  pinMode(CA1, OUTPUT);
  pinMode(CA2, OUTPUT);
  pinMode(CA3, OUTPUT);

  pinMode(A13, OUTPUT);
  digitalWrite(A13, LOW);

  // Set RGB pins as output
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);

  resetDisplay();
  turnOffRGB();
}

void loop() {
  showNumber(enteredCode.toInt());
  char customKey = customKeypad.getKey();
  if (customKey) {
    if (customKey == 'C') {
      // Clear display
      enteredCode = "";
      resetDisplay();
      turnOffRGB();
    } else if (isdigit(customKey)) {
      // Handle digit input
      enteredCode += customKey;
      int currentLength = enteredCode.length();
      if (currentLength <= 4) {
        showNumber(enteredCode.toInt());
      }

      if (enteredCode.length() == 4) {
        checkCode();  // Check the entered password
      }
    }
  }
}

void checkCode() {
  if (enteredCode == correctCode) {
    turnGreen(); // Correct password
  } else {
    turnRed(); // Incorrect password
  }
}

// Display the entered number
void showNumber(int number) {
  unsigned long startTime = millis();
  for (unsigned long elapsed = 0; elapsed < 300; elapsed = millis() - startTime) {
    lightDigit1(number % 10);
    delay(delayTime);
    lightDigit2((number / 10) % 10);
    delay(delayTime);
    lightDigit3((number / 100) % 10);
    delay(delayTime);
    lightDigit4((number / 1000) % 10);
    delay(delayTime);
  }
}

void resetDisplay() {
  // Clear display
  for (int i = 0; i < 4; i++) {
    pickDigit(i + 1);
    for (int j = 0; j < 7; j++) {
      digitalWrite(segs[j], HIGH);  // Turn off display
    }
  }
}

void pickDigit(int x){
  digitalWrite(CA1, HIGH);
  digitalWrite(CA2, HIGH);
  digitalWrite(CA3, HIGH);

  switch(x){
    case 1:
      digitalWrite(CA1, LOW);
      digitalWrite(CA2, LOW);
      digitalWrite(CA3, LOW);
      break;
    case 2:
      digitalWrite(CA1, HIGH);
      digitalWrite(CA2, LOW);
      digitalWrite(CA3, LOW);
      break;
    case 3:
      digitalWrite(CA1, LOW);
      digitalWrite(CA2, HIGH);
      digitalWrite(CA3, LOW);
      break;
    case 4:
      digitalWrite(CA1, HIGH);
      digitalWrite(CA2, HIGH);
      digitalWrite(CA3, LOW);
      break;
  }  
}

void lightDigit1(byte number) {
  pickDigit(1);
  lightSegments(number);
}

void lightDigit2(byte number) {
  pickDigit(2);
  lightSegments(number);
}

void lightDigit3(byte number) {
  pickDigit(3);
  lightSegments(number);
}

void lightDigit4(byte number) {
  pickDigit(4);
  lightSegments(number);
}

void lightSegments(byte number) {
  for (int i = 0; i < 7; i++) {
    digitalWrite(segs[i], sSD[number][i]);
  }
}

void turnOffRGB() {
  analogWrite(RED_PIN, 255);   // Turn off red
  analogWrite(GREEN_PIN, 255); // Turn off green
  analogWrite(BLUE_PIN, 255);  // Turn off blue
}

void turnRed() {
  analogWrite(RED_PIN, 0);   // Turn on red
  analogWrite(GREEN_PIN, 255); // Turn off green
  analogWrite(BLUE_PIN, 255);  // Turn off blue
}

void turnGreen() {
  analogWrite(RED_PIN, 255);   // Turn off red
  analogWrite(GREEN_PIN, 0);   // Turn on green
  analogWrite(BLUE_PIN, 255);  // Turn off blue
}