You are on page 1of 10

Hướng dẫn lập trình hiển thị LED 7 thanh

Nhóm 18 – Giảng đường 205

Nghiêm Minh Sơn


Nguyễn Tùng Sơn
Phạm Anh Tài
Trần Văn Tam
Hoàng Sỹ Tân

1
Hoàng Sỹ Tân
Ở bài này mình giới thiệu với các bạn cách lập trình để hiển thị LED 7 thanh , sau này
sẽ thuận lợi hơn trong việc lập trình để đo nhiệt độ trong bài lập trình dành cho ADC.
1> Cấu trúc LED 7 thanh trong proteus và cách hiển thị:
Xem ở hình trên, ta đặt tên cho các thanh của nó là a,b,c,d,e,f,g , nên điều khiển nó ta
dùng 7 chân điều khiển tín hiệu, 1 chân nguồn cho nó là 8 chân, chú ý đây là led Anot,
nghĩa là khi cấp nguồn cho nó vào chân VCC, thì nếu tín hiệu vào chân a là 0 thì chân
a sáng, tín hiệu vào chân a là 1 thì chân a tắt.
Trong thực tế, led 7 thanh có 1 dấu chấm gần thanh c và d , ta gọi là chấm h , và cùng
nó nữa là 1 chân điều khiển nữa. Đồng thời led 7 thanh thực có 2 chân nguồn. Vậy
trong thực tế thì led 7 thanh có 10 chân.
Mỗi thanh led có dòng qua nó phù hợp là 10-20mA, hiệu điện thế khoảng 1,5V; mà
với mức 0 và 1 của VĐK tương ứng với 0V và 5V DC, do đó ta phải gắn vào VCC
một điện trở khoảng 330 Ôm để giảm dòng qua LED, tránh bị cháy. Đó cũng chính là
giá trị trở gắn vào LED đơn trong bt LED đơn.
Bây giờ ta tìm hiểu cách hiển thị lên LED 7 thanh.
Giả sử ta muốn hiện số 5, thì cần thanh a,f,g,c,d là sáng, nghĩa là các chân này có tín
hiệu là 0, và các chân kia là 1. Theo cách hiểu đó, ta lập được bảng sau(do không có
chân giờ nên mặc định ta cho chân h=1 để nó không sáng ,ta thêm số 1 vào đầu mã cơ
số 2):

2
Hoàng Sỹ Tân

Số a b c d e f g
Cơ số 2 Cơ số 16
1 1 0 0 1 1 1 1 11111001 0xF9
2 0 0 1 0 0 1 0 10100100 0xA4
3 0 0 0 0 1 1 0 10110000 0xB0
4 1 0 0 1 1 0 0 10011001 0x99
5 0 1 0 0 1 0 0 10010010 0x92
6 0 1 0 0 0 0 0 10000010 0x82
7 0 0 0 1 1 1 1 11111000 0xF8
8 0 0 0 0 0 0 0 10000000 0x80
9 0 0 0 0 1 0 0 10010000 0x90
0 0 0 0 0 0 0 1 11000000 0xC0

