按下矩阵键盘第一行时以1200bps发送,1,2,3,4,第二行时以2400bps发送5,6,7,8, 第三行以4800bps发

2024-12-19 16:46:57
推荐回答(3个)
回答1:

/********************************************************************************
一、要求:
1、按下矩阵键盘第一行时以1200bps发送:1,2,3,4;
2、第二行时以2400bps发送:5,6,7,8;
3、第三行时以4800bps发送:9,10,11,12;
4、第四行时以9600bps发送:13,14,15,16;

5、并且按压发送的数都在数码管上显示(自己添加的)
二、知识点:
1、T1为波特率发生器时,为工作方式2,自动重装。
2、串行口数据接收或发送完成有判断两种方式,一是扫描判断,另一种是中断判断
3、矩阵键盘扫描。
4、在使用 串行口调试助手 时,需要调整界面的波特率
********************************************************************************/
#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;
}

/*
//================================================================================
//====================ser 串行口中断
void ser() interrupt 4
{
}
*/
//================================================================================
//====================delay 延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

回答2:

百度一下,你就知道!

回答3:

。。