Trong hướng dẫn này, chúng tôi sẽ thiết kế một bộ đếm 0-99 bằng cách kết nối hai màn hình bảy đoạn với Vi điều khiển ATMEGA32A. Ở đây chúng tôi đếm các sự kiện dựa trên số lần nút được nhấn.
Trước khi tiếp tục, chúng ta hãy hiểu màn hình bảy phân đoạn là gì. Màn hình bảy phân đoạn có tên vì nó có bảy phân đoạn chiếu sáng. Mỗi đoạn này có một đèn LED (Light Emitting Diode). Bạn có thể xem sơ đồ chân của màn hình bảy đoạn trong hình ảnh bên dưới.
Các đèn LED được chế tạo theo cách mà ánh sáng của mỗi đèn LED được chứa trong phân đoạn riêng của nó. Điều quan trọng cần lưu ý ở đây, các đèn LED trong màn hình bảy đoạn bất kỳ được sắp xếp ở chế độ cực dương chung (cực dương chung) hoặc chế độ cực âm chung (cực âm chung).
Kết nối mạch của đèn LED ở cực âm chung và cực dương chung được thể hiện trong hình trên. Ở đây người ta có thể quan sát thấy rằng, trong Cathode chung, các cực âm của mọi đèn LED được kết nối với nhau và được đưa ra dưới dạng GND. Trong Anode chung, cực dương của mọi LED được kết nối với nhau và đưa ra dưới dạng VCC. Các màn hình Cathode chung và Anode chung này rất tiện dụng trong khi ghép nhiều ô với nhau.
Bây giờ chúng ta hãy hiểu ghép kênh. Đó là một kỹ thuật đơn giản được sử dụng để kết nối song song nhiều đơn vị hơn để giảm bớt số chân cắm cần thiết, bằng cách tận dụng hiệu ứng hình ảnh. Hãy xem xét một đèn LED đang BẬT và TẮT liên tục với tốc độ 2HZ mỗi giây, tức là nó BẬT hai lần và TẮT hai lần một giây. Bây giờ với tốc độ này, mắt người có thể nhìn thấy cả chu kỳ BẬT và chu kỳ TẮT. Nhưng nếu tần số được tăng lên 50HZ, tức là 50 lần BẬT và 50 lần TẮT đối với đèn LED trong một giây. Ở tốc độ này, mắt người không thể nhìn thấy các chu kỳ TẮT. Đây là một hiệu ứng của tầm nhìn. Với tốc độ này, mắt hình ảnh đèn LED với độ sáng kém hơn và đó là tất cả.
Components Required
Hardware: ATMEGA32, Power supply (5v), AVR-ISP PROGRAMMER, HDSP5503, Seven segment displays (two pieces) (any common cathode will do ), 47uF capacitor (connected across power supply), button(three pieces), 10KΩ resistor (two pieces), 1KΩ resistor, 220Ω resistor (two pieces), 100nF capacitor (three pieces), 2N2222 transistors (two pieces).
Software: Atmel studio 6.1, progisp or flash magic.
Circuit Diagram and Working Explanation
#include <avr/io.h> //header to enable data flow control over pins
#define F_CPU 1000000 //telling controller crystal frequency attached
#include <util/delay.h> //header to enable delay function in program
int main(void)
{
DDRB = 0x00; // Taking portB as input port
DDRA = 0xFF; //taking porta as output port
DDRD = 0b11111111; //taking portd as output
int DISPLAY1 [10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};
//character display values from 0-9
int c = 0;
int i=0;
int d = 0;
int one = 0; //memory for storing ones place value
int ten =0; //memory for storing tens place value
while(1)
{
if (bit_is_clear(PINB,0)) //when button one is pressed
{
if (i<21)
{
i++; //increment integer ‘i’ by one if its less than 21
}
}
if (bit_is_clear(PINB,1)) // when button 2 is pressed
{
if (d<21)
{
d++; // increment integer ‘d’ by one if its less than 21
}
}
if (i>20) //if ‘i’ was executed more than 21 times
{
if (c<99) //if counter value less than 99
{
c++; //increment counter value
}
i=0; //put i to zero
}
if (d>20) // if ‘d’ was executed more than 21 times
{
if (c>0) //if counter value is greater than 0
{
c--; //decrease the value by one
}
d=0; //put d to zero
}
if (c<10) // if counter value is less than 10
{
one = c; // ones place is equal to counter value or c
ten = 0; // tens place is equal to zero as ‘c’ value is less than 10
}
if (c>=10) //if count value is greater than or equal to 10
{
ten = c/10;//as intergers cannot hold decimal points(12/10=1.2),for integer its‘1’
one = c-(ten*10);//ones place
}
PORTD |=(1<<PIND6); //turn ones place displaying display transistor ON
PORTA = DISPLAY1[one]; //put value at porta which is needed for corresponding digit display
_delay_ms(10); //wait for vision illusion
PORTD &=~(1<<PIND6); // turn ones place displaying display transistor OFF
PORTD |=(1<<PIND5); // turn tens place displaying display transistor ON
PORTA = DISPLAY1[ten]; //put value at porta which is needed for corresponding digit display
_delay_ms(10);
PORTD &=~(1<<PIND5);// turn tens place displaying display transistor OFF
}
}