Mình viết code điểu khiển 8 LED đơn dùng 89S52 có nút set để thay đổi hiệu ứng LED, up và down để chỉnh tốc độ nháy, sao mà mô phỏng trên proteus thì chạy nhưng khi nạp vào mạch thật thì nhấn nút không được gì hết cả, nhờ các cao thủ giúp đỡ, mình mô phỏng trên proteus 8.
Link code và file mô phỏng:
Code Effect LED With 7 Effect + Button Set Effect + Up+ Down
Link code và file mô phỏng:
Code Effect LED With 7 Effect + Button Set Effect + Up+ Down
Code:
#include <AT89x52.h> #define set P1_7 #define up P1_5 #define down P1_6 unsigned int i,a,b=500; /* Khai báo biến(toàn cục) cho vòng lặp for của các hàm hiệu ứng LED */ unsigned char j=0; /* Khai báo biến (toàn cục) để đếm số lần bấm button */ void delay(unsigned int ts) /* Hàm tạo trễ */ { unsigned int x; unsigned char y; for(x=0;x<ts;x++) { for(y=0;y<125;y++) {;} } } void Led_Effect_0() /* Hàm Effect LED luôn tắt */ { for(i=0;i<2;i++) { P2=0xFF; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } void Led_Effect_1() /* Hàm Effect LED sáng tắt */ { unsigned char EffectLED[]={0x00,0xFF,0x00,0xFF}; for(i=0;i<4;i++) { P2=EffectLED[i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } void Led_Effect_2() /* LED nháy đuổi 2 chiều */ { unsigned char EffectLED[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; for(i=0;i<8;i++) { P2=EffectLED[i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } for(i=0;i<8;i++) { P2=EffectLED[7-i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } void Led_Effect_3() /* LED quét sáng dần 2 chiều */ { unsigned char EffectLED[]={0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00}; for(i=1;i<9;i++) { P2=EffectLED[i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } for(i=0;i<9;i++) { P2=EffectLED[8-i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } void Led_Effect_4() /* LED nháy đuổi từ giữa sang 2 bên và ngược lại */ { unsigned char EffectLED[]={0xE7,0xDB,0xBD,0x7E}; for(i=0;i<4;i++) { P2=EffectLED[i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } for(i=0;i<4;i++) { P2=EffectLED[3-i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } void Led_Effect_5() /* LED sáng chẵn lẻ */ { unsigned char EffectLED[]={0xAA,0x55,0xAA,0x55}; for(i=0;i<4;i++) { P2=EffectLED[i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } void Led_Effect_6() /* LED Dồn Tuần Tự v1.0 */ { unsigned char EffectLED[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7E,0x7D,0x7B,0x77,0x6F,0x5F,0x3F, 0x3E,0x3D,0x3B,0x37,0x2F,0x1F,0x1E,0x1D,0x1B,0x17,0x0F,0x0E,0x0D,0x0B,0x07, 0x06,0x05,0x03,0x02,0x01,0x01,0x00,0xFF}; for(i=0;i<38;i++) { P2=EffectLED[i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } void Led_Effect_7() /* LED Dồn Tuần Tự v2.0 */ { unsigned char EffectLED[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0x7E,0xBE,0xDE,0xEE,0xF6,0xFA,0xFC, 0x7C,0xBC,0xDC,0xEC,0xF4,0xF8,0x78,0xB8,0xD8,0xE8,0xF0,0x70,0xB0,0xD0,0xE0, 0x60,0xA0,0xC0,0x40,0x80,0x80,0x00,0xFF}; for(i=0;i<38;i++) { P2=EffectLED[i]; for(a=b;a>0;a--) { delay(1); if(set==0 || up==0 || down==0) break; } } } unsigned char dem_so_lan_bam_cong_tac() /* Hàm đếm số lần bấm button */ { if(set==0) /* Nếu button được bấm */ { delay(500); /* Trễ 1 khoảng thời gian cho xung nhiễu đi qua */ while(set==0) {;} j++; if(j==9) j=0; } return j; } unsigned int toc_do_effect() { if(up==0) { delay(500); while(up==0) {;} b-=50; } if(down==0) { delay(500); while(down==0) {;} b+=150; } return b; } void Set_Effect(unsigned char so_lan_bam) /* Hàm lựa chọn hiệu ứng LED theo số lần bấm Button */ { switch(so_lan_bam) { case 0: { Led_Effect_0(); break; } case 1: { Led_Effect_1(); break; } case 2: { Led_Effect_2(); break; } case 3: { Led_Effect_3(); break; } case 4: { Led_Effect_4(); break; } case 5: { Led_Effect_5(); break; } case 6: { Led_Effect_6(); break; } case 7: { Led_Effect_7(); break; } case 8: { Led_Effect_1(); Led_Effect_2(); Led_Effect_3(); Led_Effect_4(); Led_Effect_5(); Led_Effect_6(); Led_Effect_7(); break; } } } void main() { while(1) { dem_so_lan_bam_cong_tac(); toc_do_effect(); Set_Effect(j); } }
Comment