找回密码
 立即注册

QQ登录

只需一步,快速开始

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

K1能用K2不能用,新手调不出来望大佬指教,我把单片机代码发出来了

[复制链接]
跳转到指定楼层
楼主
100黑币
#include <reg52.h>
unsigned char date;
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^4;
sbit key2=P2^5;
sbit key3=P2^6;
sbit LED1=P1^0;
sbit LED2=P1^1;

void delay(uint z);
void Initial_com(void);

void delay(uint z)
{                                                                                                                                                                                          
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}


void Initial_com(void)
{
EA=1;        //开总中断
ES=1;        //允许串口中断
ET1=1;        //允许定时器T1的中断
TMOD=0x20;   //定时器T1,在方式2中断产生波特率
PCON=0x00;   //SMOD=0
SCON=0x50;   // 方式1 由定时器控制
TH1=0xfd;    //波特率设置为9600
TL1=0xfd;
TR1=1;       //开定时器T1运行控制位

}

void main()
{
         Initial_com();
         while(1)
         {
        
          if(key1==0)
                {
                        delay(5);          //消抖动
                        if(key1==0)          //确认触发
                                  {
                             LED1=0;
                                 SBUF=0XA0;
                                 delay(1000);        
                        }
                    if(key1==1)
                {
                        delay(5);          //消抖动
                        if(key1==1)          //确认触发
                 {
                             LED1=1;
                                 SBUF=0X21;
                                  delay(500);
                                 }

                   if(key2==0)
                        {
                         delay(10);
                         if(key2==0)
                         {
                         LED2=0;
             SBUF=0X20;
             delay(1000);
                         }
                         if(key2==1)
                   {
                   delay(10);
                   {
                    LED2=1;
                       SBUF=0X30;
                       delay(500);
}
        }
                }
                  if(RI)         

                  {
                        date=SBUF;    //单片机接收
                        SBUF=date;    //单片机发送
                        RI=0;
                  }
                  }
                                                 }}}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:200488 发表于 2021-8-10 15:39 | 只看该作者
需要解决的问题,想要实现蓝牙跟实体按键都能控制的开关,同时具有反馈功能
回复

使用道具 举报

板凳
ID:161164 发表于 2021-8-10 18:01 | 只看该作者
你把key2 那段代码放进了key1里了

评分

参与人数 1黑币 +15 收起 理由
JXN.520 + 15

查看全部评分

回复

使用道具 举报

地板
ID:959439 发表于 2021-8-10 20:16 | 只看该作者
key1是有一个常态的,不是1就是0,不能混用。应该按照自己的要求,为程序作适当的删减
回复

使用道具 举报

5#
ID:213173 发表于 2021-8-10 20:46 | 只看该作者
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit key1=P2^4;
sbit key2=P2^5;
sbit LED1=P1^0;
sbit LED2=P1^1;

unsigned char date;
void delay(uint z);
void Initial_com(void);

void delay(uint z)
{                                                                                                                                                                                          
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}


void Initial_com(void)
{
        TMOD=0x20;//定时器1方式2(8位重载)
        TH1=0xfd;//定时器1重载
        TL1=0xfd;//定时器1重载
        TR1=1;        //开定时器1
        REN=1;        //允许串行接收
        SM0=0;        //设置串口方式1(8位UART波特率可变)
        SM1=1;        //设置串口方式1(8位UART波特率可变)
}

void main()
{
        Initial_com();
        while(1)
        {
                if(RI)                //查询接收中断请求标志位为1(已收到)
                {
                        RI=0;                //接收中断请求标志位清0
                        date=SBUF;    //单片机接收
                        SBUF=date;    //单片机发送
                        while(!TI);
                        TI=0;
                }
                if(key1==0)
                {
                        delay(5);          //消抖动
                        if(key1==0)          //确认触发
                        {
                                LED1=0;
                                SBUF=0XA0;
                                while(!TI);
                                TI=0;
                                while(!key1);//等待松手       
                                SBUF=0X21;
                                while(!TI);
                                TI=0;
                                LED1=1;
                        }
                }
                if(key2==0)
                {
                        delay(10);
                        if(key2==0)
                        {
                                LED2=0;
                                SBUF=0X20;
                                while(!TI);
                                TI=0;
                                while(!key2);//等待松手       
                                SBUF=0X30;
                                while(!TI);
                                TI=0;
                                LED2=1;
                        }
                }
        }
}

评分

参与人数 1黑币 +30 收起 理由
JXN.520 + 30

查看全部评分

回复

使用道具 举报

6#
ID:959346 发表于 2021-8-10 21:35 | 只看该作者
你key2的处理放到key1的按下处理里面了,所以你要先按着key1,同时按着key2,再松开key1,key2不松开,才能响应key2 。
把key2的处理和串口接收处理放到key1处理的外面,如下
void main()
{
        Initial_com();
        while(1)
        {

                if(key1==0)
        {
                delay(5);          //消抖动
                if(key1==0)          //确认触发
            {
                 LED1=0;
                 SBUF=0XA0;
                 delay(1000);        
            }
            if(key1==1)
            {
                delay(5);          //消抖动
                if(key1==1)          //确认触发
                {
                         LED1=1;
                    SBUF=0X21;
                    delay(500);
                }
                  
                  }
                }
                if(key2==0)
        {
                 delay(10);
                 if(key2==0)
                 {
                         LED2=0;
                         SBUF=0X20;
                         delay(1000);
                   }
            if(key2==1)
                       {
                               delay(10);
                               {
                                LED2=1;
                                   SBUF=0X30;
                                   delay(500);
                                }
                }
              }
              if(RI)         

              {
            date=SBUF;    //单片机接收
            SBUF=date;    //单片机发送
            RI=0;
              }
        }
}

评分

参与人数 1黑币 +30 收起 理由
JXN.520 + 30

查看全部评分

回复

使用道具 举报

7#
ID:386001 发表于 2021-8-11 10:02 | 只看该作者
你的按键是按下和松开都有操作,但是你的程序逻辑太过简单,且有点混乱

评分

参与人数 1黑币 +15 收起 理由
JXN.520 + 15

查看全部评分

回复

使用道具 举报

8#
ID:296833 发表于 2021-8-11 10:39 | 只看该作者
写程序的时候注意格式,注意统一缩进,这样子才不会混乱。你的程序,缩进混乱,大括号写得随意,所以把自己看混了。正常应该是
{key1==0}
{key1==1}
{key2==0}
{key2==1}
四个独立的并列程序段,你的程序互相嵌套了,整理下。
另外,建议学习循环扫描按键的方式,实际程序应用不会用延时消抖的。



评分

参与人数 1黑币 +30 收起 理由
JXN.520 + 30

查看全部评分

回复

使用道具 举报

9#
ID:849376 发表于 2021-8-11 13:06 | 只看该作者
key == 0 触发就不要写key == 1了

评分

参与人数 1黑币 +15 收起 理由
JXN.520 + 15

查看全部评分

回复

使用道具 举报

10#
ID:849376 发表于 2021-8-11 13:07 | 只看该作者
key1 == 0 能触发,但如果你key1 == 0不触发就一直进key == 1里面了

评分

参与人数 1黑币 +15 收起 理由
JXN.520 + 15

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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