
/* 指撥開關加七段顯示器實驗 */
const int dipsw1[] = { 9, 10, 11, 12};// 四位元指撥開關,對應MSB~LSB
const int dipsw2[] = { 14, 15, 16, 17}; // 四位元指撥開關,對應MSB~LSB
const byte Weight1[] = { 8, 4, 2, 1};// 每一位元對應到的加權值,對應2^3, 2^2, 2^1, 2^0
int seg7[] = {2, 3, 4, 5, 6, 7, 8};// 七段控制腳陣列,分別對應a~g段
char seg7Table[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
};// 七節顯示器編碼表
int scan[] = {18, 19};
int i, j, k; // 迴圈用的變數
void OutPort(byte data)// 將指定值顯示在七段顯示器上,最低位元為a,依序為 abcdefg
{
for (j = 0; j < 7; j++) {
if (data % 2 == 1) // 取出 dat 的最低位元
digitalWrite(seg7[j], HIGH); // 若為 1 代表該段要亮, 輸出高準位
else
digitalWrite(seg7[j], LOW); // 若為 0 代表該段要滅, 輸出低準位
data = data / 2; // 除2,進行下一位元的處理
}
}
void setup()// 此 setup 程序只有在微控制器按 reset 時執行一次
{
for (i = 0; i < 7; i++) // 初始化指定的數位腳位為輸出模式
{
pinMode(seg7[i], OUTPUT);
}
for (i = 0; i < 2; i++)
{
pinMode(scan[i], OUTPUT);
}
for (i = 0; i < 4; i++) {
pinMode(dipsw1[i], INPUT);
}
for (i = 0; i < 4; i++) {
pinMode(dipsw2[i], INPUT);
}
}
void loop()// 此 loop 程序會一直重覆執行
{
{//顯示個位數
int num1 = 0;
int reading1;
for (i = 0; i < 4; i++)
{
reading1 = digitalRead(dipsw1[i]); // 讀取指撥開關狀態
if (reading1 == HIGH) num1 = num1 + Weight1[i];// 往上撥時為LOW,往下撥為HIGH,為LOW時要加上加權值
}
OutPort(~seg7Table[num1]); // 取出陣列中對應的數字編碼表
digitalWrite(scan[0], HIGH);
delay(5);
digitalWrite(scan[0], LOW);
}
{//顯示十位數
int num2 = 0;
int reading2;
for (i = 0; i < 4; i++)
{
reading2 = digitalRead(dipsw2[i]); // 讀取指撥開關狀態
if (reading2 == HIGH) num2 = num2 + Weight1[i];// 往上撥時為LOW,往下撥為HIGH,為LOW時要加上加權值
}
OutPort(~seg7Table[num2]); // 取出陣列中對應的數字編碼表
digitalWrite(scan[1], HIGH);
delay(5);
digitalWrite(scan[1], LOW);
}
}
沒有留言:
張貼留言