求简单的51系列单片机控制4*4矩阵键盘显示电路图 带上程序
展开全部
/*功能:矩阵按键识别,每按一次响一声,用数码管显示0——F键值 */
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sound=P3^6;
uchar code tab[]=
{
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xA7,/*c*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
0xBF /*-*/
};
void delay1ms(uint z)//f=12MHz
{
uint x,y;
for(x=0;x<z;x++)
{
for(y=0;y<115;y++);
}
}
uchar scan_key(void)
{
uchar temp,key_code;
P1=0xf0;
temp=P1;
if(temp!=0xf0)//是否有键被按下
{
delay1ms(15);
if(temp!=0xf0)
{
P1=0xfe; //扫描第一行
temp=P1;
switch(temp)
{
case 0xee:key_code=0;break;
case 0xde:key_code=1;break;
case 0xbe:key_code=2;break;
case 0x7e:key_code=3;break;
}
P1=0xfd;//扫描第2行
temp=P1;
switch(temp)
{
case 0xed:key_code=4;break;
case 0xdd:key_code=5;break;
case 0xbd:key_code=6;break;
case 0x7d:key_code=7;break;
}
P1=0xff;
P1=0xfb;//扫描第3行
temp=P1;
switch(temp)
{
case 0xeb:key_code=8;break;
case 0xdb:key_code=9;break;
case 0xbb:key_code=10;break;
case 0x7b:key_code=11;break;
}
P1=0xff;
P1=0xf7;//扫描第4行
temp=P1;
switch(temp)
{
case 0xe7:key_code=12;break;
case 0xd7:key_code=13;break;
case 0xb7:key_code=14;break;
case 0x77:key_code=15;break;
}
}
}
else
key_code=16;
return key_code;
}
void disp(uchar x,uchar m)
{
uchar temp=0xfe;
P0=tab[x];
P2=_crol_(temp,m);
}
void beep(void)
{
sound=~sound;
delay1ms(1);
}
void main()
{
uchar key_value=16,i;
uchar n=0;//用于记录按键次数
while(1)
{
key_value=scan_key(); //0
if(key_value!=16)//判断是否有键被按下
{
if(n<7)
n++;
else
n=0;
for(i=0;i<150;i++)
beep();
disp(key_value,n);//
}
while(scan_key()==key_value); //松手检测
}
}
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sound=P3^6;
uchar code tab[]=
{
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0x88,/*A*/
0x83,/*b*/
0xA7,/*c*/
0xA1,/*d*/
0x86,/*E*/
0x8E,/*F*/
0xBF /*-*/
};
void delay1ms(uint z)//f=12MHz
{
uint x,y;
for(x=0;x<z;x++)
{
for(y=0;y<115;y++);
}
}
uchar scan_key(void)
{
uchar temp,key_code;
P1=0xf0;
temp=P1;
if(temp!=0xf0)//是否有键被按下
{
delay1ms(15);
if(temp!=0xf0)
{
P1=0xfe; //扫描第一行
temp=P1;
switch(temp)
{
case 0xee:key_code=0;break;
case 0xde:key_code=1;break;
case 0xbe:key_code=2;break;
case 0x7e:key_code=3;break;
}
P1=0xfd;//扫描第2行
temp=P1;
switch(temp)
{
case 0xed:key_code=4;break;
case 0xdd:key_code=5;break;
case 0xbd:key_code=6;break;
case 0x7d:key_code=7;break;
}
P1=0xff;
P1=0xfb;//扫描第3行
temp=P1;
switch(temp)
{
case 0xeb:key_code=8;break;
case 0xdb:key_code=9;break;
case 0xbb:key_code=10;break;
case 0x7b:key_code=11;break;
}
P1=0xff;
P1=0xf7;//扫描第4行
temp=P1;
switch(temp)
{
case 0xe7:key_code=12;break;
case 0xd7:key_code=13;break;
case 0xb7:key_code=14;break;
case 0x77:key_code=15;break;
}
}
}
else
key_code=16;
return key_code;
}
void disp(uchar x,uchar m)
{
uchar temp=0xfe;
P0=tab[x];
P2=_crol_(temp,m);
}
void beep(void)
{
sound=~sound;
delay1ms(1);
}
void main()
{
uchar key_value=16,i;
uchar n=0;//用于记录按键次数
while(1)
{
key_value=scan_key(); //0
if(key_value!=16)//判断是否有键被按下
{
if(n<7)
n++;
else
n=0;
for(i=0;i<150;i++)
beep();
disp(key_value,n);//
}
while(scan_key()==key_value); //松手检测
}
}
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
单片机复位电路原理通常包括以下几个主要步骤:1. 电平检测:单片机复位电路需要检测一个关键参数,即控制器的复位引脚是否处于高电平(2V)。如果复位引脚没有高电平,复位电路就会启动一个复位过程来清除单片机内部的错误状态并将其恢复到正常状态。2...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询