Ðề tài: Quét LED 7 đoạn
View Single Post
Old 27-12-2010, 01:28 AM   #1
thanh_nam1977
Đệ tử 2 túi
 
thanh_nam1977's Avatar
 
Tham gia ngày: Apr 2007
Nơi Cư Ngụ: Ho Chi Minh
Bài gửi: 27
:
Send a message via Yahoo to thanh_nam1977
Quét LED 7 đoạn

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 đỡ
thanh_nam1977 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn