Các bạn đã hiểu về phương pháp quét LED ở phần 2. Trong phần 2 ta hiển thị các số theo mong muốn nhưng thao tác đưa dữ liệu ra mang tính thủ công và không linh hoạt:
Xuất dữ liệu hiển thị số 2017.
Để hiển thị số 2017 ta phải lần lượt gõ lệnh đưa dữ liệu của từng số ra, khi muốn hiển thị số khác ta phải vào trực tiếp các dòng lệnh để sửa. Trong thực tế người ta dùng thuật toán để tách các số ra để hiển thị.
Như ta đã biết mỗi LED 7 thanh chỉ có thể hiện thị các số thập phân từ 0-9, và từ các số này có thể ghép để hiển thị tất cả các số khác. Ví dụ số 2017 là các số đơn lẻ 2-0-1-7. Vậy ta sẽ dùng thuật toán tách các số 2-0-1-7 từ số 2017 ra để hiển thị lên các đèn. Ta sẽ dùng 2 lệnh chử yếu:
/ chia; % chia lấy phần dư.
Ví dụ ta có x=2017
Nghin = x/1000 = 2 dư 7
Tram=(x%1000)/100 = 0 dư 17 (x%1000 là 2017 chia cho 1000 lấy phần dư =017)
Chuc =( (x%1000)%100)/10 = 1 dư 7
Don_vi=((x%1000)%100)%10 = 7
Dựa vào các phép chia như trên ta có chương trình trong phần 2 được cải tiến như sau:
#include <AT89x51.h>
unsigned char led[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char nghin,tram,chuc,dv; // khai báo biến nghin, chuc, tram,dv để sử dụng
unsigned int x=2017; // Khai báo biến x, chỉ cần thay giá trị biến x, chương trình sẽ tự động tính toán, hiển thị
void TRE(unsigned int n)
{
unsigned int i,j;
for(i=n;i>0;i--)
{
for(j=200;j>0;j--);
}
}
void TT() // CHương trình con tách phần nghìn, trăm, chục, dv
{
nghin=x/1000;
tram=(x%1000)/100;
chuc=((x%1000)%100)/10;
dv =((x%1000)%100)%10;
}
void main()
{
TT(); // Gọi chương trình tính toán
while(1)
{
P3=0x01; //bat den 1
P2=led[nghin]; // Hiển thị phần nghìn
TRE(1);
P3=0x02; //bat den 2
P2=led[tram]; Hiển thị phần trăm
TRE(1);
P3=0x04; //bat den3
P2=led[chuc]; // Hiển thị phần chục
TRE(1);
P3=0x08; // Bật đèn 4
P2=led[dv]; //Hiển thị phần đơn vị
TRE(1);
}
}