![]() |
![]() |
#1 |
Đệ tử 2 túi
|
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 đỡ |
![]() |
![]() |
|
|