89c51单片机的P3口接一个共阳极的数码管,P1口接4*4的键盘,每个键的键值依次是0~F,要求任意按下一个键,

如题所述

第1个回答  2011-03-07
#include<reg51.h>
#define p0 P0
#define p2 P2
sbit p23=P2^3;
sbit p22=P2^2;
sbit p21=P2^1;
sbit p20=P2^0;
int i,j;
int tab[4][4]={ {0xc0,0xf9,0xa4,0xb0},
{0x99,0x92,0x82,0xf8},
{0x80,0x90,0x88,0x83},
{0xc6,0xa1,0x86,0x8e}}; //0到F的16个键植
scankey()
{ if(p23==0)
{p0=0xff;
p2=0xf0;
switch(P2)
{case 0xe0:p0=tab[0][0];break;
case 0xd0:p0=tab[1][0];break;
case 0xb0:p0=tab[2][0];break;
case 0x70:P0=tab[3][0];break;
}
}

if(p22==0)
{p2=0xf0;
p0=0xff;
switch(P2)
{case 0xe0:p0=tab[0][1];break;
case 0xd0:p0=tab[1][1];break;
case 0xb0:p0=tab[2][1];break;
case 0x70:P0=tab[3][1];break;
}
}

if(p21==0)
{p2=0xf0;
p0=0xff;
switch(P2)
{case 0xe0:p0=tab[0][2];break;
case 0xd0:p0=tab[1][2];break;
case 0xb0:p0=tab[2][2];break;
case 0x70:P0=tab[3][2];break;
}
}

if(p20==0)
{p2=0xf0;
p0=0xff;
switch(P2)
{case 0xe0:p0=tab[0][3];break;
case 0xd0:p0=tab[1][3];break;
case 0xb0:p0=tab[2][3];break;
case 0x70:P0=tab[3][3];
}
}
return p0;
}

delay(int m)
{for(i=100;i>0;i--);
}
main()

{p0=0xff;
p2=0xff;
/*if(p2!=0x0f)
delay(50);*/
while(1)
{
p2=0x0f;
if(P2!=0x0f)
delay(10);
if(P2!=0x0f)
p0=scankey();
}

}本回答被网友采纳
第2个回答  2011-03-07