// 接線說明
// +---------+------------+-------------+
// | 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 |
// +---------+------------+-------------+
//
int S1 = 22; //設定D22腳為來源電,用來提供七段顯示
int Seg7_A = 30; //設定D30腳為七段顯示器的【A】訊號線
int Seg7_B = 31; //設定D31腳為七段顯示器的【B】訊號線
int Seg7_C = 32; //設定D32腳為七段顯示器的【C】訊號線
int Seg7_D = 33; //設定D33腳為七段顯示器的【D】訊號線
int Seg7_E = 34; //設定D34腳為七段顯示器的【E】訊號線
int Seg7_F = 35; //設定D35腳為七段顯示器的【F】訊號線
int Seg7_G = 36; //設定D36腳為七段顯示器的【G】訊號線
int Seg7_DOT = 37; //設定D37腳為七段顯示器的【DOT】訊號線
int second = 0; //宣告一個用來存放當前要顯示的值
const unsigned char NUMBER[10] =
{
0x3F, // --0--
0x06, // --1--
0x5B, // --2--
0x4F, // --3--
0x66, // --4--
0x6D, // --5--
0x7D, // --6--
0x07, // --7--
0x7F, // --8--
0x6F, // --9--
};
void setup()
{
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);
digitalWrite(Seg7_A, HIGH); //初始設定為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);
}
void loop()
{
int i; //用來存放For迴圈的宣告
unsigned char seg7_data; //宣告一個無符號的Char 【0 ~ 255】
digitalWrite(S1 , LOW); //將七段顯示器亮起來【共陽極】
seg7_data = NUMBER[second]; //存放當前要顯示的字碼【0 ~ 9】
// 資料Byte轉Bit輸出
for (i = 0; i < 8; i++)
{
if ((seg7_data & (0x01 << i)) == 0) //利用邏輯位元運算【& 等同 And】 【<< 等同 左旋位移】
digitalWrite(Seg7_A + i, HIGH);
else
digitalWrite(Seg7_A + i, LOW);
} // for i
if(second < 9) //判斷是否大於9,因為當前僅顯示 0 ~ 9
second++; //累加
else
second=0;
delay(1000);
}
// 接線說明
// +---------+------------+-------------+
// | 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 |
// +---------+------------+-------------+
//
#include "Arduino.h"
#include "TimerOne.h"
int SegCount;
int S1 = 22; //設定D22腳為來源電,用來提供七段顯示
int S2 = 23; //設定D23腳為來源電,用來提供七段顯示
int Seg7_A = 30; //設定D30腳為七段顯示器的【A】訊號線
int Seg7_B = 31; //設定D31腳為七段顯示器的【B】訊號線
int Seg7_C = 32; //設定D32腳為七段顯示器的【C】訊號線
int Seg7_D = 33; //設定D33腳為七段顯示器的【D】訊號線
int Seg7_E = 34; //設定D34腳為七段顯示器的【E】訊號線
int Seg7_F = 35; //設定D35腳為七段顯示器的【F】訊號線
int Seg7_G = 36; //設定D36腳為七段顯示器的【G】訊號線
int Seg7_DOT = 37; //設定D37腳為七段顯示器的【DOT】訊號線
int second = 0; //宣告一個用來存放當前要顯示的值
const unsigned char NUMBER[10] =
{
0x3F, // --0--
0x06, // --1--
0x5B, // --2--
0x4F, // --3--
0x66, // --4--
0x6D, // --5--
0x7D, // --6--
0x07, // --7--
0x7F, // --8--
0x6F, // --9--
};
int NUMBER_TEXT[2] = {0,0}; // 宣告陣列內容
void myHandler() //邊緣觸發中斷
{
if(second < 99) //判斷是否大於99,因為當前僅顯示 00 ~ 99
second++; //累加
else
second=0;
NUMBER_TEXT[0] = second / 10; //取10的商數
NUMBER_TEXT[1] = second % 10; //取10的餘數
}
void setup()
{
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);
digitalWrite(Seg7_A, HIGH); //初始設定為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);
Timer1.attachInterrupt(myHandler);
Timer1.initialize(200000); // Calls every 200ms
}
void loop()
{
int i; //用來存放For迴圈的宣告
unsigned char seg7_data; //宣告一個無符號的Char 【0 ~ 255】
seg7_data = NUMBER[NUMBER_TEXT[SegCount]]; //存放當前要顯示的字碼【00 ~ 99】
// 關閉掃描線
for (i = 0; i < 2; i++)
digitalWrite(S1 + i, HIGH); //將七段顯示器滅掉
delayMicroseconds(300); //延遲300毫秒
// 資料Byte轉Bit輸出
for (i = 0; i < 8; i++)
{
if ((seg7_data & (0x01 << i)) == 0) //利用邏輯位元運算【& 等同 And】 【<< 等同 左旋位移】
digitalWrite(Seg7_A + i, HIGH);
else
digitalWrite(Seg7_A + i, LOW);
} // for i
// 開啟掃描線 - 多工掃描
digitalWrite(S1 + SegCount, LOW); //控制當前要亮的七段顯示器
delayMicroseconds(300);
SegCount = SegCount + 1; //開啟當前要顯示的七段顯示器
SegCount = SegCount % 2; //延遲300毫秒
}
// 接線說明
// +---------+------------+-------------+
// | 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 |
// +---------+------------+-------------+
//
#include "Arduino.h"
#include "TimerOne.h"
int SegCount;
int S1 = 22; //設定D22腳為來源電,用來提供七段顯示
int S2 = 23; //設定D23腳為來源電,用來提供七段顯示
int S3 = 24; //設定D24腳為來源電,用來提供七段顯示
int S4 = 25; //設定D25腳為來源電,用來提供七段顯示
int Seg7_A = 30; //設定D30腳為七段顯示器的【A】訊號線
int Seg7_B = 31; //設定D31腳為七段顯示器的【B】訊號線
int Seg7_C = 32; //設定D32腳為七段顯示器的【C】訊號線
int Seg7_D = 33; //設定D33腳為七段顯示器的【D】訊號線
int Seg7_E = 34; //設定D34腳為七段顯示器的【E】訊號線
int Seg7_F = 35; //設定D35腳為七段顯示器的【F】訊號線
int Seg7_G = 36; //設定D36腳為七段顯示器的【G】訊號線
int Seg7_DOT = 37; //設定D37腳為七段顯示器的【DOT】訊號線
int second = 0; //宣告一個用來存放當前要顯示的值
const unsigned char NUMBER[10] =
{
0x3F, // --0--
0x06, // --1--
0x5B, // --2--
0x4F, // --3--
0x66, // --4--
0x6D, // --5--
0x7D, // --6--
0x07, // --7--
0x7F, // --8--
0x6F, // --9--
};
int NUMBER_TEXT[4] = {0,0,0,0}; // 宣告陣列內容
void myHandler() //邊緣觸發中斷
{
if(second < 9999) //判斷是否大於99,因為當前僅顯示 0000 ~ 9999
second++; //累加
else
second=0;
NUMBER_TEXT[0] = second / 1000; //取1000的商數
NUMBER_TEXT[1] = (second % 1000) / 100; //取1000的餘數,取100的商數
NUMBER_TEXT[2] = (second / 10) % 10; //取10的商數,取10的餘數
NUMBER_TEXT[3] = second % 10; //取10的餘數
}
void setup()
{
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); //初始設定為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);
Timer1.attachInterrupt(myHandler);
Timer1.initialize(20000); // Calls every 20ms
}
void loop()
{
int i; //用來存放For迴圈的宣告
unsigned char seg7_data; //宣告一個無符號的Char 【0 ~ 255】
seg7_data = NUMBER[NUMBER_TEXT[SegCount]]; //存放當前要顯示的字碼【00 ~ 99】
// 關閉掃描線
for (i = 0; i < 4; i++)
digitalWrite(S1 + i, HIGH); //將七段顯示器滅掉
delayMicroseconds(300); //延遲300毫秒
// 資料Byte轉Bit輸出
for (i = 0; i < 8; i++)
{
if ((seg7_data & (0x01 << i)) == 0) //利用邏輯位元運算【& 等同 And】 【<< 等同 左旋位移】
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; //延遲300毫秒
}
// ------------------------------------------------
// 範例: 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;
}
}
// ------------------------------------------------
// 範例: Seg7LED_EX2.ino
// 功能: 七段顯示--- 電子鐘--- 頻率產生器
//
// Copyright(c) 2015 by CHIRKAL 僑高科技
// E-mail: service@chirkal.com.tw
// Web: http://www.chirkal.com.tw
//
// Support: Atmel SAM3X8E
//
// 接線說明
// +---------+------------+-------------+
// | Arduino | IO編號 | 七段顯示器 |
// +---------+------------+-------------+
// | D8 | 25 | A |
// | D9 | 26 | B |
// | D10 | 27 | C |
// | D11 | 28 | D |
// | D12 | 29 | E |
// | D13 | 30 | F |
// | D14 | 31 | G |
// | D15 | 32 | DOT |
// +---------+------------+-------------+
// | D4 | 21 | COM1 |
// | D5 | 22 | COM2 |
// | D6 | 23 | COM3 |
// | D7 | 24 | COM4 |
// +---------+------------+-------------+
//
// +---------+------------+-----------------------+
// | Arduino | IO編號 | 頻率產生器 |
// +---------+------------+-----------------------+
// | D46 | 73 | CLOCK輸出 |
// +---------+------------+-----------------------+
// Date: 2015-06-09
//-------------------------------------------------
int S1 = 4;
int S2 = 5;
int S3 = 6;
int S4 = 7;
int Seg7_A = 8;
int Seg7_B = 9;
int Seg7_C = 10;
int Seg7_D = 11;
int Seg7_E = 12;
int Seg7_F = 13;
int Seg7_G = 14;
int Seg7_DOT = 15;
int SegCount;
int timer_1s;
int NUMBER_TEXT[4] = {2,3,5,9};
int second = 0;
const
unsigned char NUMBER[17] =
{
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--
0x80, // --:--
};
void myHandler() //邊緣觸發中斷
{
if(timer_1s > 0)
timer_1s--;
}
void setup()
{
SegCount = 0;
attachInterrupt(digitalPinToInterrupt(46), blink, CHANGE );
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);
}
void loop()
{
int i;
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(second % 2 == 0)
{
seg7_data = seg7_data | 0x80;
}
else
{
seg7_data = seg7_data & 0x7f;
}
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;
}
void blink()
{
second++;
if(second > 119)
{
second = 0;
NUMBER_TEXT[3]++;
}
if(NUMBER_TEXT[3] > 9 )
{
NUMBER_TEXT[3] = 0;
NUMBER_TEXT[2] ++;
}
if(NUMBER_TEXT[2] > 5)
{
NUMBER_TEXT[2] = 0;
NUMBER_TEXT[1] ++;
}
if(NUMBER_TEXT[1] > 9)
{
NUMBER_TEXT[1] = 0;
NUMBER_TEXT[0] ++;
}
if(NUMBER_TEXT[0] > 1 && NUMBER_TEXT[1] > 3)
{
NUMBER_TEXT[0] = 0;
NUMBER_TEXT[1] = 0;
}
}