找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助!单片机按键切换不能及时转换的问题

[复制链接]
跳转到指定楼层
楼主
ID:680011 发表于 2020-1-18 20:05 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助应该怎么写才能让按键按一下就能执行对应的程序
按其它按键后都需要按住不放手几秒后才能切换过来,哪位大神帮帮忙指点一下可以快速切换按键执行程序的。
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uint unsigned int
uint i,j;
sbit led0=P1^0;
sbit k1=P2^4;
sbit k2=P2^5;
sbit k3=P2^6;
sbit k4=P2^7;
void DelayUs2x(unsigned char t);//函数声明
void DelayMs(unsigned char t);
void main()
{        

        while(1)
        {
        if(!k1)         //K1按键指令

          DelayMs(10);
          if(!k1)
               
                  
           
         {
                 while(!k1)
                   {  
                k1=0;   
                k2=1;
                k3=1;
                k4=1;
        
                         {led0=0;//释放则执行需要的程序
                        break;}
                                 
                   }
                        
                 }
                 
            
        if(!k2)                 //K2按键指令
        
          DelayMs(10);
          if(!k2)
                     

         {
                 while(!k2)
                   {
                  
                 k2=0;
                 k1=1;        
                 k3=1;
                 k4=1;
        
                         {led0=1;//释放则执行需要的程序
                        for(i=4000;i>0;i--)
                                for(j=110;j>0;j--);        
                     led0=0;
                        for(i=1000;i>0;i--)
                                for(j=110;j>0;j--);        
                        break;}         
                   }
                 
                 }
        if(!k3)          //K3按键指令

          DelayMs(10);
          if(!k3)
               
        
           
         {
                 while(!k3)
                   {
                k3=0;
                k1=1;   
                k2=1;
                k4=1;

                         {led0=1;//释放则执行需要的程序
                        for(i=8000;i>0;i--)
                                for(j=110;j>0;j--);        
                     led0=0;
                        for(i=1000;i>0;i--)
                                for(j=110;j>0;j--);        
                        break;}                  
               }
                 
             }
        if(!k4)           //K4按键指令
        
          DelayMs(1);
          if(!k4)
                     
         {
                 while(!k4)
                   {
                 k4=0;
                 k1=1;
                 k2=1;        
                 k3=1;
                         led0=0;//释放则执行需要的程序
                        for(i=1000;i>0;i--)
                                for(j=110;j>0;j--);        
                     led0=1;
                        for(i=16000;i>0;i--)
                                for(j=110;j>0;j--);        
                        break;         
           }
                  
         }
}
}

void DelayUs2x(unsigned char t)
{   
while(--t);
}
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:687171 发表于 2020-1-19 09:34 | 只看该作者
你需要同时读取几个按键的IO,再根据这个包含了所有按键键值的变量去判断需要执行什么程序。而不是读完一个延时之后再读取另外一个
uint key =0;
key = 0xf0 & P2;
switch(key)
{
        case: 0x80:func(1);
                break;
        case: 0x40: func(2);
                break;
        case: 0x20: func(3);
                break;
        case: 0x10: func(4);
                break;
        default:
                break;
}
//需要判断组合按键再增加对应的case
回复

使用道具 举报

板凳
ID:462827 发表于 2020-1-19 20:42 | 只看该作者
有些东西要放到中断去,那样才能按键马上就作出响应。
回复

使用道具 举报

地板
ID:680011 发表于 2020-1-21 13:11 | 只看该作者
属你最牛 发表于 2020-1-19 09:34
你需要同时读取几个按键的IO,再根据这个包含了所有按键键值的变量去判断需要执行什么程序。而不是读完一个 ...

这样的程序不会写,
回复

使用道具 举报

5#
ID:680011 发表于 2020-1-21 13:13 | 只看该作者
hantu 发表于 2020-1-19 20:42
有些东西要放到中断去,那样才能按键马上就作出响应。

能给个中断发光管的代码吗?研究下
回复

使用道具 举报

6#
ID:680011 发表于 2020-1-21 15:02 | 只看该作者
大哥们加入停止按钮的程序怎么加
回复

使用道具 举报

7#
ID:275826 发表于 2020-1-22 19:22 | 只看该作者
使用阻塞型编程就会出现按键反应慢的问题,程序中一般不要用软件延时子程序
回复

使用道具 举报

8#
ID:680011 发表于 2020-2-22 13:06 | 只看该作者
tyrl800 发表于 2020-1-22 19:22
使用阻塞型编程就会出现按键反应慢的问题,程序中一般不要用软件延时子程序

请问怎么才能有延时还能按键快速启停呀
回复

使用道具 举报

9#
ID:601478 发表于 2020-2-22 16:08 | 只看该作者
用中断扫描,按键可以读一整组IO口也可以独立定义每一个按键后再判断,状态判断用次数累加即可,这样判断单击,双击,长按等比较容易
回复

使用道具 举报

10#
ID:601478 发表于 2020-2-22 16:10 | 只看该作者
论坛里面有很多相关的帖子,搜索按键延时就有一大堆
回复

使用道具 举报

11#
ID:679425 发表于 2020-2-22 16:39 | 只看该作者
按键可以读一整组IO口也可以独立定义每一个按键后再判断
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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