51单片机的C语言程序问题

能帮我看看哪里写的不对吗?谢谢各位
一、 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 循环代替了延时函数,提高了代码的执行效率。有用的话给我点个关注就行!谢谢!!!