找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1534|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机按键问题

[复制链接]
跳转到指定楼层
楼主
ID:245521 发表于 2017-11-7 22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有两个关于按键的问题请教大家:
    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),然后到相应的语句,很是疑惑哎,不求甚解。
谢谢。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 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();   //按键扫描,子函数        
        }
}
回复

使用道具 举报

板凳
ID:247198 发表于 2017-11-8 09:51 | 只看该作者
个人建议哦,不要使用按键了,麻烦!你直接用编码器吧,可以实现按键所有的功能!
回复

使用道具 举报

地板
ID:245521 发表于 2017-11-9 08:33 来自手机 | 只看该作者
wulin 发表于 2017-11-8 07:40
你这是按键扫描程序的简短写法,多个按键不必一个一个的写。
1.unsigned char key=0;key=0xff&P1; 定义一 ...

不符合应用规则??什么意思呢
回复

使用道具 举报

5#
ID:247571 发表于 2017-11-9 09:40 | 只看该作者
这个程序是教学用的,不是真正实际项目开发用的。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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