当前位置: 首页 > article >正文

单片机学习11——矩阵键盘

矩阵键盘:

这个矩阵键盘可以接到P0、P1、P2、P3都是可以的。

使用矩阵键盘是能节省单片机的IO口。

P3.0 P3.1 P3.2 P3.3 称之为行号。

P3.4 P3.5 P3.6 P3.7 称之为列号。

矩阵键盘检测原理:

1、检查是否有键按下;

2、键的抖动处理;

3、查询按下键所在行和列的位置,并对行号和列号译码,得到键值。

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;

uchar disnum,temp,key;

uchar code table_duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};

void delay(uchar);

void main()
{
	disnum=16;
	wela=1;
	P0=0xfe;
	wela=0;
	while(1)
	{
		P3=0xf0;
		temp=P3;
		temp=temp&0xf0; //按位与
		if(temp!=0xf0)  //判断是否有按键按下
		{
			delay(10);
			if(temp!=0xf0)
			{
				temp=P3;
				temp=temp|0x0f;
				P3=temp;
				key=P3;
				switch(key)
				{
				 	case 0xee: disnum=0; break;
					case 0xde: disnum=1; break;
					case 0xbe: disnum=2; break;						
					case 0x7e: disnum=3; break;						
					case 0xed: disnum=4; break;						
					case 0xdd: disnum=5; break;						
					case 0xbd: disnum=6; break;						
					case 0x7d: disnum=7; break;						
					case 0xeb: disnum=8; break;						
					case 0xdb: disnum=9; break;						
					case 0xbb: disnum=10; break;						
					case 0x7b: disnum=11; break;						
					case 0xe7: disnum=12; break;						
					case 0xd7: disnum=13; break;						
					case 0xb7: disnum=14; break;						
					case 0x77: disnum=15; break;
				}
			}	
		}
		P0=table_duan[disnum];
		dula=1;
		dula=0;
	}
}


void delay(uchar x)
{
	uchar a, b;
	for(a=x;a>0;a--)
	{
	 	for(b=200;b>0;b--);
	}	
}

 使用子模块(函数)的方法:

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;

uchar disnum,temp,key,num;

void delay(uchar);
uchar keyscan();

uchar code table_duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};

void main()
{
	disnum=16;
	wela=1;
	P0=0xfe;
	wela=0;
	while(1)
	{
		num=keyscan();
		P0=table_duan[num];
		dula=1;
		dula=0;
	}
}

uchar keyscan()
{
	P3=0xf0;
	temp=P3;
	temp=temp&0xf0; //按位与
	if(temp!=0xf0)  //判断是否有按键按下
	{
		delay(10);
		if(temp!=0xf0)
		{
			temp=P3;
			temp=temp|0x0f;
			P3=temp;
			key=P3;
			switch(key)
			{
			 	case 0xee: disnum=0; break;
				case 0xde: disnum=1; break;
				case 0xbe: disnum=2; break;						
				case 0x7e: disnum=3; break;						
				case 0xed: disnum=4; break;						
				case 0xdd: disnum=5; break;						
				case 0xbd: disnum=6; break;						
				case 0x7d: disnum=7; break;						
				case 0xeb: disnum=8; break;						
				case 0xdb: disnum=9; break;						
				case 0xbb: disnum=10; break;						
				case 0x7b: disnum=11; break;						
				case 0xe7: disnum=12; break;						
				case 0xd7: disnum=13; break;						
				case 0xb7: disnum=14; break;						
				case 0x77: disnum=15; break;
			}
		}	
	}
	return disnum;	
}


void delay(uchar x)
{
	uchar a, b;
	for(a=x;a>0;a--)
	{
	 	for(b=200;b>0;b--);
	}	
}

光看不练,就是眼高手低。多练习才行的。


http://www.kler.cn/news/155637.html

相关文章:

  • 【无标题】我们只能用成功来摧毁我们,原来的自己只会破败自己的事情。
  • redis实现消息延迟队列
  • 使用Redis构建任务队列
  • Hdoop学习笔记(HDP)-Part.02 核心组件原理
  • 基于SSM的职业高中智慧作业试题系统设计
  • 3dMax拼图生成工具Puzzle2D使用教程
  • Java Throwable
  • Spring中@Transactional注解
  • QueryRunner报红处理
  • electron-vue运用及案例代码
  • 后端项目连接数据库-添加MyBatis依赖并检测是否成功
  • flutter开发实战-为ListView去除Android滑动波纹
  • 在cmd下查看mysql表的结构信息
  • 【Android踩过的坑】13.Android Studio 运行成功,但APP没有安装上的问题
  • electron打包 Error output: !include: could not find:
  • 挖漏洞之SQL注入
  • Python---格式化输出与%百分号----涉及转义符 \ 反斜杠的使用
  • FLASK博客系列5——模板之从天而降
  • electerm下载和安装
  • YOLOv7+姿态估计Pose+tensort部署加速
  • MDETR 论文报告
  • MySQL中的锁(简单)
  • thinkphp 判断当前页 导航条高亮等方法
  • Android 13 - Media框架(21)- ACodec(三)
  • selinux-policy-default(2:2.20231119-2)软件包内容详细介绍(5)
  • 【深度学习实验】图像处理(四):PIL——自定义图像数据增强操作(图像合成;图像融合(高斯掩码))
  • 链表算法总结
  • Apache Doris 整合 FLINK 、 Hudi 构建湖仓一体的联邦查询入门
  • 接口测试快速入门 以飞致云平台为例
  • Selenium Grid