本文主要记录两种方式:
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;
}