// ------------------------------------------------// 範例: KeyBoard_EX2.ino// 功能: KeyBoard 鍵值顯示在七段顯示器上 //// Copyright(c) 2015 by CHIRKAL 僑高科技// E-mail: service@chirkal.com.tw// Web: http://www.chirkal.com.tw//// Support: Atmel SAM3X8E //// 接線說明 // +---------+------------+-------------+// | Arduino | IO編號 | 七段顯示器 |// +---------+------------+-------------+// | D30 | 57 | A |// | D31 | 58 | B |// | D32 | 59 | C |// | D33 | 60 | D |// | D34 | 61 | E |// | D35 | 62 | F |// | D36 | 63 | G |// | D37 | 64 | DOT |// +---------+------------+-------------+// | D22 | 49 | COM1 |// | D23 | 50 | COM2 |// | D24 | 51 | COM3 |// | D25 | 52 | COM4 |// +---------+------------+-------------+// | Arduino | IO編號 | KEYBOARD |// +----------+------------+----------+// | D46 | 73 | C1 |// | D47 | 74 | C2 |// | D48 | 75 | C3 |// | D49 | 76 | C4 |// | D50 | 77 | R1 |// | D51 | 78 | R2 |// | D52 | 79 | R3 |// | D53 | 80 | R4 |// +----------+------------+----------+//// Date: 2015-06-09//-------------------------------------------------int S1 = 22;int S2 = 23;int S3 = 24;int S4 = 25;
int Seg7_A = 30;int Seg7_B = 31;int Seg7_C = 32;int Seg7_D = 33;int Seg7_E = 34;int Seg7_F = 35;int Seg7_G = 36;int Seg7_DOT = 37;
int SegCount;
int NUMBER_TEXT[] = {1,2,3,4};
const unsigned char NUMBER[16] = { 0x3F, // --0-- 0x06, // --1-- 0x5B, // --2-- 0x4F, // --3-- 0x66, // --4-- 0x6D, // --5-- 0x7D, // --6-- 0x07, // --7-- 0x7F, // --8-- 0x6F, // --9-- 0x77, // --A-- 0x7C, // --B-- 0x39, // --C-- 0x5E, // --D-- 0x79, // --E-- 0x71, // --F-- };
int C1 = 46;int C2 = 47;int C3 = 48;int C4 = 49;int R1 = 50;int R2 = 51;int R3 = 52;int R4 = 53;
int key_count;int count;
void setup(){ SegCount = 0; pinMode(Seg7_A, OUTPUT); pinMode(Seg7_B, OUTPUT); pinMode(Seg7_C, OUTPUT); pinMode(Seg7_D, OUTPUT); pinMode(Seg7_E, OUTPUT); pinMode(Seg7_F, OUTPUT); pinMode(Seg7_G, OUTPUT); pinMode(Seg7_DOT, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(S4, OUTPUT); digitalWrite(Seg7_A, HIGH); digitalWrite(Seg7_B, HIGH); digitalWrite(Seg7_C, HIGH); digitalWrite(Seg7_D, HIGH); digitalWrite(Seg7_E, HIGH); digitalWrite(Seg7_F, HIGH); digitalWrite(Seg7_G, HIGH); digitalWrite(Seg7_DOT, HIGH); digitalWrite(S1, HIGH); digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); digitalWrite(S4, HIGH); pinMode(C1, OUTPUT); pinMode(C2, OUTPUT); pinMode(C3, OUTPUT); pinMode(C4, OUTPUT); pinMode(R1, INPUT_PULLUP); pinMode(R2, INPUT_PULLUP); pinMode(R3, INPUT_PULLUP); pinMode(R4, INPUT_PULLUP); digitalWrite(C1, HIGH); digitalWrite(C2, HIGH); digitalWrite(C3, HIGH); digitalWrite(C4, HIGH); }
void loop(){ int i; unsigned int col; unsigned int row; unsigned char row_data; unsigned int key_input;
unsigned char seg7_data;
// 關閉掃描線 for (i = 0; i < 4; i++) digitalWrite(S1 + i, HIGH); delayMicroseconds(300);
seg7_data = NUMBER[NUMBER_TEXT[SegCount]]; // 資料Byte轉Bit輸出 for (i = 0; i < 8; i++) { if ((seg7_data & (0x01 << i)) == 0) digitalWrite(Seg7_A + i, HIGH); else digitalWrite(Seg7_A + i, LOW); } // for i // 開啟掃描線 digitalWrite(S1 + SegCount, LOW); delayMicroseconds(300); SegCount = SegCount + 1; SegCount = SegCount % 4; for (col = 0; col < 4; col++) // 列掃描 { digitalWrite(C1, (col == 0) ? LOW : HIGH); digitalWrite(C2, (col == 1) ? LOW : HIGH); digitalWrite(C3, (col == 2) ? LOW : HIGH); digitalWrite(C4, (col == 3) ? LOW : HIGH); //delay(10);
// 讀取掃描按鍵 row_data = 0x00; for (row = 0; row < 4; row++) { if (digitalRead(R1 + row) == LOW) //判斷是否有按按鈕 row_data = row_data | (0x01 << row); } // for row if (row_data != 0x00) //有按按鈕則離開迴圈 break; } // for col
if (row_data == 0x01) //判斷第幾個row被按下 key_input = 0; else if (row_data == 0x02) key_input = 1; else if (row_data == 0x04) key_input = 2; else if (row_data == 0x08) key_input = 3; key_input = col + key_input * 4 ; // 按鍵值 0 ~ 15 if (col < 4) // 有按按鍵 { if (key_count == 1) // 延遲,除彈跳用 { NUMBER_TEXT[0] = NUMBER_TEXT[1]; NUMBER_TEXT[1] = NUMBER_TEXT[2]; NUMBER_TEXT[2] = NUMBER_TEXT[3]; NUMBER_TEXT[3] = key_input; //將七段顯示要顯示的字碼向右推 } key_count = key_count + 1; if (key_count > 100) key_count = 100; } else { key_count = 0; }}