数码之家

 找回密码
 立即注册
搜索
查看: 771|回复: 5

[C51] 请问这个程序如何做到通过按键重置计数器点亮LED

[复制链接]
发表于 2022-5-3 15:20:31 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个程序功能是key1按键按住不放,LED点亮延时10秒后关闭,松开key1按键LED关闭状态。

但是要加入一个功能,怎么在程序中加入key1按键断开, 然后key1按键又接通,程序又重新从1秒开始计时到10秒然后断开。


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit  key1=P3^4;//用P1.0做按键1输入

sbit  led1=P3^3;//定义输出1



void delay(uint n) {//
    uint aa,bb;
    for(aa=0;aa<n;aa++){
        for(bb=0;bb<850;bb++)
            ;
}
}
void main(void)
{
  while(1)
    {
       if(key1==1)
          {
             delay(30);//如果按键松开就延时30毫秒去抖动再判断
             if(key1==1)
               {

                               
                                        led1 = 1;//输出取反


                  while(!key1);//按键不放就死循环

}                                                           

     }





if(key1==0)
          {
             delay(30);//如果按键按下就延时30毫秒去抖动再判断
             if(key1==0)
               {

                  led1 = 0;//输出取反
                 delay(9999);//延时
                                led1 = 0;//输出取反
                  while(!key1);//按键不放就死循环
               }                                                           
          }



     }
}

发表于 2022-5-3 22:14:20 | 显示全部楼层
增加个逻辑处理,应该不难吧
回复 支持 反对

使用道具 举报

发表于 2022-5-3 22:34:29 来自手机浏览器 | 显示全部楼层
这程序能达到你的初始目标?死循环阻塞怎么判断10秒?死循环前没有熄灯,怕啥按住不松就一直亮吧。加个定时器吧,起码也弄个循环,里面变量计数,完事清零不就重新开始了,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-3 23:03:52 来自手机浏览器 | 显示全部楼层
ks11900 发表于 2022-5-3 22:14
增加个逻辑处理,应该不难吧

不懂 怎么加
回复 支持 反对

使用道具 举报

发表于 2022-5-4 11:42:57 | 显示全部楼层
全局加变量 keydown,
单独写一个KEYCL()函数,
函数里检查按键状态, 如果按下则 keydown=1,否则=0
然后再检查keydown状态
回复 支持 反对

使用道具 举报

发表于 2022-6-7 16:26:10 | 显示全部楼层
  1. #include <reg52.h>
  2. //STC89C52: Code:8k Ram:512 xdata:256 EEProm:5k Addr:0x2000 T0/T1/T2

  3. typedef         unsigned char        u8;  //0 to 255
  4. typedef         unsigned int        u16;  //0 to 65535
  5. typedef         unsigned long        u32;  //0 to 4294967295

  6. sbit  key1 = P3 ^ 4; //用P1.0做按键1输入
  7. sbit  led1 = P3 ^ 3; //定义输出1

  8. void Delay1ms()                //@12.000MHz
  9. {
  10.     unsigned char i, j;

  11.     i = 2;
  12.     j = 239;
  13.     do
  14.     {
  15.         while (--j);
  16.     } while (--i);
  17. }
  18. u16 DelayCnt = 0;
  19. void main()
  20. {
  21.     while (1)
  22.     {
  23.         if(!key1)
  24.         {
  25.             if(DelayCnt < 10030)DelayCnt++;
  26.             if(DelayCnt > 30 && DelayCnt < 10030)
  27.                 led1 = 0;
  28.             else
  29.                 led1 = 1;
  30.         }
  31.         else
  32.                                 {
  33.             led1 = 1;
  34.                                                 DelayCnt = 0;
  35.                                 }
  36.         Delay1ms();
  37.     }
  38. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-6 03:49 , Processed in 0.093600 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表