最近家里买了一个3节LED等连在一起的手电筒,我想设计一个按下按键1,3个LED以流水灯的样子闪烁,按下按键2,LED1亮,按下按键3,LED2亮,按下按键1,LED3亮,查看了大量资料,尝试着自己写了个,但是在独立按键扫描消抖这一块出现问题了,我是根据矩阵按键的程序重新修改的,出现问题后自己努力了几天,网上也找过资料看,还是不懂,大家帮我看看。#include
sbit SW1 = P1^2;
sbit SW2 = P1^3;
sbit SW3 = P1^4;
sbit SW4 = P1^5;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
unsigned char SWSTA[4] = {1,1,1,1};
unsigned char backup[4] = {1,1,1,1};
void main()
{ static unsigned char i=0,j=0;
unsigned char cnt = 0;
EA = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
while (1)
{
for (i=0;i<4;i++)
{
if (backup[i] != SWSTA[i])
{
backup[i] = SWSTA[i];
}
}
}
if ( SWSTA[0] == 0 )
{
P0 = ~(0x01 <
if ( TF0 == 1 )
{
TF0 = 0;
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
}
if (cnt >= 100)
{
cnt = 0;
}
j++ ;
if(j>=3)
{
j = 0;
}
}
if (SWSTA[1] == 0 )
{
LED1 = 0;
}
if (SWSTA[2] == 0 )
{
LED2 = 0;
}
if (SWSTA[3] == 0 )
{
LED3 = 0;
}
}
void interrupTimer()interrupt 1
{static unsigned char i=0;
static unsigned char SWOUT = 0;
TH0 = 0xFC;
TL0 = 0x67;
for ( i=0;i<4;i++ )
{
if(SWSTA[i] & 0x0F == 0x00)
{
SWSTA[i] = 0;
}
else if(SWSTA[i] & 0x0F == 0x0F)
{
SWSTA[i] = 1;
}
}
SWOUT++;
SWOUT = SWOUT & 0x03;
}
还有,我尝试着直接把按键上的状态给LED灯,按键没按下之前是高位状态,按下后是低位状态,把地位状态的值给LED,按说是应该亮的,但就是不亮,我现在也搞不清楚了。
#include
sbit SW1 = P1^2;
sbit SW2 = P1^3;
sbit SW3 = P1^4;
sbit SW4 = P1^5;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
void main()
{
while(1)
{ LED1 = SW1; //按下时为0,对应的LED点亮
LED2 = SW2;
LED3 = SW3; }
}
这个直接控制按键来控制LED亮灭,假入我把while语句里面的改为
if(SW1==0)
{LED1=0;}
else
{LED1=1;}
这样改过后,按下按键1,LED1就亮,不按就不亮,但是改成第二段程序就不亮。
请教下大家,第一个程序的按键扫描与消抖该如何处理,第二个程序我是哪里出错了。