27,508
社区成员




新手刚学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也发生了变化。
思考了一天这个问题,不知道问题出现在哪里,本人是刚上路的小白,求各位大佬帮我指出问题所在!!!谢谢各位大佬!
1/键盘没有消抖检测;
2/第21代码GPIO写错了,低4位并没有被初始化.
矩阵电阻可取消