#include <stdio.h>
#include <reg51.h>
char act[4]={0xfe,0xfd,0xfb,0xf7,};
char disp[6]={0x3f,0x06,0x5b,0x4f,0x77,0x7c};
//字形表
const unsigned char DATA_7SEG[16]={0xb9,0x5e,0x79,0x71, 0X7F,0X6F,0x77,0x7c,
0x66,0X6D,0X7D,0X07, 0X3F,0x06,0x5B,0x4F};
//显示缓冲区
int key;
void delay(int t)//延时子程式 1ms//
{ int i,j;
for(i=0;i<t;i++)
{for(j=0;j<120;j++);
}
}
//**************************//
char scan_key(void) //键盘扫描程式//
{
char i,j,find,ini,inj;
char in;
find=0;
for(i=0;i<4;i++)
{P2=act[i];
delay(3);
in=P2;
in=in>>4;
in=in|0xf0;
for(j=0;j<4;j++)
if(act[j]==in)
{find=1;
inj=j;ini=i;
}
}
if(find==0) return 0;
key=ini*4+inj;
return 1;
}
void get_key(void) //等待键盘并等安键放开程式//
{
while(1)
if(scan_key()==1) break;
while(1)
if(scan_key()==0) break;
}
char scan_keyboard(void)//转换成按键代码输出//
{ char key_code;
while(1)
{ get_key();
key_code=DATA_7SEG[key];
if(key_code==0) return 0;
return (key_code);
}
}
void diskplay(void) //数码管扫描控制//
{char i;
for(i=0;i<6;i++)
{
P1=disp[i];
P3=~(1<<i);
delay(10);
P3|=(1<<i);
}
}
void main(void) // 主程序//
{
char keyval;
diskplay();
while(1)
{
keyval=scan_keyboard();
disp[0]=keyval;
diskplay();
}
}