Hiển Thị Led 7 đoạn Sử Dụng PIC16F877A

1.    Hiển thị LED 7 đoạn

1.1.      Mục tiêu

Tìm hiểu nguyên lý hoạt động và thực hiện hiển thị trên LED 7 đoạn.

1.2.      LED 7 đoạn

1.2.1.     Giới thiệu

LED 7 đoạn gồm có 7 đoạn được đánh dấu: A, B, C, D, E, F, G và một điểm DP. Một đoạn là một LED, kết hợp tắt/sáng của các LED này để hiển thị số mong muốn.

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig1

Hình 1: Cấu tạo LED 7 đoạn

LED 7 đoạn có 2 loại: Anode chung và Cathode chung, tương ứng các LED nối chung cực Anode và nối chung cực Cathode. Kết cấu chúng được mô tả như dưới đây:

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig2

Hình 2: Mô hình LED 7 đoạn Cathode chung (bên trái) và Anode chung (bên phải)

Tương ứng với kết cấu trên, các chân dữ liệu sẽ được gửi tới bit tương ứng:

Bảng 1: Mã hiển thị trên LED 7 đoạn Cathode chung

Số hiển thị DP G F E D C B A Mã HEX
0 0 0 1 1 1 1 1 1 0x3F
1 0 0 0 0 0 0 1 1 0x06
2 0 1 0 1 1 0 1 1 0x5B
3 0 1 0 0 1 1 1 1 0x4F
4 0 1 1 0 0 1 1 0 0x66
5 0 1 1 0 1 1 0 1 0x6D
6 0 1 1 1 1 1 0 1 0x7D
7 0 0 0 0 0 1 1 1 0x07
8 0 1 1 1 1 1 1 1 0x7F
9 0 1 1 0 1 1 1 1 0x6F

Bảng 2: Mã hiển thị trên LED 7 đoạn Anode chung

Số hiển thị DP G F E D C B A Mã HEX
0 1 1 0 0 0 0 0 0 0xC0
1 1 1 1 1 1 1 0 0 0xFC
2 1 0 1 0 0 1 0 0 0xA4
3 1 0 1 1 0 0 0 0 0xB0
4 1 0 0 1 1 0 0 1 0x99
5 1 0 0 1 0 0 1 0 0x92
6 1 0 0 0 0 0 1 0 0x82
7 1 1 1 1 1 0 0 0 0xF8
8 1 0 0 0 0 0 0 0 0x80
9 1 0 0 1 0 0 0 0 0x90

Khi hiển thị nhiều LED đồng thời, theo như phương pháp trên sẽ cần sử dụng rất nhiều chân vi điều khiển, nó là một cản trở và chưa tối ưu. Khó khăn trên được khắc phục bởi các  phương pháp dưới đây:

  • Quét LED.
  • Sử dụng IC giải mã.
  • Sử dụng IC dịch.

Trong đó, sử dụng IC dịch cho hiệu quả sử dụng chân tốt nhất, tiếp đến là IC giải mã và quét LED. Tuy vậy, để có được hiệu quả đó cần phải đánh đổi bằng cấu trúc mạch phức tạp, thời gian truyền nạp dữ liệu cho LED 7 đoạn khá lâu.

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

Kĩ thuật quét LED tận dụng những hạn chế trong việc ghi lại hình ảnh của mắt người. Qua mắt người, chuỗi hình ảnh sẽ diễn ra liên tục nếu nó được nhìn với tốc độ 24 hình/s.

Kĩ thuật này nối chung các chân dữ liệu của nhiều LED 7 đoạn với nhau và bật tắt từng LED trong khoảng thời gian nhất định. Do đó, tại một thời điểm chỉ có 1 LED sáng. Khoảng thời gian bật/tắt LED rất ngắn khiến mắt người không thể phân biệt được và có cảm giác các đèn này sáng cùng lúc.

Thời gian bật/tắt 1 đèn phải nhỏ hơn 1/24 giây, tức là 1 giây sẽ có nhiều hơn 24 lần luân chuyển giữa các LED.

1.2.3.     IC 74LS47

IC 74LS47 là IC giải mã, có chức năng chuyển mã BCD đầu vào thành đầu ra các bit đầu ra tương ứng.

IC này được sử dụng làm bộ giải mã cho LED 7 đoạn Anode chung. Do đó, nó có 7 đầu ra dữ liệu A, B, C, D, E, F, G, H.

