25/05/2018, 07:38

Điều khiển vào ra với led 7 đoạn

4 led 7 thanh anot chung, 4 chân anot chung(chân dương) được nối với 4 transitor để ta có thể quét led sử dụng 4 chân của PORTD, các chân điều khiển sáng các thanh còn lại được nối song song nhau và đưa vào PORTB của AVR và có thứ tự như sau: ...

4 led 7 thanh anot chung, 4 chân anot chung(chân dương) được nối với 4 transitor để ta có thể quét led sử dụng 4 chân của PORTD, các chân điều khiển sáng các thanh còn lại được nối song song nhau và đưa vào PORTB của AVR và có thứ tự như sau: Từ bít 0 → 6 ứng với từ A → G. Bít thứ 7 là dấu chấm.

Vì có 4 led nên ta có thể hiển thị đến hàng nghìn. Do đó đầu vào của ta là một số bất kì lớn tới hàng nghìn. Ta phải tách lấy từng số hàng nghìn, trăm, chục, đơn vị rồi đưa vào 4 biến rồi tùy vào 4 biến số đó mà ta đưa ra từng led. Quét let ta làm như sau: Đưa PORTD.0 xuống 0 để bật nguồn cho led hàng đơn vị, đẩy trị số hàng đơn vị ra PORTB, trễ một khoảng thời gian → đưa PORTD.0 lên một để tắt nguồn led đơn vị, đưa PORTD.1 xuống 0 để bật nguồn cho led hàng chục, đẩy giá trị hàng chục ra PORTB, trễ một khoảng thời gian, … Cứ làm như vậy đến hàng nghìn. Như vậy tại một thời điểm chỉ có một led sáng chỉ bằng 1/3 thời gian led tắt, nhưng do tần số bật led nhanh, mắt người lưu ảnh nên vẫn thấy led sáng như lúc nào cũng bật nguồn cho led.

Các bước khởi tạo tương tự bài một. Chúng ta soạn thảo code gồm hai hàm như sau và đặt ngay phía trên hàm main như trong hình.

void daydulieu(unsigned char x)// Ham dua du lieu ra PORT

{

switch(x) // Tuy thuoc vao bien dau vao ma dua du lieu ra tu 0...9

{ //logic 1 tat led, logic 0 bat led

case 0: { PORTB=0xC0; break; } // So 0 

case 1: { PORTB=0xF9; break; } // So 1 

case 2: { PORTB=0xA4; break; } // So 2 

case 3: { PORTB=0xB0; break; } // So 3 

case 4: { PORTB=0x99; break; } // So 4 

case 5: { PORTB=0x92; break; } // So 5

case 6: { PORTB=0x82; break; } // So 6 

case 7: { PORTB=0xF8; break; } // So 7 

case 8: { PORTB=0x80; break; } // So 8 

case 9: { PORTB=0x90; break; } // So 9

}

}

void hienthi(int n)

{

int a,b,c,d;

// Lay cac so cac hang

a= n/1000; // lay hang nghin

b=(n-a*1000)/100; // lay hang tram

c=(n-a*1000-b*100)/10; // lay hang chuc

d=(n-a*1000-b*100-c*10);// lay hang don vi

// Quet led

PORTD=0xFE;// led dau tien 

daydulieu(d);// day ra hang don vi

delay_ms(10);// tre 

PORTB=0xFF;// tat toan bo led 

PORTD=0xFD;//led thu hai 

daydulieu(c);// dua ra hang chuc 

delay_ms(10);// tre 

PORTB=0xFF;// tat toan bo led 

PORTD=0xFB;

daydulieu(b); 

delay_ms(10); 

PORTB=0xFF; 

PORTD=0xF7; d

aydulieu(a); 

delay_ms(10); 

PORTB=0xFF;

Trong vòng while(1) trong hàm main ta chỉ dùng một câu lệnh gọi hàm hiển thị như sau:

Trong bài này vì nếu đưa các PORTD và PORTB lúc khởi tạo bằng 0x00 thì tất cả các led sẽ sáng do đó tại các câu lệnh khởi tạo cho hai PORT này các bạn hãy gán cho nó giá trị 0xFF như hình sau:

0