闪烁按钮
大家好,我想实现按一下P3.5按钮,P2.7灯一直闪烁。
再按一下P3.5按钮,灯全部关闭。
这个程序怎么写,现在关不了!!!头疼
加一个标志位取判断
vois main()
{
while(1)
{
if(!P35)
{
Delay1ms(20);
if(!P35)
{
Flash_En = !Flash_En;
while(!P35);
}
}
if(Flash_En)
{
P27 = !P27;
Delay1000ms(1);
}
else
{
P27 = 1;
}
}
}
Lkck8210 发表于 2024-8-5 14:07
加一个标志位取判断
感觉这样都点复杂阿,while 嵌套是不是有弊端? 这不if(!P35)退出后if(!P35&P27)立马又成立了 DEVIN_LI 发表于 2024-8-5 14:15
感觉这样都点复杂阿,while 嵌套是不是有弊端?
这个容易做,
闪灯不要用大延时,声明大循环计数器变量和闪灯频率计数器,大循环计数器做时间基准,再声明个闪灯标志,按键有效就把闪灯标志取反,
大循环里不断判断闪灯标志,若闪灯标志有效就处理闪灯部分,否则关闭灯,
闪灯部分利用闪灯计数器作判断,闪灯计数器大于某值就亮灯,小于某值就灭灯,
这种简单的时间片断处理方式没有大延时影响主循环运行,不影响其他功能处理,是很常用的手法 这个AI就能生成吧,建议最后加个while (!P35)等待按键释放。 本帖最后由 网老四 于 2024-8-5 15:24 编辑
uint main_loop_count=0;//大循环计数器,作为软件定时基准,备用
uint flash_count=0; //闪灯计数器
bit LED_flash_flag=0; //闪灯标志
bit P35_old;//按键状态缓存
void main(void)
{
while(1)
{
if((P35==0)&&(P35_old==1))LED_flash_flag=!LED_flash_flag; //检测按键按下前沿,闪灯标志取反
P35_old=P35; //保存当前按键状态
if((LED_flash_flag)&&(flash_count<1000))P27=0;//亮灯
else P27=1; //灭灯
(flash_count<2000)?(flash_count++):(flash_count=0); //闪灯计数器累加并限幅,控制闪灯占空比和周期
main_loop_count++; //大循环计数器累加
Delay_ms(1); //粗略的大循环周期控制,也可以改用硬件定时器嘀嗒计数来实现精确控制
}
}
感谢各位指导{:handshake:} 网老四 发表于 2024-8-5 15:12
详细
页:
[1]
2