chào mọi người! mình có viết đoạn code để đổi chế độ và tăng giảm tốc độ nháy cho led. nhưng nó bị lỗi ở doạn gọi hàm ngắt ngoài, cụ thể là mình định cho nó chạy tăng hoặc giảm từ từ khi gọi hàm ngắt, nhưng khi bấm lần đầu nó đã tăng hoặc giảm đến mức cao nhất hoặc thấp nhất luôn rồi. mọi người xem code và cho mình xin ý kiến! cám ơn mọi người!
Code:
#include <REGX51.H> #include <stdio.h> char chi[4] = {0x7e, 0x3c, 0x18, 0x00 }; // mang char duoi[8] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe }; // mang char don[10] = {0xe7,0xdb, 0xbd, 0x7e, 0x66, 0x5a, 0x3c, 0x24, 0x18, 0x00 }; int i; int j; int dem=0; int good=0; unsigned long thoigian=5000; void tre(unsigned long time) // ham tao tre { while(time--); // dem giam dan tu time khi nao den 0 thi thoat ham tre } void baoanh1(void) interrupt 2 { thoigian=thoigian+1000; } void baoanh2(void) interrupt 0 { if(thoigian!=0) thoigian=thoigian-1000; } void ledtang() //ham tao hieu ung led tang { for(i=0; i<=8; i++) { P2= 0xff << i; tre(thoigian); } } void ledgiam() { for(i=0; i<=8; i++) { P2= 0xff >> i; tre(thoigian); } } void baoanh() //ham tao hieu ung bao anh { for(i=0; i<=3; i++) { P2= chi[i]; tre(thoigian); } } void nhay() // ham tao hieu ung nahy lien tuc 3 lan day led { P2=0x00; tre(thoigian); P2=0xff; tre(thoigian); } void nhaychanle() // ham tao hieu ung nhay chan le { P2=0xaa; tre(thoigian); P2=~0xaa; tre(thoigian); } void leddon() // ham tao hieu ung led don { for(i=0; i<=9; i++) { P2=don[i]; tre(thoigian); } } main() { IE=0x85; TMOD=0x60; TH1=0xFA; TL1=0xFA; P3_5=1; TR1=1; while(1) { switch(TL1) { case 0xFA: ledtang(); break; case 0xFB: ledgiam(); break; case 0xFC: baoanh(); break; case 0xFD: nhay(); break; case 0xFE: nhaychanle(); break; default: leddon(); } } }
Comment