Để hiển thị LED 7 đoạn, thay vì sử dụng 7 chân dữ liệu, có thể thu gọn lại còn 4 nếu sử dụng phương pháp này.

IC 74LS47 hoạt động ở điều kiện như sau:

  • Nguồn cấp: 4.75 – 5.25 V.
  • Điện áp mức cao: 2 V.
  • Điện áp mức thấp: 0.8 V.
  • Dòng vào mức cao các chân dữ liệu: -250 uA.
  • Dòng vào mức cao các chân điều khiển: -50 uA.
  • Dòng mức thấp: 24 mA.
  • Dải nhiệt độ làm việc hiệu quả: 0 – 70 0C.

Sơ đồ chân 74LS47

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig3

Hình 3: Sơ đồ chân IC 74LS47

INPUT

Các chân dữ liệu: A0 – A3: BCD Input – mã BCD đầu vào.

Các chân điều khiển:

  • RBI: Ripple Blanking Input (active Low) – xóa các xung đầu vào.
  • LT: Lamp Test Input (active Low) – kiểm tra sự hoạt động của LED.
  • BI/RBO: Blanking Input (active Low) hoặc Rippler Blanking Output (active Low).

OUTPUT

Các chân dữ liệu: A, B, C, D, E, F, G, H được nối tới LED 7 đoạn.

BI/RBO: cũng có thể là một chân output.

Theo dõi mạch logic dưới đây để biết thêm về chức năng và cơ chế hoạt động của IC giải mã 74LS47:

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig4

Hình 4: IC 74LS47 ở mức cổng Logic

Nguyên lý hoạt động:

IC mã hóa này chuyên để phục vụ LED 7 đoạn, ở đó, khi cho một số ở dạng nhị phân 4 bit tới đầu vào, đầu ra sẽ sinh mã tương ứng chiều dài 7 bit để hiển thị kí tự đó trên LED 7 đoạn.

Các chế độ làm việc và kiểm tra được điểu khiển bởi các chân RBI, LT, BI/RBO. Báo cáo này mô tả cách hoạt động đơn giản nhất của IC giải mã này.

Một điều chú ý khi sử dụng IC 74LS47 là tốc độ đáp ứng đầu vào. Nó rất quan trọng khi sử dụng nhiều LED cùng lúc và các LED này được bật tắt luôn phiên. Ở tần số cao, khi đầu vào thay đổi, đầu ra của IC không thể đáp ứng kịp. Giải pháp là cài đặt cả những chân dữ liệu và chân điều khiển.

1.2.4.     IC 74xx595

Các loại IC 74xx595 là IC ghi dịch 8 bit kết hợp bộ chốt dữ liệu 3 trạng thái, có đầu vào nối tiếp, đầu ra song song.

Chức năng:

  • Mạch quét LED 7 đoạn.
  • LED matrix.

IC này được sử dụng để tiết kiểm tối đa các chân của vi điều khiển (cần tối thiểu 3 chân), có thể mở rộng số chân ra của vi điều khiển tùy ý bằng việc mắc nối tiếp đầu vào dữ liệu của các IC với nhau.

Phương pháp này cho phép sử dụng tiết kiệm chân của vi điều khiển một cách tối đa, nhưng do dữ liệu được truyền đi một cách nối tiếp, khi số LED hiển thị tăng, chuỗi bit truyền đi sẽ dài hơn và số xung nhịp để truyền đi cũng sẽ nhiều hơn.

IC 74HC595 hoạt động ở điều kiện như sau:

  • Điện áp nguồn cấp cực đại 7V.
  • Điện áp đầu vào -0.5 đến Vcc + 0.5V.
  • Điện áp đầu ra -0.5 đến Vcc + 0.5V.
  • Dòng vào 20mA.
  • Dòng ra 35mA.
  • Công suất trung bình tùy thuộc vào cách đóng gói:
    • Plastic DIP: 750mW.
    • SOIC Package: 500mW.
    • TSSOP Pạckage: 450mW.
  • Dải nhiệt độ làm việc hiệu quả: -65 đến 150 0

Nguyên lý hoạt động

74HC595 là loại được sử dụng phổ biến trong họ 74xx595, nó có sơ đồ chân như dưới đây:

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig5

Hình 5: Sơ đồ chân IC 74HC595

INPUT