Vậy ta có 1 mảng số 16 bit dùng hiển thị LED 7 thanh, ta khai báo mảng như sau:
Int16 led_7_thanh[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//Số trong dãy số: 0 1 2 3 4 5 6 7 8 9

2> Mạch LED 7 thanh dùng proteus:


Ta có thể vẽ mạch như sau, các bạn có thể chọn chân nối vào led 7 thanh tùy thích, ví
dụ như sau:

3
Hoàng Sỹ Tân
ở đây mình nối PORTB với 7 chân của led 7 thanh, đầu VCC của led 7 thanh mình nối
trở 220 - 330 Ôm rồi mới nối với nguồn.
để thuận tiện trong việc mô phỏng cho nhanh thì những bài sau mình sẽ không dùng
điện trở hạn dòng nữa, nhưng các bạn khi làm mạch thật phải nhớ thêm điện trở vào
nhé!
3> Lập trình:
Do sử dụng PICC để lập trình cho PIC, nên ta có thể lập trình code như sau:
#use delay(clock=20000000)
Int16 led_7_thanh[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//Số trong dãy số: 0 1 2 3 4 5 6 7 8 9
Int i=0,j=0;
Void main()
{
4
Hoàng Sỹ Tân
While(1) // chương trình luôn chạy lặp lại
{
Set_tris_b(0xFF); // đặt PORTB là output hết
Output_b(led_7_thanh[i]); // hiển thị số thứ i trong mảng trên
I++;
If(i>9) i=0;
Delay_ms(500);
}
}

Sử dụng đoạn code trên để lập trình, xuất file .hex và nạp vào PIC, ta sẽ có mạch đếm
từ 0-9 hiển thị led 7 thanh:

5
Hoàng Sỹ Tân
4> Kỹ thuật quét LED:
Như đã biết, nếu chúng ta có 2 con LED 7 thanh. Để điều khiển được chúng thì cần 14
chân của VĐK, trong khi đó VĐK chỉ có 32 chân điều khiển, nếu có nhiều hơn LED 7
thanh sẽ không thể đủ chân được. Do đó chúng ta cần kĩ thuật quét LED.
Khi đó, sơ đồ nguyên lí như sau:

6
Hoàng Sỹ Tân
- Nối 7 chân của PORTB vào 2 LED 7 thanh
- Chân điều khiển nguồn của LED 7 thanh là các chân PIN_C0 và PIN_C1 được
nối vào cực B của Transistor, có tác dụng đóng ngắt nguồn cho LED 7 thanh.
Như vậy, theo sơ đồ này ta mất 9 chân của VĐK. Giả sử có 3 LED 7 thanh, ta làm
tương tự, chỉ cần nối chân nguồn của led 7 thanh vào tiếp chân Pin_C2, còn 7 chân
kia nối tiếp vào PortB , thì chỉ mất 10 chân trong khi theo cách cũ là tốn 21 chân, lợi
hơn rất nhiều.
Giả sử ta cần hiển thị số 34 ra 2 LED này.
Kỹ thuật quét LED như sau:
- Cho đầu ra của PIN_C0 và PIN_C1 bằng 0 , để tắt nguồn của LED.
- Đặt PIN_C0 lên 1, khi đó Transistor thông, cấp nguồn cho LED hàng chục.
Xuất số 3 ra PORTB, khi đó LED đầu sáng.
- Tắt LED 1 bằng cách đặt PIN_C0 xuống mức 0.
- Đặt PIN_C1 lên 1, khi đó Transistor thông, cấp nguồn cho LED hàng đơn vị.
Xuất số 4 ra PORTB, khi đó LED sau sáng.
- Tắt LED 2 bằng cách đặt PIN_C1 xuống mức 0.
- Lặp quá trình với một số lần nhất định, sao cho thời gian hiển thị LED này sáng
đến LED kia sáng không quá lâu để mắt có thể nhìn thấy 2 LED sáng gần như

7
Hoàng Sỹ Tân
đồng thời. Có nghĩa là mỗi LED phải nháy >24 lần/giây thì mới đạt điều kiện.
Từ việc tính toán thời gian phù hợp ta sẽ có kết quả đúng như ý muốn.
Ví dụ code hiển thị số 34 như sau:
#use delay(clock=20000000)
Int16 led_7_thanh[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//Số trong dãy số: 0 1 2 3 4 5 6 7 8 9
Void main()
{
Int i=0;
Set_tris_b(0xFF);
Set_tris_c(0xA0);
While(1)
{
For(i=0;i<10;i++)
{
Output_low(PIN_C0);
Output_low(PIN_C1); //tat 2 led
Output_high(PIN_C0); output_b(led_7_thanh[3]);delay_ms(10);
// led 1 sang
Output_low(PIN_C0); //tat led 1
Output_high(PIN_C1); output_b(led_7_thanh[4]);delay_ms(10);
//led 2 sang
Output_low(PIN_C1);//tat led 2
}
}
}

8
Hoàng Sỹ Tân
Qua bài này sẽ giúp bạn hiển thị được 2 số theo ý muốn. Từ đó các bạn có thể làm
thêm bt về quét LED, ví dụ như là đếm từ 0 đến 99, có thể kết hợp nút bấm, mỗi lần
bấm nút là số sẽ tăng hoặc giảm 1…
Sau khi thành thạo kỹ thuật này, chúng ta kết hợp thêm ADC như là nhiệt độ để hiển
thị ra. Đây là hình mình làm khi kết hợp nhiệt độ,ở đây mình chưa sử dụng kỹ thuật
quét LED:

Nếu sử dụng 2 led 7 thanh như trên để quét LED thì có xảy ra việc LED bị nháy, khi
đó nếu ta thay 2 LED 7 thanh đó bằng 1 linh kiện có 2 LED 7 thanh như sau thì sẽ
khắc phục được hiện tượng trên.

9
Hoàng Sỹ Tân
Mình hi vọng các bạn sẽ thực hành sớm bài này để tuần sau chúng ta có thể làm với
ADC được nhanh hơn, hoặc là 1 bt làm thêm cho giai đoạn 1. Sở dĩ mình giới thiệu
cách này vì hầu hết các bài hiển thị nhiệt độ trên mạng đều hiển thị lên LCD, cách sử
dụng LCD không liên quan tới bài tập lớn nên nếu tìm hiểu LCD sẽ mất thời gian hơn.
Mọi người cố gắng nhé!

10
Hoàng Sỹ Tân

You might also like