Chương trình sau, quét 6 LED 7 đoạn và hiển thị từ 0 đến 999999.
Nếu chỉ cần hiển thị từ 0 đến n, bạn chỉ cần thay lệnh if (t==1000000) bằng lệnh if(t==n+1). Chương trình đã kiểm tra và chạy tốt
Code:
#include <16f877a.h>
#include <def_877A.h>
#fuses hs
#use delay(clock=8000000)
int j,l,temp,b[6],m,i;
int32 k[7],a,t;
Void hienthi(int l);
void kichhoat(int m);
void main()
{
trisD = 0x00;
trisA=0x00;
Porta=0Xff;
Portd=0xff;
t=0;
while(true)
{
a=t;
if (t!=0)
{
for(j=0;j<=5;j++)
{
k[j]=a%10;
a=a/10;
}
//hienthi(k[0]);
for(j=5;j>=0;j--)
{
if (k[j]!= 0)
{
temp=j;
break;
}
}
i=1;
while(i)
{
i--;
for(j=0;j<=temp;j++)
{
hienthi(k[temp-j]);
kichhoat(j);
delay_ms(5);
}
}
//Ket thuc if
}
if (t==0)
{
i=1;
while(i)
{
i--;
Porta=0Xfe;
hienthi(0);
delay_ms(5);
}
}
t++;
if (t==10000000)
t=1;
//Ket thuc vong lap vo tan
}
}
void hienthi(int l)
{
switch(l)
{
case 0:
{
PortD=0xC0;
break;
}
case 1:
{
PortD=0xF9;
break;
}
case 2:
{
PortD=0xA4;
break;
}
case 3:
{
PortD=0xB0;
break;
}
case 4:
{
PortD=0x99;
break;
}
case 5:
{
PortD=0x92;
break;
}
case 6:
{
PortD=0x82;
break;
}
case 7:
{
PortD=0xF8;
break;
}
case 8:
{
PortD=0x80;
break;
}
case 9:
{
PortD=0x90;
break;
}
}
}
void kichhoat(int m)
{
PortA=0xff;
Bit_clear(PortA,m);
}
Bây giờ đã có chương trình hiển thị rồi, ta tiếp tục muốn đọc giá trị nhiệt độ đo từ DS18B20 bằng lệnh ds1820_read(); Sau đó, hiển thị giá trị này lên led 7 đoạn. Vấn đề là do lệnh ds1820_read() có độ trễ khi thực hiện và do thời gian này lâu hơn thời gian ảnh quét LED lưu trên võng mạc nên giá trị hiển thị lên LED 7 đoạn có hiện tượng nhấp nháy. Có ai có kinh nghiệm về việc giải quyết vấn đề này không nhỉ. Xin nhờ giúp đỡ