---
# System prepended metadata

title: HW3_Arduino 人機介面 附程式碼
tags: [Arduino]

---

# HW3_Arduino 人機介面 附程式碼 

>撰寫人[name=AmiYaku1049] [首頁--天空路1049號](https://skys-kid-lai.github.io/1004/)
>>最後編輯[time=Tue, Mar 22, 2022 5:49 PM]
___
## 實驗目的

了解人機介面，並進行實作

## 實驗原理

透過設計程式碼並使用Ktduino積極體驗板及Arduino UNO 開發版，了解人機介面

## 實驗材料

◎Ktduino積極體驗板 x1
◎Arduino UNO 開發版 x1
◎杜邦線 x17
◎跟你默契好的可愛電腦 x1
◎USB 線 x1

## 實驗步驟

1.在Ktduino積極體驗板及Arduino UNO 開發版連接電路
2.在電腦Aduino編譯程式碼（程式碼在下方↓）
3.確定程式碼無誤，將電路用USB線連接至電腦
4.再編譯及上傳程式碼
5.紀錄輸出

### 程式碼（已經過改良，並非為參考文獻內原始程式碼）

```clink=
const int seg[7]={6,7,8,9,10,11,12};    //顯示信號接腳
const int scan[4]={2,3,4,5};    //掃描信號接腳
const int seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //七節顯示碼
const int column[4]={A2,A3,A4,A5};
const int bz=13;    //蜂鳴器
unsigned char kn;   //按鍵值
int disp[4]={0,0,0,0};    //緩衝區
int doot;   //顯示變數

//逼聲函數原型
void beep(int pin, int counts);   
//start set
void setup() {
  for(int i=0; i<7; i++)
    pinMode(seg[i],OUTPUT);  //設定seg為輸出的接腳
  for(int i=0; i<4; i++)
  {
    pinMode(scan[i],OUTPUT);  //設定scan為輸出的接腳
    pinMode(column[i],INPUT);  //設定column為輸入的接腳
  }
  pinMode(bz,OUTPUT);  //設定bz為輸出的接腳
}

//主程式
void loop() {
  for(int i=3; i>=0; i--)  //重複執行4個掃描週期
  {
    for(int j=7; j>=0; j--)
      digitalWrite(seg[j],1);  //關閉七節顯示器的訊號，防止殘影
     
    for(int j=0; j<4; j++)
      digitalWrite(scan[j],1);
    digitalWrite(scan[i],0);
     
    //輸出七節顯示器顯示訊號
    doot=seg_code[disp[i]];
    for(int j=7; j>=0; j--)
    {
      if(bitRead(doot,j))
        digitalWrite(seg[j],1);
      else
        digitalWrite(seg[j],0);
    }
    
    //按鍵
    for(int col=0; col<4; col++)
    {
      if(!digitalRead(column[col]))  //判斷有無按鍵
      {
        while(!digitalRead(column[col]));  //等待放開按鍵
        kn=4*i+col;  //計算鍵值，也就是輸出的數值
        beep(bz,1);  //逼聲
        if(kn>=0 && kn<10)  //判斷是否為數字鍵
        {
          for(int j=0; j<3; j++)
            disp[3-j]=disp[2-j];  //將按鍵的值放入個位數，顯示時會顯示在個位數
            disp[0]=kn;
        }
        delay(3);
        break;
      }
    }
  }
}

//逼聲
void beep(int pin, int counts)
{
  for(int i=0; i<counts; i++)
  {
    tone(pin, 1000, 100);  //發聲
    delay(100);  //靜音
  }
}
```

## 實驗結果

按下Ktduino積極體驗板鍵盤，可更改七段顯示器的顯示![](https://i.imgur.com/rLPmbFI.jpg)
七段顯示器顯示結果：
![](https://i.imgur.com/8X2kYlQ.jpg)


## 實驗討論

實驗到執行的時候，依序按下1、2、3、4，會依序出現4、3、2、1，思考過後更換了電路接法，將原本連接在P6-4～P6-1的接線換順序連接，換成P6-1～P6-4後，依序按下1、2、3、4，就可依序出現1、2、3、4。

另，程式碼部分，若按照原本參考資料上之程式碼編寫，會出現第28行有錯誤之資訊。上方程式碼為改良後程式碼，將for迴圈改為倒數，則可編譯成功。
## 實驗心得

發現原本的方式會有錯誤的時候，我超級興奮的！終於有除錯的機會了！！
實驗結果的杜邦線多到看不清楚七段顯示器的結果，下次要注意了。

## 實驗文獻

>編者：艾迪諾
>出版日期：2017.01.06
>書名（頁數）：Arduino全能微處理機實習：強效解析（p4-50～p4-55）
>出版社：全華圖書
>[color=#CE0000]