功能:
外部给PE4高低电平,读取PE4,读到低电平后再读到高电平就计数减一
代码:
u8 a=5; //计数初始值为5
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
delay_init();
LED_Init();
LCD_Init();
LCD_ShowString(30,40,210,24,24,"rest:");
LCD_ShowNum(0,80,a,24,24);
while(1)
{
if(a==0) //当a=0时亮DS1提示,按下KEY1则灭灯
{
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3))
{
GPIO_SetBits(GPIOE,GPIO_Pin_5);
break;
}
}
else
{
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)) //读取到低电平
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //亮灯DS0
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)) //读取到高电平
{
a=a-1; //计数减一
LCD_ShowNum(0,80,a,24,24); //LCD屏上显示此时的数值
GPIO_SetBits(GPIOB,GPIO_Pin_5); //灭灯DS0
}
}
else
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
}
}
}
问题:
烧到开发板上给PE4高低电平,LCD屏上有时候会减一,减一规律不定。
第一次:成功 LCD:4 第二次:成功 LCD:4 第三次:......
成功 LCD:3 失败 LCD:4
失败 LCD:3 成功 LCD:3
成功 LCD:2 成功 LCD:2
失败 LCD:2 失败 LCD:2
成功 LCD:1 成功 LCD:1
成功 LCD:0 成功 LCD:0
但是在软件仿真中还是准确计数的。
求助。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
原因不是很清楚,大概理解为软件和硬件上的差时。
外部接的是光电开关。检测到有挡光后会持续低电平,无挡光是高电平。
我是要获取到有下降沿然后又有上升沿就计数减一。
本来打算用pwm但是不要知道低电平持续时间就放弃了。
break是因为计数到0后要求断另一个设备的电,我还不会就暂时先这样模拟了。
小建议,参考按键消抖的形式,按键松开才算数,尽量把这种函数放在定时器当中做,不要放在主函数,判断类的函数最好不要一直占着CPU,中断中判断成功了置位一个标志给主程序知道就行了
低电平时间不知道的话,能否考虑用中断来做呢?中断资源够用吗?
我刚才的理解可能有点问题,尝试使用先下降沿,再上升沿这种中断的方式来尝试一下吧。
其实我感觉直接配置成下降沿中断也行,看看其他人有什么好办法。
有这么写,只是为了方便问问题就用了原始写法。
谢谢建议。
一周热门 更多>