鲸落783 2022-01-21 11:39 采纳率: 14.3%
浏览 43
已结题

关于单片机独立按键实验的问题!


#include"reg52.h"

typedef unsigned int u16;
typedef unsigned char u8;
                                                
sbit K1=P3^1;
sbit LED=P2^0;

#define K1_press 1
#define KEY_UNPRESS 0
void delay(u16 m)
{
  while(m--);
}
u8 key_scan(u8 mode)
{
  static u8 key=1;
  if(mode) key=1;
  if(key==1&&K1==0)
  {
    delay(1000);
    key=0;
    return K1_press;
  }
  else key=1;
  return KEY_UNPRESS;

}
void main()
{
  u8 key=0;
  while(1)
  {
  key=key_scan(0);
  if(key==K1_press)
   LED=!LED;
  }
}

对于这个代码,我的理解是按一下独立按键,LED1就会亮起,再按一下LED就会熄灭。但是实验现象是LED这个亮灭不按套路出牌,找不到规律,所以想问问这是怎么回事

  • 写回答

1条回答 默认 最新

  • suqingxiao 2022-01-21 11:53
    关注

    你没有判断按键抬起,所以会比较快去执行多次按下。
    解决的办法是加一个按键抬起判断,如果有抬起,再进行下次按下判断。

        /******************KEY mode按下 *******************/
        if(MenuKey_Mode==0)//extern
        {
            if(KeyMode_status==0) //确定已经松开
            {        
                KeyMode_counter++;
                if(KeyMode_counter ==5)//消抖
                {
                    if(MenuKey_Mode==0)//再次确认按键按下
                    {KeyMode_counter =0;KeyMode_flag =1;KeyMode_status =1;}    
                }                           
            } 
        } 
        /******************KEY enter松开 *******************/
        if(MenuKey_Mode ==1)//extern
        {
            if(KeyMode_status==1)
            {
                KeyMode_counter++;
                if(KeyMode_counter ==10)
                {
                    if(MenuKey_Mode !=0)
                    {KeyMode_counter =0;KeyMode_flag =0;KeyMode_status =0;}    
                }     
            }    
        } 
    

    如果有帮助请点采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月27日
  • 已采纳回答 1月21日
  • 创建了问题 1月21日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