您的位置:首页 > 编程语言

80C51矩阵键盘相关代码和电路设计

2016-10-31 20:52 225 查看
本文主要记录两种方式:

1 扫描法



#include<reg51.h>
//扫描法
//键盘扫描用P0口,数码管显示用P2口
#define keyport P0
#define seg7port P2
//共阳极八段数码管编码
unsigned char coding[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};
void display(unsigned char temp);
void delay(unsigned int i);
void main()
{
while(1)
{
keyport=0x0f;
if((keyport&0x0f)!=0x0f)
{
delay(10);//去抖动proteus仿真需要根据实际情况调节
if((keyport&0x0f)!=0x0f)
{
//扫描开始
keyport=0xef;//扫描第一列
if((keyport&0x0f)!=0x0f)
{  switch(keyport&0x0f){
case 0x0e:	display(0); break;
case 0x0d:	display(1); break;
case 0x0b:	display(2); break;
case 0x07:	display(3); break;
}
break;
}
keyport=0xdf;//扫描第二列
if((keyport&0x0f)!=0x0f)
{  switch(keyport&0x0f){
case 0x0e:	display(4); break;
case 0x0d:	display(5); break;
case 0x0b:	display(6); break;
case 0x07:	display(7); break;
}
break;
}
keyport=0xbf;//扫描第三列
if((keyport&0x0f)!=0x0f)
{  switch(keyport&0x0f){
case 0x0e:	display(8); break;
case 0x0d:	display(9); break;
case 0x0b:	display(10); break;
case 0x07:	display(11); break;
}
break;
}
keyport=0x7f;//扫描第四列
if((keyport&0x0f)!=0x0f)
{  switch(keyport&0x0f){
case 0x0e:	display(12); break;
case 0x0d:	display(13); break;
case 0x0b:	display(14); break;
case 0x07:	display(15); break;
}
break;
}
}
}
}
}

void delay(unsigned int i){
unsigned char j=0;
for(j=255;j>0;j--)
for(;i>0;i--);
}

void display(unsigned char temp){
seg7port=coding[temp];
}


2 线反转法

#include<reg51.h>
//线反转法
//键盘扫描用P0口,数码管显示用P2口
#define keyport P0
#define seg7port P2
//共阳极八段数码管编码
unsigned char code coding[4][4]={
{0xc0,0xf9,0xa4,0xb0},
{0x99,0x92,0x82,0xf8},
{0x80,0x90,0x88,0x83},
{0xc6,0xa1,0x86,0x8e}
};
unsigned char x,y;//x为行号,y为列号
void display(unsigned char temp);
void delay(unsigned int i);
void main()
{
while(1)
{
keyport=0x0f;//列输出0
if((keyport&0x0f)!=0x0f)//行不全为1说明有键按下
{
delay(10);//去抖动proteus仿真需要根据实际情况调节
if((keyport&0x0f)!=0x0f)
{
switch(keyport&0x0f){
case 0x0e:	x=0; break; //行号为0
case 0x0d:	x=1; break;	//行号为1
case 0x0b:	x=2; break;	//行号为2
case 0x07:	x=3; break;	//行号为3
}
keyport=0xf0;//行输出0
switch(keyport&0xf0){
case 0xe0:  y=0; break; //列号为0
case 0xd0:	y=1; break; //列号为1
case 0xb0:	y=2; break; //列号为2
case 0x70:	y=3; break; //列号为3
}
display(coding[x][y]);
}
}
}
}

void delay(unsigned int i){
unsigned char j=0;
for(j=255;j>0;j--)
for(;i>0;i--);
}

void display(unsigned char temp){
seg7port=temp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: