51单片机A2 发表于 2023-1-5 12:42:53

51开发板A2,独立按键的连续扫描问题

      当使用独立按键的连续扫描时,这个LED灯,在按键连续按下时,有时会持续亮松开按键灭;有时松开按键还是一直亮,多操作几次才会灭。请问这是什么原因啊?


#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LED1=P2^0;

u8 gsmg_code={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴0~F
#define lcd P0

void Timedelay(u8 count_us)
{
        while(count_us--);
}

u8 key_scan(u8 mode)
{
        static u8 key=1;
        if(mode) key=1;
        if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
        {
                Timedelay(1000);//这里按键采用机械键盘,需要消抖,通过延时滤过这段时间5~10ms
                key=0;
               if(KEY1==0) return 1;
                else if(KEY2==0) return 2;
                else if(KEY3==0) return 3;
                else if(KEY4==0) return 4;
        }
        else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
                key=1;
        return 0;
}


void main()
{       
        u8 key=0,i=0;
        while(1)
        {
                key=key_scan(1);       
                if(key==1) LED1=!LED1;
        }
}



AOEG8 发表于 2023-2-10 17:15:45

因为key=key_scan(1);“1”的模式为连续扫描,括号内写成“0”才是单次扫描,才会按一次实现一次亮灭反转。你的程序处于在连续扫描模式,在该模式下,程序功能为按键按下灯光反转,所以按下时led会不断反转,高频闪,显示为一直亮,但亮度较低,而且在松开时,灯的状态就会出现随机的两种状态。
页: [1]
查看完整版本: 51开发板A2,独立按键的连续扫描问题