Trong bài này chúng ta thực hành quét LED 7 đoạn dùng Timer thay vì dùng hàm delay_ms() như bài  Hiển thị quét LED 7 đoạn vi điều khiển PIC - Bài 3

Nhắc lại nguyên lý quét LED 7 đoạn :

Nguyên lý quét LED 7 đoạn:

Lần lượt cấp nguồn cho từng LED7, đối với LED7 thứ n, xuất dữ liệu của LED7 thứ n (có dữ liệu 1byte tương ứng với 8 led đơn a,b,c,d,e,f,g,dp) tại một thời điểm chỉ có 1 LED7 sáng với dữ liệu của nó. Delay một khoảng thời gian, sau đó chuyển sang LED7 khác.
Theo nguyên lý lưu ảnh 24h/s  thì nếu có hình ảnh của 24 hình xuất hiện trong 1 giây thì dường như vật đó luôn xuất hiện ta sẽ thấy giá trị của từng LED7.

Trong bài tập này mình dùng vi điều khiển PIC 16F877A các bạn tạo một Project mới như hình trong proteus :

led7pic

Ở bài tập này mình dùng Timer 0 để tính delay với các khai báo như sau :

enable_interrupts(GLOBAL); // cho phép tất cả các ngắt
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); // Cài đặt timer 0 với hệ số chia là 64
set_timer0(137); // nạp timer 0 cho delay là 2.5ms
enable_interrupts(INT_RTCC); // Cho phép ngắt timer 0

Sau đó ta có hàm gọi ngắt Timer 0 : Tham khảo bài Các ngắt trong PIC để biết cách sử dụng ngắt

#INT_TIMER0
void isr_timer0(void){
set_timer0(137); //2.5ms;20ms = 8x2.5 // cài đặt lại timer

.....

}

Các bạn có thể vào bài :  Bộ định thời Timer và Counter của PIC để xem cách tính Timer . 

Ví dụ này là tạo delay 2.5ms=2500us , sử dụng timer 8 bit, hệ số chia là 64, tần số thạch anh là 12Mhz :

255- 2500*12/(4*64)=137.81 ≈137.

Với delay timer là 2.5ms  tức là mỗi LED sẽ có thời gian sáng là 2.5ms do đó 8 LED thời gian sẽ là 8*2.5=20ms. Như vậy trong 1s=1000ms sẽ có 1000/20=50 hình/s. Vì trong thực tế nếu để 24 hình/s thì LED sẽ bị nhấp nháy.

Trong bài này mình tính thời gian cho 8 LED nhưng chỉ hiển thị có 6 LED, 2 LED còn lại mình cho OFF ( Do bộ KIT thực hành của mình chỉ có 6 LED).

Dưới đây là code hiển thị cho 1 LED

Định nghĩa các chân điều khiển LED

#define AS PIN_A0
#define BS PIN_A1
#define CS PIN_A2
#define DS PIN_A3
#define ES PIN_A4
#define FS PIN_A5

if(led_sl==0) { // Chọn LED đầu tiên

Output_B(0xff);  // Cho tắt hết tất cả các LED
output_low(AS); // Hiển thị LED đầu tiên.
output_high(BS); // Tắt các LED còn lại
output_high(CS);
output_high(DS);
output_high(ES);
output_high(FS);
Output_B(LED_MAP[tramnghin]); // Dữ liệu hiển thị cho LED đầu tiên.
led_sl++; // Tăng thứ tự LED
return;
}

Trong ví dụ này có 3 chế độ hoạt động :

1. sw1=0 và sw2=0 Hiển thị các LED7 từ 1--6.

2. sw1=0 và sw2=1 thực hiện đếm lên (countup).

3. sw1=1 và sw2=0 thực hiện đếm xuống (countdown).

Các bạn down load project tại đây : Quét LED 7 đoạn dùng timer vi điều khiển PIC

Xem vi đeo mô phỏng bài tập này tại đây :

Nếu bạn thấy hay hãy đăng ký , chia sẻ giúp tôi nhé chúng tôi sẽ thường xuyên cập nhật kiến thức mới về vi điều khiển PIC tại đây