图我就随便画了,暂时没有专业工具。
#include <reg52h>
sbit KEY = P0^1; //定义按键 按键按下时引脚为低
sbit LED = P1^0; //定义LED脚, 当P1^0为低时 灯亮
void delayms(unsigned int times ) //毫秒延时
{
unsigned int i,j;
for(j=0;j<times;j++)
{
for(i=0;i<400;i++)
;
}
}
void main()
{
KEY=1;
LED=1; //初始化按键和灯
while(1)
{
if(KEY==0)
{
delayms(15); //延时15-20MS去抖动
if(KEY==0) LED=0; //此时按键还是低电平表示被按下,灯亮
}
else LED=1; //否则灯不亮
}
}
按键消抖动程序估计有问题,给你看个消抖动的例子程序
while(key1==0)
{
delayms(10);
if(key1==0)
{
num=1;
}
}
if (key==0) 如果按键按下
for(i=0;i<100;i++):利用延时消除抖动
if (key==0) 再次判断按键,如果还是按下状态
( 要执行的语句)则执行相关语句
这是常用的软件消抖方法
#include<reg52h>
bit KEYFlag = 1; //指示按键状态,'1'为d起态,'0'按下态
/
按键去抖
/
void KEYDelay()
{
unsigned char i = 200;
while(i--);
}
/
键翻译
/
unsigned char KEY_Tran(unsigned char Key)
{
switch(Key)
{
case 0xee: return 0; break; //根据按键编码返回对应的键值
case 0xde: return 1; break;
case 0xbe: return 2; break;
case 0x7e: return 3; break;
case 0xed: return 4; break;
case 0xdd: return 5; break;
case 0xbd: return 6; break;
case 0x7d: return 7; break;
case 0xeb: return 8; break;
case 0xdb: return 9; break;
case 0xbb: return 0;break;
case 0x7b: return 0x0b;break;
case 0xe7: return 0x0c;break;
case 0xd7: return 0x0d;break;
case 0xb7: return 0x0e;break;
case 0x77: return 0x0f;break;
default: break;
}
}
/
键扫描
/
unsigned char KEY_Scan()
{
unsigned char KEY_Value;
P2 = 0x0f;
KEY_Value = P2;
P2 = 0xf0;
KEY_Value |= P2;
return KEY_Value;
}
/
查键
/
void KEY()
{
static bit KEYFlag = 1;
static unsigned char KEYCode;
if(KEYFlag)
{
if(KEY_Scan()!=0xff)
{
KEYCode = KEY_Scan();
KEYDelay();//有按键按下延时去抖
if(KEYCode==KEY_Scan())
{
// 键号 = KEY_Tran(KEYCode);
// 此处添加功能模块
KEYFlag = 0;
}
}
}
else
{
if(KEY_Scan()==0xff)
{
KEYDelay();//按键d起延时去抖
if(KEY_Scan()==0xff)
KEYFlag = 1;
}
}
}
以上就是关于单片机STC89C52,P0.1口作为按钮,P1.0连接灯,要求按钮控制灯的亮灭。请设计硬件连接方式和C程序全部的内容,包括:单片机STC89C52,P0.1口作为按钮,P1.0连接灯,要求按钮控制灯的亮灭。请设计硬件连接方式和C程序、怎么用C语言实现51单片机矩阵键盘按一个键后其他键才有用、单片机按键如何消抖等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)