标题:
51单片机按键问题
[打印本页]
作者:
Afan的单片机
时间:
2017-11-7 22:54
标题:
51单片机按键问题
有两个关于按键的问题请教大家:
1.unsigned char key=0;key=0xff&P1;
这是检测按键语句,为什么改为signed就全为高电平了?
2.有按键按下就需要xiaodou,一种是延时 比如:
if(key==0xfd)
{
delayms(200);
if(key==0xfd)
TR0=~TR0;}
一种是 if(key==0xfd)
{
TR0=~TR0;}
while(!什么来着)
我看书上在写按键流水灯时是直接switch(P1&0xff),然后到相应的语句,很是疑惑哎,不求甚解。
谢谢。
作者:
wulin
时间:
2017-11-8 07:40
你这是按键扫描程序的简短写法,多个按键不必一个一个的写。
1.unsigned char key=0;key=0xff&P1; 定义一个无符号字符型数据变量key,它的值由P1口状态赋予。
你改成有符号字符型数据不符合应用规则,当然出错。
2.按键按下就需要消抖,这是用软件消除按键的机械特性带来的电气干扰,方法有多种,delay是最初级的方法。
这是在P1的低4位接4个独立按键的扫描程序示例,供参考
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define key (P1 & 0x0f) //按键端口宏定义(P1的低4位)
//sbit key1=P1^0; //按键1定义
//sbit key2=P1^1; //按键2定义
//sbit key3=P1^2; //按键3定义
//sbit key4=P1^3; //按键4定义
sbit led1=P3^6; //led1端口
sbit led2=P3^5; //led2端口
sbit led3=P3^4; //led3端口
sbit led4=P3^3; //led4端口
void keyscan() //按键扫描程序
{
static bit sign=0; //按键有效标志
static uint count=0; //消抖计数变量
uchar num=0; //临时变量
if(key!=0x0f) //检测有键按下
{
count++; //消抖计数
if(count>=1000) //100~1000,根据主循环周期调整约10~20ms
{
count=1000; //防止溢出
if(sign==0) //测试按键有效标志0
{
sign=1; //按键有效标志置1
num=key; //保存P1低4位值0000 xxxx ,x为0或1
switch(num)
{
case 0x0e: led1=~led1; break;
case 0x0d: led2=~led2; break;
case 0x0b: led3=~led3; break;
case 0x07: led4=~led4; break;
default: break;
}
}
}
}
else //键抬起
{
sign=0; //按键有效标志清0
count=0; //消抖计数清0
}
}
void main()
{
while(1) //程序循环执行
{
keyscan(); //按键扫描,子函数
}
}
作者:
除夕吃汤圆
时间:
2017-11-8 09:51
个人建议哦,不要使用按键了,麻烦!你直接用编码器吧,可以实现按键所有的功能!
作者:
Afan的单片机
时间:
2017-11-9 08:33
wulin 发表于 2017-11-8 07:40
你这是按键扫描程序的简短写法,多个按键不必一个一个的写。
1.unsigned char key=0;key=0xff&P1; 定义一 ...
不符合应用规则??什么意思呢
作者:
ljchip
时间:
2017-11-9 09:40
这个程序是教学用的,不是真正实际项目开发用的。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1