草庐IT

单片机之矩阵键盘(花样编程)

@鹤辞 2023-09-30 原文

🌹作者简介: @鹤辞 ,喜欢玩弄单片机,嵌入式,PCB制作,电路设计等等,希望自己的学习经历经验能够对你们有启发

🌹前期回顾:单片机之独立按键(多种按键代码编写)_@鹤辞的博客-CSDN博客

🌹努力目标:突破1000粉丝

🌹支持鹤辞:点赞👍,留言👏, 关注💖,收藏🤞

目录

1,单片机矩阵的来源

2,单片机矩阵按键扫描原理

1,方式一

2,方式二

3,单片机protues仿真

1,仿真图

 2,仿真效果展示

代码编写

第一种方式:

项目:利用矩阵键盘实现数码管自加一

第二种方式:

 第三种方式:利用定时器扫描按键

 

1,单片机矩阵的来源

2,单片机矩阵按键扫描原理

1,方式一

逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。

2,方式二

我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。

3,单片机protues仿真

1,仿真图

 2,仿真效果展示

https://video-community.csdnimg.cn/vod-84deb4/1489c64f49804d7b96fcff0f616f606e/snapshots/0dc8fe80972d476ab3d230a8a7c0f89d-00002.jpg?auth_key=4811533663-0-0-a63fb51555c10e4144414de523e5d5d2

代码编写

第一种方式:

void key_scan() ///这里只编写了一个一个按键s11,其他按键编写一样
{
  P1=0x0f;
  if(P1!=0x0f)
{ Delay10ms();
  value0=P1;
  P1=0xf0;
  if(P1!=0xf0)
 {Delay10ms();
  value1=P1;}
}
value=value0+value1;
if(value==0xbe) num++;
}

项目:利用矩阵键盘实现数码管自加一

#include <reg52.h>

unsigned char smg[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};

unsigned char num=0,value=0,value0=0,value1=0;
void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

void key_scan()
{
  P1=0x0f;
  if(P1!=0x0f)
{   Delay10ms();
  value0=P1;
  P1=0xf0;
  if(P1!=0xf0)
	{	Delay10ms();
   value1=P1;}
}
value=value0+value1;
if(value==0xbe) num++;
}

void smg_display()
{
  P2=smg[num];
	if(num==10)
		num=0;
}
int main()
{
	while(1)
	{
	key_scan();
	smg_display();
	}



 }

第二种方式:

void keyvalue();
{   u8 i;
  key_code=0x0f;  //lie
	if(key_code!=0x0f)
	{
	    Delay10ms();
		if(key_code!=0x0f)
		{
		 key_code=0x0f;
			switch(key_code)
			{
			  case(0x07): key_val=1;break;
			  case(0x0b): key_val=2;break;
			  case(0x0d): key_val=3;break;
			  case(0x0e): key_val=4;break;
			}
			key_code=0xf0;
			switch(key_code)
			{
			  case(0x70): key_val=key_val;break;
			  case(0xb0): key_val=key_val+4;break;
			  case(0xd0): key_val=key_val+8;break;
			  case(0xe0): key_val=key_val+12;break;
			}
			while((i<50)&&(key_code!=0xf0)&&(key_code!=0x0f))
			{
				//Delay10ms();
				i++;
			}
		}
	
	}
	

}

 第三种方式:利用定时器扫描按键

unsigned char key_scan()		 
{
  static unsigned char col=0,keypress=0,pre=0,value=0;
  P3=0xf0;P42=1;P44=1;
  if((((P3&0x20)==0)||((P3&0x10)==0)||(P42==0)||(P44==0))&&!pre)keypress++;
    else keypress=0;	 
  if(keypress==3)     //消抖 
  {
        keypress=0;pre=1;
		if(P44==0) col=7;								 
		else if(P42==0) col=11;
		else if((P3&0x20)==0) col=15;	  
		else if((P3&0x10)==0) col=19;
		P3=0x0f;P44=0;P42=0;
		if((P3&0x01)==0) value=col+0;				
		else if((P3&0x02)==0) value=col-1;
		else if((P3&0x04)==0) value=col-2;
		else if((P3&0x08)==0) value=col-3;
		return value;
  }
  P3=0x0f;P44=0;P42=0;
  if((P3==0x0f)&&(P44==0)&&(P42==0)&&(pre==1))  {pre=0;keypress=0;}
  //P3=0xf0; P44=1;  P42=1;
  //if((P3==0xf0)&&(P44==1)&&(P42==1)&&(pre==1)){pre=0;}
  return 0;	
}

❀❀❀下期:LCD1602仿真及其代码编写

文章制作不易,感谢你的喜欢!点赞👍,留言👏, 关注💖,收藏🤞

下期再见吧🐱‍🏍🐱‍🏍🐱‍🏍🐱‍🏍🐱‍🏍🐱‍🏍

有关单片机之矩阵键盘(花样编程)的更多相关文章

  1. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  4. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  5. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  6. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  7. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

  8. Ruby 元编程问题 - 2

    我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一

  9. ruby - Paperclip:以编程方式分配图像并设置其名称 - 2

    使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案

  10. ruby - 如何以编程方式检查证书是否已被吊销? - 2

    我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一

随机推荐