/*
01204XXX Seven-Segment
การใช้จอแสดงผลตัวเลขแบบ 7 ส่วน (7-segment digit display)
การใช้งานอย่างง่ายที่สุด คือ ให้ต่อ pin COM เข้ากับไฟ 3v3 จากนั้นต่อขา
segments ต่างๆ (A-G) เข้ากับ GPIO
วิธีการนี้จะใช้ขาจำนวนมาก ขอให้ระวังว่าขาใดใช้ได้ไม่ได้
ตัวอย่างที่แสดงคือตัวอย่างการวางฮาร์ดแวร์ที่ถูกต้องตัวอย่างหนึ่ง
ซึ่งนิสิตจะใช้เพื่อทำโจทย์ประจำสัปดาห์นี้
หมายเหตุ การทำงานของชุด 7 segment นี้ ทำโดยป้อนไฟเข้าทาง COM
(ดังนั้น COM ไม่ใช่ GND ในกรณีนี้) นิสิตจึงต้องตั้งขา output (ที่จะวิ่งเข้า segments)
เป็น LOW เพื่อให้ไฟติด และ HIGH เพื่อให้ไฟดับ
ทั้งนี้ ขณะนี้ ปุ่มกดไม่ได้ทำหน้าที่อะไรทั้งสิ้น แต่เป็นส่วนหนึ่งของโจทย์
ตำแหน่งส่วนตัวเลขกับขา pin เป็นดังนี้
-A-
F| |B
-G-
E| |C
-D-
เช่น หากต้องการแสดงผลเลข 3 ให้ทำให้ไฟที่ segments A, B, C, D, G ติด
และทำให้ไฟที่ segments E, F ดับ
การแสดงผลเลขจะใช้แบบใดก็ได้ เช่น เลข 1 จะชิดซ้ายก็ได้ หรือ 6, 7, 9
จะมีหัวมีหางหรือไม่มีอย่างไรก็ได้
################# โจทย์ #################
ให้นิสิตเขียนโปรแกรมที่จะทำให้วงจรทำงานดังนี้
1. มีการจัด seven-segment display และปุ่มกดตามที่แสดงในแผนภาพ
(สามารถคัดลอกไฟล์นี้ได้)
2. มีการเก็บตัวแปรภายในเพื่อจดจำตัวเลข
3. เมื่อเริ่มโปรแกรม seven-segment display จะแสดงเลข 0 ค้างไว้
4. เมื่อกดปุ่ม seven-segment display จะเปลี่ยนเป็นเลขที่สูงขึ้น
ได้แก่ 1, 2, 3, 4, 5, 6, 7, 8, 9
5. เมื่อเลขที่แสดงเป็น 9 และกดปุ่มอีกครั้ง จะกลับมาเป็นเลข 0
#########################################
# การส่งงาน
ให้นิสิตกดแชร์ ด้านบน แล้วก็อปปี้ link ที่ได้ ส่งในการบ้านครับ
# การให้คะแนน
ส่วนของคะแนนในวิชานี้: ไม่มี แ่ต่จะให้ extra credit ไม่เกิน 1 แต้ม
(จาก max 100 เพิ่มเป็น max 101 ไม่มีผลต่อการคิดเกรด)
การแบ่งคะแนน (การบ้านนี้คะแนนเต็ม 100 คะแนน):
- ตัวเลขแต่ละตัวแสดงผลถูกต้อง ตัวเลขละ 3 คะแนน รวม 30 คะแนน
- การเปลี่ยนตัวเลขทำได้ถูกต้อง ตัวเลขละ 3 คะแนน รวม 30 คะแนน
- ใช้คำสั่งได้ถูกต้อง 40 คะแนน (ประเมินเชิงคุณภาพ)
HINT: Hardware ทำมาให้ครบแล้ว ชื่อ Pin กำหนดให้แล้ว ที่เหลือฝากนิสิตจัดการ
*/
#define A 25
#define B 26
#define C 27
#define D 14
#define E 12
#define F 33
#define G 32
#define BUTTON 5
void write_7seg(int a, int b, int c, int d, int e, int f, int g) {
digitalWrite(A, a);
digitalWrite(B, b);
digitalWrite(C, c);
digitalWrite(D, d);
digitalWrite(E, e);
digitalWrite(F, f);
digitalWrite(G, g);
}
void set_0() {
write_7seg(LOW, LOW, LOW, LOW, LOW, LOW, HIGH);
}
void set_1() {
write_7seg(HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH);
}
void set_2() {
write_7seg(LOW, LOW, HIGH, LOW, LOW, HIGH, LOW);
}
void set_3()
{
write_7seg(LOW, LOW, LOW, LOW, HIGH, HIGH, LOW);
}
void set_4()
{
write_7seg(HIGH, LOW, LOW, HIGH, HIGH, LOW, LOW);
}
void set_5()
{
write_7seg(LOW, HIGH, LOW, LOW, HIGH, LOW, LOW);
}
void set_6()
{
write_7seg(LOW, HIGH, LOW, LOW, LOW, LOW, LOW);
}
void set_7()
{
write_7seg(LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH);
}
void set_8()
{
write_7seg(LOW, LOW, LOW, LOW, LOW, LOW,LOW);
}
void set_9()
{
write_7seg(LOW, LOW, LOW, LOW, HIGH, LOW, LOW);
}
void setup() {
Serial.begin(115200);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
}
int number = 0;
int button = 0;
void loop() {
// put your main code here, to run repeatedly:
/*
if (number == 0) {
set_0();
} else if (number == 1) {
set_1();
} else {
set_2();
}
*/
switch(number){
case 0:
set_0();
break;
case 1:
set_1();
break;
case 2:
set_2();
break;
case 3:
set_3();
break;
case 4:
set_4();
break;
case 5:
set_5();
break;
case 6:
set_6();
break;
case 7:
set_7();
break;
case 8:
set_8();
break;
case 9:
set_9();
break;
default:
break;
}
button = digitalRead(BUTTON);
if (button == 0) {
number += 1;
number %= 10;
}
delay(1000);
}