การใช้งาน ATmega32 ภาษาซี กับ 7 Segment

Seven Segment Display (SSD) เป็นอุปกรณ์แสดงผลแบบคลาสสิกสำหรับอุปกรณ์อิเล็กทรอนิกส์ดิจิทัลระดับล่าง 7 Segment คือหน้าจอแสดงผลตัวเลข – ตัวอักษร (ได้บางตัว) ที่มีหน้าจอทำมาจากการจัดวางหลอด LED ในแนวยาว เมื่อทำให้หลอด LED แต่ละดวงติดพร้อมกัน ก็จะทำให้แสดงออกมาเป็นตัวเลขทรงเหลี่ยมได้ การเขียนโปรแกรมนั้นง่ายมาก อาจแสดงถึงตัวเลขและตัวอักษรภาษาอังกฤษบางตัว

การสั่งงาน 7 Segment

7 Segment มีขาหลักๆอยู่ด้วยกันทั้งหมด 9 ขา คือ a b c d e f g dot และ common ในกรณีที่มีตัวเลขจำนวนหลักมากขึ้น ก็จะมีขา Common เพิ่มมากขึ้น

การจะทำให้แถบแต่ละแถบติดสว่างได้ จะต้องทราบก่อนว่า 7 Segment นั้นเป็น Common อะไร เมื่อทราบแล้วจะทำให้สามารถควบคุมการติดดับของแต่ละแถบได้ แบบเดียวกับการควบคุม LED โดยที่หากเป็น Common Anode จะต้องต่อขา Common เข้ากับขั้วบวกของแหล่งจ่ายไฟ (5V) และหากต้องการให้แถบใดติดสว่าง จะต้องให้ขาของแถบนั้นต้องลงกราว์ด (เป็นลอจิก LOW หรือที่เรียกว่า ลอจิกศูนย์)

แต่ถ้าหากเป็น Common Cathode จะต้องต่อขา Common เข้ากับกราว์ด แล้วต่อขาของแถบที่ต้องการแสดงผลเข้าที่ขั้วบวกของแหล่งจ่าย (เป็นลอจิก HIGH หรือที่เรียกว่าลอจิกหนึ่ง) แต่การตัดสินใจว่าจะใช้ประเภทใดนั้นขึ้นอยู่กับแอปพลิเคชัน ในตัวอย่างนี้จะใช้เฉพาะประเภท Common Cathode เท่านั้น

7 Segment


เนื่องจากประกอบด้วย LED เจ็ดส่วนเราจึงเปิดไฟ LED เพื่อแสดงตัวเลขหรือตัวอักษร ตัวอย่างเช่นการเปิดไฟ LED ส่วน B และ C ทำให้ตัวเลขเป็น “1” เพื่อแสดง

ในการเขียนโปรแกรมมักใช้เลขฐานสิบหกเทียบเท่ากับเอาต์พุต SSD

สำหรับประเภทแคโทดทั่วไปให้แสดงรหัสฐานสิบหกแทนตัวเลขตั้งแต่ 0 ถึง 9 และจาก A ถึง F แสดงด้านล่าง:

SSD



 รายการอุปกรณ์


ขั้นตอนการทํางาน

1 : โปรแกรมแรก กับ ATmega32 Board


โดยศึกษา ขั้นตอนการทำงาน จากลิงค์บทความ ด้านล่าง


2: เชื่อมต่อ​ ATmega32 เข้ากับ 7 Segment


LED แต่ละส่วนทำจาก LED ซึ่งต้องใช้กระแสไฟฟ้าประมาณ 2 V และ ~ 10 mA โดยทั่วไปเอาต์พุตดิจิตอลจากไมโครคอนโทรลเลอร์จะขับเคลื่อนแรงดันไฟฟ้า + 5V TTL ดังนั้นเราจำเป็นต้องลดแรงดันไฟฟ้าจากไมโครคอนโทรลเลอร์ให้เหลือ ~ 2 V ผ่านตัวต้านทาน

ATmega32 Pinout



เชื่อมต่อ​ ATmega32 เข้ากับ 7 Segment ตามภาพด้านล่าง

การใช้งาน ATmega32 ภาษาซี กับ 7 Segment


เชื่อมต่อ​ ATmega32 เข้ากับ Push Button Switch ตามภาพด้านล่าง

ภาษาซี กับ 7 Segment


3 : เขียนโค้ดและอัพโหลดโค้ด


เขียนโค้ดและอัพโหลดตามโค้ดด้านล่างนี้ 

 
 #include <avr/io.h>
 #define F_CPU 16000000UL
 #include "util/delay.h"
 //SET THE INPUT BUTTON FOR COUNTING
 #define btnPressed ((PIND&0x01)==0)
 int main(void)
 {
                 //SEVEN SEGMENT MAP FOR COMMON
                 //CATHODE TYPE SEVEN SEGMENT DISPLAY
                 unsigned char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
                 0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
                 unsigned char btnCount=0;
                 DDRA=0xFF;    //PORTC IS FOR OUTPUT TO SEVEN SEGMENT
                 DDRD=0xFE;  //PORTD PD0 IS USED FOR INPUT COUNTING
                 PORTD=0x01; //SET PD0 TO HIGH FOR PULLING UP
                 while (1)
                 {
                                 if (btnPressed) //CHECK IF PD0 IS PRESSED
                                 {
                                                 btnCount+=1; //Increase The Counter
                                                 _delay_ms(250);
                                                 if(btnCount>15) btnCount=0;
                                                 //RESET COUNTER WHEN IT IS OVER 15
                                 }
                                 PORTA=ssd[btnCount];  //OUTPUT TO SSD
                 }
 } 


คอมไพล์โค้ด โดย คลิก Build -> Build Solution

คอมไพล์โค้ด โดย คลิก Build -> Build Solution


ไปที่ Tools -> ATmega32-Upload (ที่ตั้งชื่อไว้) ที่ Output ด้านล่างซ้ายมือ แสดง avrdude.exe done. Thank you. แสดงว่าการอัพโหลดสำเร็จแล้ว

แสดง avrdude.exe done. Thank you. แสดงว่าการอัพโหลดสำเร็จแล้ว

ภาษาซี กับ 7 Segment


4: ทดสอบการทํางาน การใช้งาน ATmega32 ภาษาซี กับ 7 Segment


เมื่อเริ่มต้น หรือ กดปุ่ม RST ที่ 7 Segment จะแสดงค่าเป็น 0 และถ้าสวิตช์ถูกกด จะเพิ่มเป็น 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,0 ตามคลิปด้านล่าง แสดงว่า การใช้งาน ATmega32 ภาษาซี กับ 7 Segment สําเร็จแล้ว