情非得已V 情非得已V
关注数: 220 粉丝数: 1,670 发帖数: 2,730 关注贴吧数: 24
求助:按键控制8个led灯的亮度变化过程 想要的结果是按一个键显示1个灯,但是现在的结果显示是按了下一个键后上一次灯的状态不会消失,按了8个键8个灯都亮了。 请问大家怎么回事啊? #include <reg52.h> sbit D1=P1^0; sbit D2=P1^1; sbit D3=P1^2; sbit D4=P1^3; sbit D5=P1^4; sbit D6=P1^5; sbit D7=P1^6; sbit D8=P1^7; unsigned char HighRH = 0; unsigned char HighRL = 0; unsigned char LowRH = 0; unsigned char LowRL = 0; unsigned char T1RH = 0; unsigned char T1RL = 0; unsigned long PeriodCnt = 0; unsigned char s1,s2,s3,s4,s5,s6,s7,s8; void ConfigTimer1(unsigned int ms); void ConfigPWM(unsigned int fr, unsigned char dc); void main() { EA = 1; ConfigPWM(100, 0); ConfigTimer1(60); while (1); } void KeyScan() { unsigned char i,j; P3=0xfe; if(P3!=0xfe) { for(i=1;i>0;i--) for(j=110;j>0;j--); if(P3!=0xfe) { switch(P3) { case 0xee:while(P3!=0xfe);s1=1;P1=0xfe;break; case 0xde:while(P3!=0xfe);s2=1;P1=0xfd;break; case 0xbe:while(P3!=0xfe);s3=1;P1=0xfb;break; case 0x7e:while(P3!=0xfe);s4=1;P1=0xf7;break; } } } P3=0xfd; if(P3!=0xfd) { for(i=1;i>0;i--) for(j=110;j>0;j--); if(P3!=0xfd) { switch(P3) { case 0xed:while(P3!=0xfd);s5=1;P1=0xef;break; case 0xdd:while(P3!=0xfd);s6=1;P1=0xdf;break; case 0xbd:while(P3!=0xfd);s7=1;P1=0xbf;break; case 0x7d:while(P3!=0xfd);s8=1;P1=0x7f;break; } } } } void ConfigTimer1(unsigned int ms) { unsigned long tmp; tmp = 11059200 / 12; tmp = (tmp * ms) / 1000; tmp = 65536 - tmp; tmp = tmp + 12; T1RH = (unsigned char)(tmp>>8); T1RL = (unsigned char)tmp; TMOD &= 0x0F; TMOD |= 0x10; TH1 = T1RH; TL1 = T1RL; ET1 = 1; TR1 = 1; } void ConfigPWM(unsigned int fr, unsigned char dc) { unsigned int high, low; PeriodCnt = (11059200/12) / fr; high = (PeriodCnt*dc) / 100; low = PeriodCnt - high; high = 65536 - high + 12; low = 65536 - low + 12; HighRH = (unsigned char)(high>>8); HighRL = (unsigned char)high; LowRH = (unsigned char)(low>>8); LowRL = (unsigned char)low; TMOD &= 0xF0; TMOD |= 0x01; TH0 = HighRH; TL0 = HighRL; ET0 = 1; TR0 = 1; } void AdjustDutyCycle(unsigned char dc) { unsigned int high, low; high = (PeriodCnt*dc)/100; low = PeriodCnt - high; high = 65536 - high + 12; low = 65536 - low + 12; HighRH = (unsigned char)(high >> 8); HighRL = (unsigned char)high; LowRH = (unsigned char)(low >> 8); LowRL = (unsigned char)low; } void InterruptTimer0() interrupt 1 { KeyScan(); if(s1==1) { if (D1 == 0) { TH0 = HighRH; TL0 = HighRL; D1 = 1; } else { TH0 = LowRH; TL0 = LowRL; D1 = 0; } } if(s2==1) { if (D2 == 0) { TH0 = HighRH; TL0 = HighRL; D2 = 1; } else { TH0 = LowRH; TL0 = LowRL; D2 = 0; } } if(s3==1) { if (D3 == 0) { TH0 = HighRH; TL0 = HighRL; D3 = 1; } else { TH0 = LowRH; TL0 = LowRL; D3 = 0; } } if(s4==1) { if (D4 == 0) { TH0 = HighRH; TL0 = HighRL; D4 = 1; } else { TH0 = LowRH; TL0 = LowRL; D4 = 0; } } if(s5==1) { if (D5 == 0) { TH0 = HighRH; TL0 = HighRL; D5 = 1; } else { TH0 = LowRH; TL0 = LowRL; D5 = 0; } } if(s6==1) { if (D6 == 0) { TH0 = HighRH; TL0 = HighRL; D6 = 1; } else { TH0 = LowRH; TL0 = LowRL; D6 = 0; } } if(s7==1) { if (D7 == 0) { TH0 = HighRH; TL0 = HighRL; D7 = 1; } else { TH0 = LowRH; TL0 = LowRL; D7 = 0; } } if(s8==1) { if (D8 == 0) { TH0 = HighRH; TL0 = HighRL; D8 = 1; } else { TH0 = LowRH; TL0 = LowRL; D8 = 0; } } } void InterruptTimer1() interrupt 3 { unsigned char code table[16] = { 99,98,97,95,93,90,86,81,74,68,60,51,41,30,18,5 }; static bit dir = 0; static unsigned char index = 0; unsigned char i=0; TH1 = T1RH; TL1 = T1RL; AdjustDutyCycle(table[index]); if(dir == 0) { index++; if(index >= 15) { dir = 1; } } else { index--; if(index == 0) { dir = 0; } } } #include <reg52.h> sbit D1=P1^0; sbit D2=P1^1; sbit D3=P1^2; sbit D4=P1^3; sbit D5=P1^4; sbit D6=P1^5; sbit D7=P1^6; sbit D8=P1^7; unsigned char HighRH = 0; unsigned char HighRL = 0; unsigned char LowRH = 0; unsigned char LowRL = 0; unsigned char T1RH = 0; unsigned char T1RL = 0; unsigned long PeriodCnt = 0; unsigned char s1,s2,s3,s4,s5,s6,s7,s8; void ConfigTimer1(unsigned int ms); void ConfigPWM(unsigned int fr, unsigned char dc); void main() { EA = 1; ConfigPWM(100, 0); ConfigTimer1(60); while (1); } void KeyScan() { unsigned char i,j; P3=0xfe; if(P3!=0xfe) { for(i=1;i>0;i--) for(j=110;j>0;j--); if(P3!=0xfe) { switch(P3) { case 0xee:while(P3!=0xfe);s1=1;P1=0xfe;break; case 0xde:while(P3!=0xfe);s2=1;P1=0xfd;break; case 0xbe:while(P3!=0xfe);s3=1;P1=0xfb;break; case 0x7e:while(P3!=0xfe);s4=1;P1=0xf7;break; } } } P3=0xfd; if(P3!=0xfd) { for(i=1;i>0;i--) for(j=110;j>0;j--); if(P3!=0xfd) { switch(P3) { case 0xed:while(P3!=0xfd);s5=1;P1=0xef;break; case 0xdd:while(P3!=0xfd);s6=1;P1=0xdf;break; case 0xbd:while(P3!=0xfd);s7=1;P1=0xbf;break; case 0x7d:while(P3!=0xfd);s8=1;P1=0x7f;break; } } } } void ConfigTimer1(unsigned int ms) { unsigned long tmp; tmp = 11059200 / 12; tmp = (tmp * ms) / 1000; tmp = 65536 - tmp; tmp = tmp + 12; T1RH = (unsigned char)(tmp>>8); T1RL = (unsigned char)tmp; TMOD &= 0x0F; TMOD |= 0x10; TH1 = T1RH; TL1 = T1RL; ET1 = 1; TR1 = 1; } void ConfigPWM(unsigned int fr, unsigned char dc) { unsigned int high, low; PeriodCnt = (11059200/12) / fr; high = (PeriodCnt*dc) / 100; low = PeriodCnt - high; high = 65536 - high + 12; low = 65536 - low + 12; HighRH = (unsigned char)(high>>8); HighRL = (unsigned char)high; LowRH = (unsigned char)(low>>8); LowRL = (unsigned char)low; TMOD &= 0xF0; TMOD |= 0x01; TH0 = HighRH; TL0 = HighRL; ET0 = 1; TR0 = 1; } void AdjustDutyCycle(unsigned char dc) { unsigned int high, low; high = (PeriodCnt*dc)/100; low = PeriodCnt - high; high = 65536 - high + 12; low = 65536 - low + 12; HighRH = (unsigned char)(high >> 8); HighRL = (unsigned char)high; LowRH = (unsigned char)(low >> 8); LowRL = (unsigned char)low; } void InterruptTimer0() interrupt 1 { KeyScan(); if(s1==1) { if (D1 == 0) { TH0 = HighRH; TL0 = HighRL; D1 = 1; } else { TH0 = LowRH; TL0 = LowRL; D1 = 0; } } if(s2==1) { if (D2 == 0) { TH0 = HighRH; TL0 = HighRL; D2 = 1; } else { TH0 = LowRH; TL0 = LowRL; D2 = 0; } } if(s3==1) { if (D3 == 0) { TH0 = HighRH; TL0 = HighRL; D3 = 1; } else { TH0 = LowRH; TL0 = LowRL; D3 = 0; } } if(s4==1) { if (D4 == 0) { TH0 = HighRH; TL0 = HighRL; D4 = 1; } else { TH0 = LowRH; TL0 = LowRL; D4 = 0; } } if(s5==1) { if (D5 == 0) { TH0 = HighRH; TL0 = HighRL; D5 = 1; } else { TH0 = LowRH; TL0 = LowRL; D5 = 0; } } if(s6==1) { if (D6 == 0) { TH0 = HighRH; TL0 = HighRL; D6 = 1; } else { TH0 = LowRH; TL0 = LowRL; D6 = 0; } } if(s7==1) { if (D7 == 0) { TH0 = HighRH; TL0 = HighRL; D7 = 1; } else { TH0 = LowRH; TL0 = LowRL; D7 = 0; } } if(s8==1) { if (D8 == 0) { TH0 = HighRH; TL0 = HighRL; D8 = 1; } else { TH0 = LowRH; TL0 = LowRL; D8 = 0; } } } void InterruptTimer1() interrupt 3 { unsigned char code table[16] = { 99,98,97,95,93,90,86,81,74,68,60,51,41,30,18,5 }; static bit dir = 0; static unsigned char index = 0; unsigned char i=0; TH1 = T1RH; TL1 = T1RL; AdjustDutyCycle(table[index]); if(dir == 0) { index++; if(index >= 15) { dir = 1; } } else { index--; if(index == 0) { dir = 0; } } }
1 下一页