#include <reg51.h>
#define uchar unsigned char
uchar code leddata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73};
uchar code RowCode[]={0xfe,0xfd,0xfb,0xf7};
uchar key=16;
void scan(void)
{
uchar i,temp;
//粗扫
P1=0xf0;//高4位为列线(输入线),低4位为行线(输出线)
temp=P1&0xf0;
if(temp!=0xf0)
{
for(i=0;i<200;i++); //消抖
temp=P1&0xf0;
if(temp!=0xf0)
{
P1=0XFE; //细扫
temp=P1&0XF0;//确定按键所在列号
switch(temp)
{
case 0xe0:key=0;break;
case 0xd0:key=1;break;
case 0xb0:key=2;break;
case 0x70:key=3;break;
}
P1=0XFD; //细扫
temp=P1&0XF0;//确定按键所在列号
switch(temp)
{
case 0xe0:key=4;break;
case 0xd0:key=5;break;
case 0xb0:key=6;break;
case 0x70:key=7;break;
}
P1=0XFB; //细扫
temp=P1&0XF0;//确定按键所在列号
switch(temp)
{
case 0xe0:key=8;break;
case 0xd0:key=9;break;
case 0xb0:key=10;break;
case 0x70:key=11;break;
}
P1=0XF7; //细扫
temp=P1&0XF0;//确定按键所在列号
switch(temp)
{
case 0xe0:key=12;break;
case 0xd0:key=13;break;
case 0xb0:key=14;break;
case 0x70:key=15;break;
}
while(P1&0XF0!=0XF0);
}
}
}
void main(void)
{
while(1)
{
scan();
P2=leddata[key];
}
}