A (pin 14)

Đầu vào dữ liệu nối tiếp. Chuỗi dữ liệu nối tiếp từ vi điều khiển tới chân này được truyền vào bên trong thanh ghi dịch sau mỗi xung Clock.

CONTROL INPUTS

Shift Clock (pin11)

Xung Clock thanh ghi dịch. Khi xuất hiện sườn dương ở chân này, dữ liệu đầu vào A (pin14) sẽ được dịch từng bit vào thanh ghi 8 bit.

Reset (pin10)

Đầu vào active mức thấp, không đồng bộ. Khi chân này ở mức thấp (0), thanh ghi được reset, bộ chốt 8 bit không được hoạt động.

Latch Clock (pin12)

Xung Clock cho đầu ra bộ Latch. Khi xuất hiện sườn dương ở chân này, dữ liệu trong thanh ghi dịch được đẩy ra bộ Latch.

Output Enable (pin 13)

Cho phép giá trị lưu trữ trong bộ Latch được xuất ra bên ngoài khi chân này ở mức thấp (0).

OUTPUT

QA-QH (pin 15, 1, 2, 3, 4, 5, 6, 7)

Các đầu ra không đảo. Do sử dụng bộ Latch nên đầu ra sẽ có 3 trạng thái: mức thấp (0), mức cao (1) hoặc mức trở khảng cao (Z).

SQH (pin 9)

Đầu ra không đảo, là chuỗi dữ liệu đầu ra nối tiếp, nó là đầu ra của thanh ghi dịch, mỗi khi gặp sườn dương Shift Clock ở pin 11, giá trị thanh ghi bị dịch đi và bit có trọng số cao nhất dược đẩy sang đầu ra SQH.

Sơ đồ khối chi tiết của IC 74HC595 được mô tả chi tiết theo hình dưới đây:

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig6

Hình 6: Mạch tuần tự bên trong IC 74HC595

1.3.      Lập trình quét LED 7 đoạn thông thường

Như đã giới thiệu ở trên để hiển thị LED 7 đoạn có 2 phương pháp chính: quét LED và sử dụng IC dịch 74HC595.

Mục 1.3 sẽ mô tả chi tiêt kĩ thuật quét LED, đếm tăng và hiển thị trên 2 LED 7 đoạn.

1.3.1.     Chuẩn bị

Phần mềm Code và Complie: CCS C Complie.

Phần mềm mô phỏng: Proteus 8 Professional.

Sơ đồ nguyên lý

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig7

Hình 7: Sơ đồ nguyên lý đếm tăng và hiển thị trên LED 7 đoạn

Nguyên lý

Tạo một biến đếm và hiển thị biến đếm này lên LED 7 đoạn thông qua kĩ thuật quét LED. Biến đếm bắt đầu từ 0 và tăng giá trị lên tới 99 rồi quay trở lại 0, thời gian để biến đếm nay tăng lên 1 đơn vị là 1 [s], tạo ra bởi vòng lặp có chứa hàm delay_ms().

Trong khoảng thời gian đó, để đánh lừa được thị giác, các LED được bật/tắt 24 lần luôn phiên với thời gian LED sáng trên 1 lần bật là 20 [ms].

Các tham số trên được xác định khi mạch có N [LED 7 thanh] và giá trị biến đếm thay đổi với chu kì 1s, LED nhấp nháy với k lần trong một giây nên thời gian LED sáng được tính bởi công thức:

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Capture

1.3.2.     Lập trình chức năng

Code thực hiện chức năng trên được mô tả như dưới đây:

// ---------------- FUNCTION DISPLAY 7 SEGMENTS LED ------------------- // -------------------------------------------------------------------- // This program has a function that display counter second // into LED 7 segments // Use: // - Oscilator 20Mhz. // - Output Digital. // Timer second increase and display in 2 LED 7 segments. // Therefore, value of timer is from 00 to 99. // While passing 100 value, timer is setted again 00. // In this program, used methode is Scan LED // Circuit include 2 LED 7 segments, they is countinously turned on/off // that make we fell they is countinously turned on. // Fucntion: Display 7 segments LED // Operation: display counter sencond into LED 7 segments // Parameter: NON // Return: NON // Note: // To select and display in one LED, we need send select after sending // data to display. #include <DisplayLED7Segments_v1.h> #use DELAY(CLOCK = 20000000) #define DELAY 20 #define COUNT 24 unsigned char symbol[11] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0xFF }; unsigned char _count = 0, _timer = 0; void main() { unsigned char timer = 0; set_tris_b(0x00); // Set portB output set_tris_d(0x00); // Set portC output while(TRUE) { _count++; if(_count == COUNT) // increase _timer { _count = 0; _timer ++; if(_timer == 100) _timer = 0; } timer = _timer; // display first symbol output_d(0x01); output_b(symbol[timer%10]); delay_ms(DELAY); timer/= 10; // display second symbol output_d(0x02); output_b(symbol[timer%10]); delay_ms(DELAY); } }

