PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Quét LED 7 đoạn (http://www.picvietnam.com/forum/showthread.php?t=7611)

thanh_nam1977 27-12-2010 01:28 AM

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 đỡ

lambaotrung 30-03-2012 09:49 PM

bác có chương trình mô phỏng protues gởi dc ko bác.


Múi giờ GMT. Hiện tại là 05:40 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam