การใช้งาน 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 เท่านั้น
เนื่องจากประกอบด้วย LED เจ็ดส่วนเราจึงเปิดไฟ LED เพื่อแสดงตัวเลขหรือตัวอักษร ตัวอย่างเช่นการเปิดไฟ LED ส่วน B และ C ทำให้ตัวเลขเป็น “1” เพื่อแสดง
ในการเขียนโปรแกรมมักใช้เลขฐานสิบหกเทียบเท่ากับเอาต์พุต SSD
สำหรับประเภทแคโทดทั่วไปให้แสดงรหัสฐานสิบหกแทนตัวเลขตั้งแต่ 0 ถึง 9 และจาก A ถึง F แสดงด้านล่าง:
รายการอุปกรณ์
- 1. ATmega32 Development Board Learning
- 2. USBasp USBisp AVR Programmer
- 3. 7 Segment Common Cathode 1 Digit Red 0.56″
- 4. Mini Breadboard 170 holes
- 5. Jumper (F2M) cable wire 20cm Female to Male
- 6. Push Button Switch สวิตช์กดติดปล่อยดับ 2 ขา
- 7. Jumper (M2M) cable 10cm Male to Male
ขั้นตอนการทํางาน
1 : โปรแกรมแรก กับ ATmega32 Board
โดยศึกษา ขั้นตอนการทำงาน จากลิงค์บทความ ด้านล่าง
2: เชื่อมต่อ ATmega32 เข้ากับ 7 Segment
LED แต่ละส่วนทำจาก LED ซึ่งต้องใช้กระแสไฟฟ้าประมาณ 2 V และ ~ 10 mA โดยทั่วไปเอาต์พุตดิจิตอลจากไมโครคอนโทรลเลอร์จะขับเคลื่อนแรงดันไฟฟ้า + 5V TTL ดังนั้นเราจำเป็นต้องลดแรงดันไฟฟ้าจากไมโครคอนโทรลเลอร์ให้เหลือ ~ 2 V ผ่านตัวต้านทาน
เชื่อมต่อ ATmega32 เข้ากับ 7 Segment ตามภาพด้านล่าง
เชื่อมต่อ ATmega32 เข้ากับ Push Button Switch ตามภาพด้านล่าง
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
ไปที่ Tools -> ATmega32-Upload (ที่ตั้งชื่อไว้) ที่ Output ด้านล่างซ้ายมือ แสดง avrdude.exe done. Thank you. แสดงว่าการอัพโหลดสำเร็จแล้ว
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 สําเร็จแล้ว