Chú ý: Khi hiển thị lên một trong cụm LED 7 đoạn, phải thực hiện chọn LED trước khi gửi dữ liệu cần hiển thị.

1.3.3.     Kết quả

Một số kết quả thu được khi chạy Code trên:

  • LED 7 đoạn hiển thị được giá trị biến đếm thời gian.
  • Số hiển thị tăng sau khoảng 1s.
  • Mắt thường không thấy có hiện tượng nhấp nháy LED.
  • Biến đếm tăng tới 99 rồi lại quay trở về 0.

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig8

Hình 8: Hiển thị đếm giây trên LED 7 đoạn

 

1.4.      Lập trình hiển thị LED 7 đoạn sử dụng 74LS47

1.4.1.     Chuẩn bị

Phần mềm Code và Complie: CCS C Complie.

Phần mềm mô phỏng: Proteus 8 Professional.

Sơ đồ nguyên lý

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig9

Hình 9: Sơ đồ nguyên lý hiển thị LED sử dụng 74LS47

 

Nguyên lý

Vi điều khiển thực hiện đếm và chuyển chữ số biến đếm thành mã BCD gửi tới đầu vào của IC giải mã 74LS47. Đầu ra của các IC này được nối tới các chân LED 7 đoạn để hiển thị các chữ số của biến đếm trên.

Lưu ý: Sơ đồ nguyên lý trên được sử dụng để mô phỏng chức năng, để hoàn thiện mạch thật, các chân ra của IC 74LS47 tới LED 7 đoạn nên có điện trở giá trị 180 [Ôm] để đảm bảo dòng không gây hư hại cho LED.

1.4.2.     Lập trình chức năng

Code thực hiện chức năng trên được mô tả như dưới đây:

// ----------------- DISPLAY LED 7 SEGMENTS USE 74LS47 ----------- //--------------------------------------------------------------------- // This program have a function that is display counter into LED 7 // segments use IC decoder 74LS47. // To complete this function, processor count and increase counter // after one second. // Value of counter is converted to BCD code and sent to input of // IC 74LS47. This IC convert BCD code to LED 7 segments code // to display corresspond digit of counter. // Function: Display LED 7 segments use 74LS47 // Operation: // Parameter: NON // Return: NON // Note: #include <Display7Segments.h> #use DELAY (Clock = 20000000) // DEFINE PIN of PORT B #define A0 PIN_B0 #define B0 PIN_B1 #define C0 PIN_B2 #define D0 PIN_B3 #define A1 PIN_B4 #define B1 PIN_B5 #define C1 PIN_B6 #define D1 PIN_B7 // Function: Display Number // Operation: display digit of number // Parameter: num - number need display, digit - 0 or 1 // Return: NON // NOTE: void DisplayNum(int8 num, int8 digit) { if(digit == 0) { output_bit(A0,num & 0x01); output_bit(B0,num & 0x02); output_bit(C0,num & 0x04); output_bit(D0,num & 0x08); } else { output_bit(A1,num & 0x01); output_bit(B1,num & 0x02); output_bit(C1,num & 0x04); output_bit(D1,num & 0x08); } } void main() { int count = 0; set_tris_b(0x00); while(TRUE) { count ++; if(count == 100) count = 0; DisplayNum(count%10, 0); DisplayNum(count/10, 1); delay_ms(950); } }

1.4.3.     Kết quả

Thực hiện đoạn chương trình trên thu được kết quả :

  • Biến đếm hiện thị được trên 2 LED 7 đoạn.
  • Giá trị biến đếm tăng 1 đơn vị sau khoảng 1 giây.
  • Khi giá trị biến đếm tăng lên tới 100, sẽ quay lại giá trị 0.

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig10

