| 下面的程序是想实现 顺序按下矩阵键盘后,在数码管上依次显示0~F,不按显示 —  但是现在不管按什么键都只显示—  电路原理图如下 
 程序如下
 
 请大家帮我看看哪里出了问题,先谢谢各位了。#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code smgDx[17]={0xc0,0xf9,0xa4,0xb0,
                                        0x99,0x92,0x82,0xf8,0x80,0x90,
                                        0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//0~F - 段码
void DelayMs(uint xms);
uchar ScanKey(void);
void main()
{
        P2 = 0x00;
        while(1)
        {
        P0 = smgDx[ScanKey()];
        }
}
uchar ScanKey(void)
{
        uchar i, temp, m, n;//m为列号,n为行号
        bit find = 0;//有键按下标志
        P1 = 0xff;
        for(i=0; i<4; i++)
        {
                P1 = 0xef<<i;//逐列送低电平
                temp = ~P1;
                temp &= 0x0f;//屏蔽高四位,得出行值
                while(temp!=0x00)//判断有无按键按下,为0则无键按下
                {
                        DelayMs(10);//消抖
                        temp = ~P1;
                        temp &= 0x0f;//屏蔽高四位,得出行值
                        while(temp!=0x00)
                        {
                                find = 1;//有键按下
                                m = i;//列值
                                switch(temp)
                                {
                                        case 0x01: n=0; break; //第0行
                                        case 0x02: n=1; break; //第1行
                                        case 0x04: n=2; break; //2
                                        case 0x08: n=3; break; //3
                                        default: break;
                                }
                        }
                }
        if(!find) return 16;
         return (n*4+m);                   
        } 
}
void DelayMs(uint xms)
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++);
}
 
 |