按键发送字符串

#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++;
	}    
}
发布了4 篇原创文章 · 获赞 1 · 访问量 578

猜你喜欢

转载自blog.csdn.net/linsenaa/article/details/100587619