能帮我看看哪里写的不对吗?谢谢各位
一、 P0.0接一手动按钮,按动一次(低电平有效),P3.0动作300ms(低电平有效)之后复位,1S后P3.1动作300ms(低电平有效)之后复位,以此循环
二、 手动按钮重复按动一次,单片机复位
#include "reg52.h"
sbit k1=P0^0;
sbit k2=P3^0;
sbit k3=P3^1;
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
void Delay300Ms(void)
{
unsigned char TempCycA = 4;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
void Delay1000Ms(void)
{
unsigned char TempCycC = 11;
unsigned int TempCycD;
while(TempCycC--)
{
TempCycD=7269;
while(TempCycD--);
}
}
void main()
{
int i = 0;
while(1)
{
if(k1==0)
{
Delay5Ms();//消抖
if(k1==0) //如果K1按键按下
{
i=~i;
if(i==1)
{
k2 =~k2;
Delay300Ms();
k2 =~k2;
Delay1000Ms();
k3 =~k3;
Delay300Ms();
k3 =~k3;
Delay1000Ms();
}else{
k2 = 1;k3 = 1;
}
}
}
}
}
i=~i;
~是按位取反
0取反是FF,不是1
所以后面的if就进不去
把~全部改为!
!是逻辑取反,true变false,false变true
按k1触发动作后进入k2和k3的动作延时后就无法再检测k1按键了,当动作执行完毕后也不能自动循环执行
循环中只有判断手动按钮是否按下的代码,并没有在手动按钮按下后执行相应的操作,导致代码无法实现!
#include "reg52.h"
sbit k1 = P0^0;
sbit k2 = P3^0;
sbit k3 = P3^1;
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
void Delay300Ms(void)
{
unsigned char TempCycA = 4;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB = 7269;
while(TempCycB--);
}
}
void Delay1000Ms(void)
{
unsigned char TempCycC = 11;
unsigned int TempCycD;
while(TempCycC--)
{
TempCycD = 7269;
while(TempCycD--);
}
}
void main()
{
int i = 0;
while(1)
{
if(k1 == 0)
{
Delay5Ms();//消抖
if(k1 == 0) //如果K1按键按下
{
i = ~i;
if(i == 1)
{
while(1)
{
k2 = 0;
Delay300Ms();
k2 = 1;
Delay1000Ms();
k3 = 0;
Delay300Ms();
k3 = 1;
Delay1000Ms();
if(k1 == 0) // 检测手动按钮是否按下
{
Delay5Ms(); // 消抖
if(k1 == 0)
{
i = 0;
k2 = 1;
k3 = 1;
break; // 跳出循环
}
}
}
}
else
{
k2 = 1;
k3 = 1;
}
}
}
}
}
这样改试试,在检测到手动按钮按下后,进入一个无限循环,直到被重复按下,才会跳出循环并复位相关的 GPIO 引脚。另外,我也对代码中的一些细节进行了优化,比如使用 while 循环代替了延时函数,提高了代码的执行效率。有用的话给我点个关注就行!谢谢!!!