清翔电子51单片机11课串口通讯课后作业2

本文介绍了一种基于51单片机的4*4矩阵键盘键值码处理方法,通过扫描键盘并转换键值码,最终以2400波特率将键值通过串口发送至计算机串口助手。文章详细展示了从键盘信号检测、键值码转换到串口数据发送的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*****************************/
//把矩阵键盘的键值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;			//清楚发送完毕标志位,已便于下次发送
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值