1、实现0~f的16位键盘输入功能,将键值由P1口输出。
2、不同的键值串口发送不同的字符串
二、代码
//函数功能
//1.实现0~f的16位键盘功能,将按键表示的数字由数码管显示
//2.定义不同的按键表示发送不同的字符串
#include"reg52.h"
#define uchar unsigned char
//16位键盘行翻转法对应键值。
//对应的键值为0~f
uchar code kcode[]={
0x77,0x7b,0x7d,0x7e,
0xb7,0xbb,0xbd,0xbe,
0xd7,0xdb,0xdd,0xde,
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
//开机flag=0;数据有发送flag=1;
uchar flag;
//判断是否有键按下,
//有键按下返回1,无键按下返回0
//16位键盘接P0
uchar keys();
//键号函数,将键转换为对应的0~F的数值。
uchar nkey();
//T2为 键盘按键延时消颤,
void init_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)
{
//关T2中断
ET2=0;
//标志复位
kin=0;
kd=0;
//数据处理
P1=~kbuf;
ET2=1;
//连续按相同按键,只发送1此键值
if(flag==0)
{
//程序第一次发送键值
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作波特率发生器
//时间常数 ,f=11.0592,延时10ms ,
//计数器需记数9216个脉冲,延时10ms,
TL2=0x00;
TH2=0xdc;
RCAP2L=0x00;
RCAP2H=0xdc;
//开T2中断
ET2=1;
//启动T2
TR2=1;
}
//T2的中断程序,功能对各标志位赋值,保存键值
void timer2() interrupt 5
{
//复位中断标志,为下一次中断
TF2=0;
//判断有键按下
if(keys()==1) //有键按下
{
if(kd==1) //延时去抖动
{
//10ms后,检测键还是按下, 保存键值
//如果上次输入键值处理完毕
if(kin==0)
{
kin=1;
kbuf=nkey(); //键值保存到kbuf中,此时按键处于稳定按下时期。
}
}
//第一次检查到键按下
else
kd=1;
}
//每次检测有键没有键按下,kd复位
else
{
kd=0;
kin=0;
}
}
//判断是否有键按下,
//有键按下返回1,无键按下返回0
//16位键盘接P0
uchar keys()
{
//如果设置:char a ,程序始终返回1.
uchar a;
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;
}
}
//T1初始化,f=11.0592,baud=9600
void init_comm()
{
//
flag=0;
//串口工作方式1,允许串口接收
SCON=0x50;
//T1工作方式2 ,自动重载8位计数器
TMOD=0x20;
//T1时间常数
TH1=0xfd;
TL1=0xfd;
//开串口中断
ES=1;
//启动T1
TR1=1;
}
//串口中断程序
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;
//发送完成,TI=1
while(TI==0);
TI=0;
pbuf++;
}
}
上一篇:51单片机外部中断的问题
下一篇:c51: 16位键盘程序1
推荐阅读最新更新时间:2024-03-16 15:15