Hình 10: Kết quả hiển thị LED 7 đoạn sử dụng IC 74LS47 

 

1.5.      Lập trình hiển thị LED 7 đoạn sử dụng 74HC595

Phương pháp sử dụng IC dịch 74HC595.

1.5.1.     Chuẩn bị

Phần mềm Code và Complie: CCS C Complie.

Phần mềm mô phỏng: Proteus 8 Professional.

Sơ đồ nguyên lý

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig11

Hình 11: Sơ đồ nguyên lý hiển thị LED 7 đoạn 0 – 9

Nguyên lý

Vi điều khiển thực hiện đếm thời gian và chuyển số đếm được thành chuỗi bit tương ứng với mã LED 7 đọan Cathode chung. Mã này được truyền từng bit nối tiếp nhau, qua chân dữ liệu RB0 đến chân DS (chân dữ liệu) của IC. Từng bit của chuỗi dữ liệu nối tiếp được dịch và ghi vào bên trong thanh ghi của IC, khi gặp sườn lên từ chân SH-CP nối với RB1, tiếp đó, toàn bộ chúng được đẩy lên Latch và cho ra các chân dữ liệu của LED 7 đoạn khi gặp sườn lên xung ST-CP nối với RB2.

1.5.2.     Lập trình chức năng

Code thực hiện chức năng trên được mô tả như dưới đây:

// ----------------- DISPLAY LED 7 SEGMENTS USE 74HC595 ----------- //--------------------------------------------------------------------- // This program have a function that is display counter into LED 7 // segments use IC Shift Register 74HC595. // To complete this function, processor count and increase counter // after one second // Value of counter is converted to byte data and transmitted // one bit/pulse to IC 74HC595 by Shift Clock // While byte data is successfully transmitted to shift register, // it will display // in LED 7 segment by Latch Clock // Function: Display LED 7 segments use 74HC595 // Operation: // Parameter: NON // Return: NON // Note: // Type data of data1, data2, data3, data4 #include <DisplayLEDby74HC595.h> #use DELAY(CLOCK = 20000000) #define DATA PIN_B0 #define SHIFT_CLOCK PIN_B1 #define LATCH_CLOCK PIN_B2 #define OUTPUT_ENABLE PIN_B3 unsigned char symbol[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; int32 data1, data2, data3, data4; int32 _serialNum = 0; // Function: ConvertCounter // Operation: convert counter[DECIMAL] to serial sequence[BINARY] // Parameter: datax - input data is decimal number // Return: NON // Note: // Type data while operate shifting bit void ConvertCounter(int16 datax) { data1 = symbol[datax%10]; datax /= 10; data2 = symbol[datax%10]; datax /= 10; data3 = symbol[datax%10]; datax /= 10; data4 = symbol[datax]; // Create serial sequence from input data // input: datax[16] // output: _serialNum[32] _serialNum = (data4 << 24) | (data3 << 16) | (data2 << 8) | data1; } void main() { int16 count = 0; int i = 0; output_high(OUTPUT_ENABLE); delay_ms(500); output_low(OUTPUT_ENABLE); while(TRUE) { ConvertCounter(count); for(i = 0; i < 32; i++) { // Write bit data if((_serialNum & 0x80000000)==0) // Shift Clock = 0 -> 1 output_low(DATA); // Allow shift bit in shift register else output_high(DATA); _serialNum <<= 1; output_low(SHIFT_CLOCK); delay_ms(5); output_high(SHIFT_CLOCK); } output_low(LATCH_CLOCK); // Latch Clock = 0 -> 1 delay_ms(5); // Allow data from to Latch to LED 7 segments output_high(LATCH_CLOCK); delay_ms(700); if(count == 1001) count = 0; count++; } }

1.5.3.     Kết quả

Thực hiện đoạn chương trình trên thu được kết quả:

  • LED 7 thanh hiển thị số đếm từ 0 – 1000.
  • Khoảng thời gian để số này nhảy khoảng 1 s.
  • Khi đạt giá trị là 1001, số đếm quay lại giá trị 0.

TÀI LIỆU LẬP TRÌNH - HIỂN THI LED 7 ĐOẠN_Fig12

Hình 12: Hiện thị đếm 0 – 1000 trên 4 LED 7 đoạn

Share this:

  • Twitter
  • Facebook
Like Loading...

Related

Từ khóa » Chân Dp Của Led 7 đoạn