关于矩阵键盘的Proteus仿真问题

weixin_50356963 2021-07-23 10:44:13

新手刚学Proteus不久,想用Proteus做一个51的开发板,但是其实对电路结构并不是很熟悉,只能摸索着来。在弄矩阵键盘的时候出现了一点问题,如下所示。

这是电路结构

先用简单的代码试一下是否可行

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

#define GPIO_DIG P0
#define GPIO_KEY P1

u8 code smgduan[10]={0x3f,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};

u8 keyvalue;

void delay(u16 i)
{
     	 while(i--);
}

void keydown()
{
	  u8 a=0;
	  GIPO_KEY=0x0f;
	  if(GPIO_KEY!=0x0f)
	  {
	  		delay(1000);
			if(GPIO_KEY!=0x0f)
			{
				  switch(GPIO_KEY)
				  {
					   case(0x07):keyvalue=1;break;
					   case(0x0b):keyvalue=2;break;
					   case(0x0d):keyvalue=3;break;
					   case(0x0e):keyvalue=4;break;
				  }
				  GPIO_KEY=0xf0;
				  switch(GPIO_KEY)
				  {
					   case(0x70):keyvalue=keyvalue;break;
					   case(0xb0):keyvalue=keyvalue+4;break;
					   case(0xd0):keyvalue=keyvalue+8;break;
					   case(0xe0):keyvalue=keyvalue+12;break;
				  }
				  while((a<50)&&(GPIO_KEY!=0x0f))
				  {
						delay(1000);
						a++;
				  }
			}
	  } 
}

void main()
{
		 while(1)
		 {
			  keydown();
			  GPIO_DIG=smgduan[keyvalue];
		 }
}

用一个4×4矩阵,分别代表1~16这16个数字,按下一个键以后数码管就显示该数字。

出现的问题是,开始仿真时,给高四位P14~P17输出低电平,低四位P10~P13输出高电平,如图所示。

按照我的想法,按下S1以后,低四位应该是只有P13才变成低,结果低四位全部变成了低电平,并且高四位的P14~P16也发生了变化。

思考了一天这个问题,不知道问题出现在哪里,本人是刚上路的小白,求各位大佬帮我指出问题所在!!!谢谢各位大佬!

...全文
2432 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44908940 2021-08-08
  • 打赏
  • 举报
回复

1/键盘没有消抖检测;
2/第21代码GPIO写错了,低4位并没有被初始化.

  • 打赏
  • 举报
回复

矩阵电阻可取消

weixin_50356963 2021-07-24
  • 举报
回复
@智者知已应修善业 我取消过,但出现的问题是,不是低四位的高电平被拉低,而是高四位的低电平被拉高了(我不知道这两者会不会是都可以,因为自己学的时候是讲到低四位的高电平被拉低)。然后按下按键,每一行都是显示同样的四个数字,第一行4个显示1~4,第二行第三行第四行也同样。
  • 举报
回复
@weixin_50356963 已经给你电路图和代码例子了

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