标题:
K1能用K2不能用,新手调不出来望大佬指教,我把单片机代码发出来了
[打印本页]
作者:
JXN.520
时间:
2021-8-10 15:36
标题:
K1能用K2不能用,新手调不出来望大佬指教,我把单片机代码发出来了
#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;
}
}
}}}
作者:
JXN.520
时间:
2021-8-10 15:39
需要解决的问题,想要实现蓝牙跟实体按键都能控制的开关,同时具有反馈功能
作者:
lkc8210
时间:
2021-8-10 18:01
你把key2 那段代码放进了key1里了
作者:
§uperЦser
时间:
2021-8-10 20:16
key1是有一个常态的,不是1就是0,不能混用。应该按照自己的要求,为程序作适当的删减
作者:
wulin
时间:
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;
}
}
}
}
作者:
Jiang_YY
时间:
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;
}
}
}
作者:
sustlixin
时间:
2021-8-11 10:02
你的按键是按下和松开都有操作,但是你的程序逻辑太过简单,且有点混乱
作者:
kcwolf
时间:
2021-8-11 10:39
写程序的时候注意格式,注意统一缩进,这样子才不会混乱。你的程序,缩进混乱,大括号写得随意,所以把自己看混了。正常应该是
{key1==0}
{key1==1}
{key2==0}
{key2==1}
四个独立的并列程序段,你的程序互相嵌套了,整理下。
另外,建议学习循环扫描按键的方式,实际程序应用不会用延时消抖的。
Honeyview_新點陣圖影像.png
(48.7 KB, 下载次数: 68)
下载附件
大括号
2021-8-11 10:35 上传
作者:
Letitia
时间:
2021-8-11 13:06
key == 0 触发就不要写key == 1了
作者:
Letitia
时间:
2021-8-11 13:07
key1 == 0 能触发,但如果你key1 == 0不触发就一直进key == 1里面了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1