功能是一个口输出4盏灯,按下按钮,4盏灯按二进制+1,用上升沿触发。
我想做一个小实验来实现这个功能,将来要设计更多按键,因此不能用中断,我就用逻辑来实现判断。但是做出来以后,按下键,有时候起作用,有时候不起作用QAQ
求指导代码QAQ
/******
按键计数功能函数,PC0接按键,按键后,在上升沿,PD[0:3]四位显示二进制+1。
******/
#include <iom16v.h>
#include <macros.h>
/*****
延时函数,最小1ms。使用T/C0,8M内置时钟或等值外部晶振
****/
void delayms(unsigned int j)
{
unsigned int i;
TCCR0 = 0x00; //stop
OCR0 = 0x7D; //set compare
TCCR0 = 0x03; //start timer
for(i=0;i<j;i++)
{
TCNT0 = 0x83; //set count
while(TCNT0!=0XFF);
}
}//延时函数结束
/******
计数进位功能,在PD[0:3]显示
******/
void count(unsigned int i)
{
if(i)
{
if(PORTD==0x0f)
PORTD=0x00;//计到1111归零
else
PORTD=PORTD+1;
}
}//计数功能函数结束
void main(void)
{
unsigned int qn=0,qn1=0,qn2=0; //qn是未防抖的现在状态,qn1是经过防抖检测的现在状态,qn2是前一个状态。
DDRD=0xff;
PORTD=0x03;
DDRC=0x00;//PD[0:3]实现功能,PD[4:5]显示qn1和qn2的实时状态以做参考
while(1)
{
//防抖
qn=(PINC&0x01);
if(!qn)
qn1=0;
else
{
delayms(50);
if(qn)
qn1=1;
}//防抖结束
if(qn1&&!qn2)//上升沿(现在状态1,前一状态0)
{
count(1);
delayms(10);
}
//主要功能结束
qn2=(PINC&0x01);//记录下一个循环的qn2
}
}
|