本帖最后由 pzsh 于 2021-9-4 23:51 编辑
大佬们好!我用ATTINY24A做一个按键控制IO输出的功能。
功能是:开机后,按键控制一个IO输出电平切换,依次为:高电平---》方波---》低电平。每按一次键,切换一种状态.如此循环,不停的检测按键输入。
我的问题是:
1、只做 高---低 电平输出切换时,按键消抖好像没作用,大约有20%-30%次的按键按下后没作用。(调不同的DELAY时间,有变化,但不解决问题)
2、加入方波输出 那一段代码后,程序卡死了一直输出方波,按键无效。
在下是菜鸟,调了很长时间都没有进展。
贴上原代码如下,请路过大佬们帮忙指点一下。谢谢!
#include <avr/io.h>
void delay (unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1000;j++);
}
}
/////////////////////////////////////////////////////////////////////
int main(void)
{
unsigned char temp=0;
// unsigned char count = 0;
unsigned char V6=0;
DDRB = 0x0F;
PORTB = 0x00;//初始化,输出低
while(1)
{
temp = (PINA & (_BV(DDA0))); //KEY按下 检测
delay(2);
while(!(PINA & (_BV(DDA0))));//KEY释放 检测
delay(2);
switch(V6)
{
case 0:
if((temp==0)&&(V6==0))
{
V6=1;
DDRB = 0x0F;
PORTB = 0x01; //输出高
}
else
{
V6=0;
DDRB = 0x0F;
PORTB = 0x00; //输出保持低
}
break;
////////////////////////////////////////////////////////////////////////
case 1:
if((temp==0)&&(V6==1))
{
V6=2;
while (1)//输出方波
{
DDRB = 0x0F;
PORTB = 0x00; //输出低
delay(10);
DDRB = 0x0F;
PORTB = 0x01; //输出高
delay(10);
if(temp==0)
break;
}
}
else
{
V6=1;
DDRB = 0x0F;
PORTB = 0x01; //输出保持高
}
break;
///////////////////////////////////////////////////////////////////////
case 2:
if((temp==0)&&(V6==2))
{
V6=0;
DDRB = 0x0F;
PORTB = 0x00; //输出低
}
else
{
V6=1;
DDRB = 0x0F;
PORTB = 0x01; //输出保持高
}
break;
default:
{
DDRB = 0x0F;
PORTB = 0x00; //输出低
}
}
}
return 0;
}
|