/*
把矩阵键盘的键值以2400bps上传到计算机串口助手
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*1毫秒延时函数*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*
串口初始化函数
工作模式1 10位异步收发 发送速率2400bps
*/
void UART_init()
{
TMOD = 0x20; //T1工作模式2 8位自动重装
TH1 = 0xf4;
TL1 = 0xf4; //比特率2400,计算公式256-11059200/2400/32/12
TR1 = 1;//启动T1定时器
SM0 = 0;
SM1 = 1; //串口工作方式1 10位异步
//REN = 1;//串口允许接收
}
/*
4*4矩阵键盘扫描函数
带返回值,返回键值码
*/
uchar KeyScan()
{
uchar cord_l,cord_h;//声明列线和行线的值的储存变量
P3 = 0xf0;//1111 0000
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( KeyScan() )
{
//第一行键值码
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 main()
{
UART_init();//串口初始化
while(1)
{
SBUF = KeyPro();//调用带返回值的键值码转换函数,把转换后的键值码送入发送SBUF
while(!
ti);//检测是否发送完毕
TI = 0;//清楚发送完毕标志位,已便于下次发送
}
}
在main函数中,SBUF = KeyPro(); 理论上在没有按下按键时,KeyPro()也会返回key_value,key_value的值应该为0,,如果这样,在while大循环下,没有按下按键的情况下,不是应该源源不断的发送0吗,但实际却没有,为什么呢?
一周热门 更多>