#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
} ;//共阳极数码管0 为亮
sbit wei=P1^0;
void delay(uchar t)//毫秒延
{
uint i,j;
for(i=0; i for(j=0; j } void display(uchar d) { P1=0x00; wei=1; //第一个数码管点亮 P0=table[d]; } void main() { uchar v,temp; uchar key_l,key_h;// 定义列和行 uchar key; while(1) { P2=0xf0; temp=P2; temp=temp&0xf0; if(temp!=0xf0) //检测到有按键按下 { delay(10);//消抖 if(temp!=0xf0)//再次确认一下有否真的有按下 { temp=P2;//把这次的检测值作为真值 key_l=temp&0xf0; P2=key_l|0x0f;//让低四位置1 1110 1111 temp=P2;//赶紧读取P口值 key_h=temp&0x0f;//得到行值 0000 1110 key=key_l+key_h;//1110 0000 //+ 0000 1110 //ee 1110 1110 } switch(key) { case 0xee:display(0);break; case 0xde:display(1);break; case 0xbe:display(2);break; case 0x7e:display(3);break; case 0xed:display(4);break; case 0xdd:display(5);break; case 0xbd:display(6);break; case 0x7d:display(7);break; case 0xeb:display(8);break; case 0xdb:display(9);break; case 0xbb:display(10);break; case 0x7b:display(11);break; case 0xe7:display(12);break; case 0xd7:display(13);break; case 0xb7:display(14);break; case 0x77:display(15);break; } } } } 把行列扫描的值相加 key=key_l+key_h; 我也是调了很长时间 你要把原理彻底搞明白了 呵呵