Điều khiển LED 7 thanh phần 3: Điều khiển hiển thị số bất kỳ
Ở phần 3 chúng ta đã làm bài điều khiển LED 7 thanh sáng một số x bất kỳ, khi đã hiểu và làm được phần 3 thì chuyển sang phần 4 điều khiển LED 7 thanh sáng từ 0 - 9999 rất dễ dàng. Chìa khóa của bài này chính là cho giá trị của x tự động tăng từ 0 – 9999, sau mỗi lần tăng thì ta gọi chương trình con tính toán để tính lại các giá trị nghin, tram, chuc, đơn vị để chương trình hiển thị được chính xác.
Như vậy bình thường chương trình luôn làm nhiệm vụ hiển thị, khi đạt thời gian thì tăng giá trị của x và tính toán lại, sau đó quay lại nhiệm vụ hiển thị:
Sơ đồ:
Chương trình:
# include <AT89x51.h>
unsigned char led[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // Khai báo biến mảng chứa các giá trị hiển thị các số từ 0-9
unsigned char nghin,tram,chuc,dv; // Khai báo biến nghin, tram, chuc, dv để sử dụng trong chương trình
unsigned int x=0; // Khai báo biến x, x là số hiển thị và có giá trị ban đầu bằng 0
unsigned char k; // Khai báo biến k để sử dụng trong chương trình
void TRE(unsigned int n) // Chương trình con tạo trễ
{
unsigned int i,j;
for(i=n;i>0;i--)
{
for(j=200;j>0;j--);
}
}
void TT() // Chương trình con tính toán phân tách số x thành phần nghìn, trăm, chục, đơn vị
{
nghin=x/1000;
tram=(x%1000)/100;
chuc=((x%1000)%100)/10;
dv =((x%1000)%100)%10;
}
void main()
{
P3=0x00; // Tắt tất cả các đèn
TT(); // Gọi chương trình tính toán lần đầu
while(1)
{
P3=0x01; //Bật đèn 1
P2=led[nghin]; // Hiển thị số phần nghìn
TRE(2);
P3=0x02; //Bật đèn 2
P2=led[tram]; // Hiển thị số phần trăm
TRE(2);
P3=0x04; //Bật đèn 3
P2=led[chuc]; // Hiển thị số phần chục
TRE(2);
P3=0x08; //Bật đèn 4
P2=led[dv]; // Hiển thị số phần đơn vị
TRE(2);
k++; // Mỗi lần kết thúc 1 vòng hiển thị tăng giá trị của k thêm 1
if(k>40) // Nếu đoạn mã hiển thị được 40 vòng (khoảng 1s) thì tăng giá trị của x thêm 1 và xóa k về 0 cho lần đếm 40 vòng tiếp theo
{
x++;
k=0;
TT(); // Gọi chương trình tính toán cho số x vì x vừa thay đổi giá trị (tăng thêm 1) nên phải gọi chương trình tính toán lại
if(x>9999) // Nếu x>9999 tức là đếm xong thì xóa x về 0 để đếm lại từ đầu
{
x=0;
}
}
} // Ngoặc kết thúc vòng lặp While
} // Ngoặc kết thúc chương trình chính main