/*****************************/
//把矩阵键盘的键值2400波特率发送到
//计算机串口助手
/*****************************/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar num;
sbit led1 = P1^3;
void delay(uchar num)
{
uchar i,j;
for(i = num;i > 0;i--)
for(j = 114;j > 0;j--)
;
}
uchar key_scan()
{
uchar cord_l,cord_h;
P3 = 0xf0; //高位时列 低为行
if((P3 & 0xf0) != 0xf0) // 检测是否有列信号按下
{
delay(5);
if((P3 & 0xf0) != 0xf0)
{
cord_l = P3 & 0xf0;
P3 = cord_l | 0x0f;
cord_h = P3 & 0x0f; //检测行信号的输入
while( (P3 & 0x0f) != 0x0f );//松手检测
return (cord_l+cord_h);
}
}
}
/*
4*4矩阵键盘键值码处理函数
返回转换后的键值码
*/
uchar KeyPro()
{
uchar key_value; //存放转换后的按键值
switch( key_scan() )
{
//第一行键值码
case 0xee: key_value = 0x01; break;
case 0xde: key_value = 0x02; break;
case 0xbe: key_value = 0x03; break;
case 0x7e: key_value = 0x04; break;
//第二行键值码
case 0xed: key_value = 0x05; break;
case 0xdd: key_value = 0x06; break;
case 0xbd: key_value = 0x07; break;
case 0x7d: key_value = 0x08; break;
//第三行键值码
case 0xeb: key_value = 0x09; break;
case 0xdb: key_value = 0x0a; break;
case 0xbb: key_value = 0x0b; break;
case 0x7b: key_value = 0x0c; break;
//第四行键值码
case 0xe7: key_value = 0x0d; break;
case 0xd7: key_value = 0x0e; break;
case 0xb7: key_value = 0x0f; break;
case 0x77: key_value = 0x10; break;
}
return (key_value);//返回转换后的键值码
}
void uart_init()
{
TMOD = 0x20;
TH1 = 0xf4;
TL1 = 0xf4; // 4800波特率
REN = 1; //允许串行接受
TR1 = 1; //开始T1计时器
SM0 = 0;
SM1 = 1; //串行口工作方式2
// EA = 1;//总中断允许位
// ES = 1;//串口中断打开
}
void main()
{
uart_init();//串口初始化
while(1)
{
SBUF = KeyPro();//调用带返回值的键值码转换函数,把转换后的键值码送入发送SBUF
while(!TI); //检测是否发送完毕
TI = 0; //清楚发送完毕标志位,已便于下次发送
}
}