按下矩阵键盘第一行时以1200bps发送,1,2,3,4,第二行时以2400bps发送5,6,7,8, 第三行以4800bps发
答案:3 悬赏:80 手机版
解决时间 2021-11-25 07:11
- 提问者网友:我没有何以琛的痴心不悔
- 2021-11-24 14:46
按下矩阵键盘第一行时以1200bps发送,1,2,3,4,第二行时以2400bps发送5,6,7,8, 第三行以4800bps发
最佳答案
- 五星知识达人网友:山君与见山
- 2021-11-24 16:05
#include
#include
#define uint unsigned int
#define uchar unsigned char
uint temp;
uchar num,num1,num2,num3,num4;
//================================================================================
//====================子函数声明
void init();
uchar keyboard_scan();
void delay(uint z);
//================================================================================
//====================主函数
//================================================================================
void main()
{
init();
while(1)
{
keyboard_scan();//扫描按键,看那个按键按下
if(num>=1&&num<=4)
{
TH1=0xe8; //波特率1200bps
TL1=0xe8;
TR1=1; //打开串行口中断
delay(200);
SBUF=num; //发送数据
while(!TI); //扫描检查数据是否发送完
TI=0;
TR1=0; //关闭串行口中断
}
else if(num>=5&&num<=8)
{
TH1=0xf4; //波特率2400bps
TL1=0xf4;
TR1=1;
delay(200);
SBUF=num; //发送数据
while(!TI); //扫描检查数据是否发送完
TI=0;
TR1=0; //关闭串行口中断
}
else if(num>=9&&num<=12)
{
TH1=0xfa; //波特率4800bps
TL1=0xfa;
TR1=1;
delay(200);
SBUF=num; //发送数据
while(!TI); //扫描检查数据是否发送完
TI=0;
TR1=0; //关闭串行口中断
}
else if(num>=13&&num<=16)
{
TH1=0xfd; //波特率9600bps
TL1=0xfd;
TR1=1;
delay(200);
SBUF=num; //发送数据
while(!TI); //扫描检查数据是否发送完
TI=0;
TR1=0; //关闭串行口中断
}
// calculate();
// display();
}
}
//================================================================================
//====================init初始化函数
void init()
{
TMOD=0x20; //T1为工作方式2,10位异步收发(8位数据)
// TR1=1; //开T1中断
SM0=0; //SCON设置,串行口为工作方式1,10位异步收发(8位数据)
SM1=1;
REN=1; //允许串行口接收数据
EA=1; //开总中断
// ES=1; //开串行口中断
num=0;
}
//================================================================================
//====================keyscan键盘扫描函数
uchar keyboard_scan()
{
//--------------------第一行扫描==矩阵键盘
P3=0xfe; //给P3口赋初值 P3^0口给低电平
temp=P3; //读取P3口的值
temp=temp&0xf0;
if(temp!=0xf0) //有按键按下,temp不等于0xf0,表示式成立,执行这个if {} 的程序
{
delay(10); //延时消隐
if(temp!=0xf0); //再次判断
{
switch(temp) //temp这个值是temp=temp&0xf0的值,所以下方的case后面的语句也需要注意
{
case 0xe0:num=1;
break;
case 0xd0:num=2;
break;
case 0xb0:num=3;
break;
case 0x70:num=4;
break;
}
}
while(temp!=0xf0) //松手检测;若一直按着按键,temp!=0成立,一直运行{}内的语句
{ //如果无按键按下,P3=0xfe,temp=temp&0xf0=0xf0,那么while(假)跳出while语句
temp=P3;
temp=temp&0xf0;
}
}
//--------------------第二行扫描==矩阵键盘
P3=0xfd; //给P3口赋初值 P3^1口给低电平
temp=P3; //读取P3口的值
temp=temp&0xf0;
if(temp!=0xf0) //有按键按下,temp不等于0xf0,表示式成立,执行这个if {} 的程序
{
delay(10); //延时消隐
if(temp!=0xf0); //再次判断
{
switch(temp) //temp这个值是temp=temp&0xf0的值,所以下方的case后面的语句也需要注意
{
case 0xe0:num=5;
break;
case 0xd0:num=6;
break;
case 0xb0:num=7;
break;
case 0x70:num=8;
break;
}
}
while(temp!=0xf0) //松手检测;若一直按着按键,temp!=0成立,一直运行{}内的语句
{ //如果无按键按下,P3=0xfe,temp=temp&0xf0=0xf0,那么while(假)跳出while语句
temp=P3;
temp=temp&0xf0;
}
}
//--------------------第三行扫描==矩阵键盘
P3=0xfb; //给P3口赋初值 P3^2口给低电平
temp=P3; //读取P3口的值
temp=temp&0xf0;
if(temp!=0xf0) //有按键按下,temp不等于0xf0,表示式成立,执行这个if {} 的程序
{
delay(10); //延时消隐
if(temp!=0xf0); //再次判断
{
switch(temp) //temp这个值是temp=temp&0xf0的值,所以下方的case后面的语句也需要注意
{
case 0xe0:num=9;
break;
case 0xd0:num=10;
break;
case 0xb0:num=11;
break;
case 0x70:num=12;
break;
}
}
while(temp!=0xf0) //松手检测;若一直按着按键,temp!=0成立,一直运行{}内的语句
{ //如果无按键按下,P3=0xfe,temp=temp&0xf0=0xf0,那么while(假)跳出while语句
temp=P3;
temp=temp&0xf0;
}
}
//--------------------第四行扫描==矩阵键盘
P3=0xf7; //给P3口赋初值 P3^3口给低电平
temp=P3; //读取P3口的值
temp=temp&0xf0;
if(temp!=0xf0) //有按键按下,temp不等于0xf0,表示式成立,执行这个if {} 的程序
{
delay(10); //延时消隐
if(temp!=0xf0); //再次判断
{
switch(temp) //temp这个值是temp=temp&0xf0的值,所以下方的case后面的语句也需要注意
{
case 0xe0:num=13;
break;
case 0xd0:num=14;
break;
case 0xb0:num=15;
break;
case 0x70:num=16;
break;
}
}
while(temp!=0xf0) //松手检测;若一直按着按键,temp!=0成立,一直运行{}内的语句
{ //如果无按键按下,P3=0xfe,temp=temp&0xf0=0xf0,那么while(假)跳出while语句
temp=P3;
temp=temp&0xf0;
}
}
return num;
}
//================================================================================
//====================delay 延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
全部回答
- 1楼网友:傲气稳了全场
- 2021-11-24 19:05
。。追问??
- 2楼网友:空山清雨
- 2021-11-24 17:31
百度一下,你就知道!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