#include"reg52.h"
#define uchar unsigned char
uchar code kcode[]={
0x77,0x7b,0x7d,0x7e,
0xb7,0xbb,0xbd,0xbe,//16位键盘行翻转法对应键值。
0xd7,0xdb,0xdd,0xde,//对应的键值为0~f
0xe7,0xeb,0xed,0xee};
//不同键值发送的字符串
uchar buf0[4]={0x11,0x12,0x13,0x00};
uchar buf1[5]={0x11,0x12,0x13,0x14,0x00};
uchar buf2[6]={0x11,0x12,0x13,0x14,0x15,0x00};
uchar buf3[7]={0x11,0x12,0x13,0x14,0x15,0x16,0x00};
uchar buf4[8]={0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x00};
//---串口初始化
//T1为波特率发生器,初始化T1
//f=11.0592,baud=9600
//串口中断执行数据发送
void init_comm();
//定义标志位,全局变量
uchar kd; //kd=1表示键闭合,并已经过10ms延时去抖动,已处于稳定状态;
uchar kin; //kin=1表示键值已读到kbuf中,等待处理。
uchar kp; //kp=1表示kbuf中的数据已处理。
uchar kbuf; //保存键值0~16 ;
uchar flag; //开机flag=0;数据有发送flag=1
uchar keys();//判断是否有键按下,有键按下返回1,无键按下返回0
uchar nkey();//16位键盘接P0 键号函数,将键转换为对应的0~F的数值。
void init_T2();//T2为 键盘按键延时消颤,
void dataprocess(uchar k);//数据处理函数
void send(uchar* pbuf);
void main()
{
uchar flag;
uchar k1,k;//初始化T2
init_T2();//初始化串口
init_comm();//开总中断
EA=1;
flag=0;//处理键值
while(1)
{
if(kin==1)
{
ET2=0; //关T2中断
kin=0;//标志复位
kd=0;
P1=~kbuf;//数据处理
ET2=1;
if(flag==0) //连续按相同按键,只发送1此键值
{
flag=1;//程序第一次发送键值
k=kbuf;//记录发送键值
k1=k;
dataprocess(k);//键值发送
}
if(flag==1)
{
k=kbuf; //第一次以后发送键值
if(k!=k1)
{
k1=k;
ES=0;
dataprocess(k);//键值发送
ES=1;
}
}
ET2=1;
}
}
}
//初始化T2
void init_T2()//T2默认自动重载方式,T1作波特率发生器
{
TL2=0x00; //时间常数 ,f=11.0592,延时10ms ,
TH2=0xdc;//计数器需记数9216个脉冲,延时10ms,
RCAP2L=0x00;
RCAP2H=0xdc;
ET2=1; //开T2中断
TR2=1; //启动T2
}
void timer2() interrupt 5//T2的中断程序,功能对各标志位赋值,保存键值
{
TF2=0;//复位中断标志,为下一次中断
//判断有键按下
if(keys()==1) //有键按下
{
if(kd==1) //延时去抖动
{
if(kin==0)//10ms后,检测键还是按下, 保存键值
{
kin=1;//如果上次输入键值处理完毕
kbuf=nkey();//键值保存到kbuf中,此时按键处于稳定按下时期
}
}
//第一次检查到键按下
else
kd=1;//每次检测有键没有键按下,kd复位
}
else
{
kd=0;//判断是否有键按下,
kin=0;//有键按下返回1,无键按下返回0
}
}
uchar keys()//16位键盘接P0
{
uchar a; //如果设置:char a ,程序始终返回1.
P0=0xf0;
a=P0;
if(a==0xf0)
return 0;
else
return 1;
}
uchar nkey()
{
uchar high,low,key,i;
P0=0xf0;
high=P0;
P0=0x0f;
low=P0;
key=high|low;
for(i=0;i<16;i++)
{
if(key==kcode[i])
return i;
}
}
void init_comm()//T1初始化,f=11.0592,baud=9600
{
flag=0;
SCON=0x50;//串口工作方式1,允许串口接收
TMOD=0x20; //T1工作方式2 ,自动重载8位计数器
TH1=0xfd;//T1时间常数
TL1=0xfd;
ES=1;//开串口中断
TR1=1;//启动T1
}
void commfun() interrupt 4//串口中断程序
{
if(RI)//处理接收
{
RI=0;
}
}
void dataprocess(uchar k) //处理发送
{
switch(k)//数据处理函数
{
case 0:
send(buf0);
break;
case 1:
send(buf1);
break;
case 2:
send(buf2);
break;
case 3:
send(buf3);
break;
case 4:
send(buf4);
break;
}
}
void send(uchar* pbuf)
{
while(*pbuf!=0x00)
{
SBUF=*pbuf;
while(TI==0);//发送完成,TI=1
TI=0;
pbuf++;
}
}
按键发送字符串
猜你喜欢
转载自blog.csdn.net/linsenaa/article/details/100587619
今日推荐
周排行