Cấu tạo led 7 đoạn, lập trình pic 16f877a quét 1 led 7 đoạn

Trong bài viết này, chúng ta cùng tìm hiểu cấu tạo của một led 7 đoạn. Sau đó sẽ thực hành lập trình vi điều khiển quét (hiển thị) led 7 đoạn.

Led 7 đoạn là một tập hợp các led đơn được sắp xếp theo một cấu trúc. Mỗi đoạn của led là một led đơn. 

Các bạn nhìn vào hình trên, các led đơn được kết nối 1 cực chung, các cực còn lại để điều khiển tắt mở led. Nếu các Anode được kết nối chung gọi là 7 cực dương chung – để tắt mở 1 đoạn cần một xung “0”. Ngược lại, các Cathode được kết nối chung gọi là led cực âm chung – để bật một đoạn của led cần một xung “1”.

Để hiển thị một con số nào đó trên led 7 đoạn thì ta cần cấp nguồn cho các led đơn tương ứng với các đoạn của led sáng lên, tùy theo loại led là cực dương chung (CA), hay cực âm chung (CC) mà ta cấp nguồn cho chính xác. Bạn xem video mô phỏng bằng chương trình protues 8.1 Pro sau đây sẽ rõ hơn về hoạt động của led 7 đoạn, trong mô phỏng này mình sử dụng led cực âm chung (common cathode).

Như vậy chúng ta đã hiểu cách cấp nguồn để một led 7 đoạn hoạt động rồi, sau đây chúng ta sẽ kết hợp led 7 đoạn và vi điều khiển pic 16f877A để hiển thị số từ 0 đến 9.

Lập trình vi điều khiển trên Pic 16f877A để hiển thị led 7 đoạn bằng phương pháp quét. Ưu điểm của phương pháp quét led code lập trình rất ngắn gọn, chương trình nhẹ, còn nhược điểm là tốn nhiều chân (pin) của vi điều khiển. Đối với các dòng vi điều khiển ít chân (pin) như pic 12fxx (8 pin) ta không thể sử dụng phương pháp quét led được.

Mô tả project: Ở project này chúng ta sử dụng vi điều khiển pic 16f877A, tần số thạch anh 8Mhz, kết nối các chân (pin) của PORTD (RA0…. RA7) đến các chân (pin) led 7 đoạn cực âm chung (a….g và dp), sơ đồ nguyên lý ở hình trên.

/*
Project name: Quet mộtled 7 doan
CMU: 16f877A, 8Mhz
Connect: PORTD (RA0…RA7) to a…..g,dp
Author: Huynh Minh Trung
Author: http://giaoan.link
*/
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
}
}
unsigned short mask(unsigned short num);
unsigned short digit_no, digit1, digit, i;

void interrupt() {
if (digit_no==0) {
PORTA = 0; // Turn off displays
PORTD = digit1; // Set mask for displaying ones on PORTD

}
TMR0 = 0; // Reset counter TMRO
INTCON = 0x20; // Bit T0IF=0, T0IE=1
}

void main() {
OPTION_REG = 0x80; // Set timer TMR0
TMR0 = 0;
INTCON = 0xA0; // Disable interrupt PEIE,INTE,RBIE,T0IE
PORTA = 0; // Turn off both displays
TRISA = 0; // All port A pins are configured as outputs
PORTD = 0; // Turn off all display segments
TRISD = 0; // All port D pins are configured as outputs
digit_no=0;
do {
for (i = 0; i<=9; i++) { // Count from 0 to 9
digit = i;
digit1 = mask(digit); // Prepare mask for displaying ones
Delay_ms(1000);
}
} while (1); // Endless loop
}

Ở project này chúng ta sử dụng ngắt interrupt để quét 1 led, làm tiền đề sau này thực hiện quét 2 led, 3led…project quét nhiều led sẽ được giaoan.link cập nhật trong phần tiếp theo.

Video mô phỏng quét 1 led 7 đoạn trên proteus 8 Pro:

Bạn tải project bao gồm file mô phỏng proteus, code C, hex theo link bên dưới.