数码管动态显示矩阵键盘的键值

题目要求:
设计一个4X4的矩阵键盘,键盘的号码0~F,要求编写出一个键盘输入扫描程序,要求单片机能根据键盘排列顺序,能将按下去键盘号正确识别出来,并采用两个数码管分别显示键盘号码的个位和十位。

问题:第一个数码管总是没数值,一直全亮,就是不显示正确的数值。第二个数码管是正常的,我该程序改了好久,但是不知道为什么第一个数码管总是没反应。

原理图:

img

程序:

#include "reg51.h"

typedef unsigned int u16;    //对系统默认数据类型进行重定义
typedef unsigned char u8;

#define SMG_A_DP_PORT     P0
#define matrix_ranks      P1

sbit A=P2^6;
sbit B1=P2^7;//定义两个数码管的位选端

u8 smg_x;
u8 display[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay_ms(u16 ms)
{
    u16 i,j;
    for(i=ms;i>0;i--)
        for(j=110;j>0;j--);
}

void smg_display(u8 smg_x,u8 k)
{    
    switch(smg_x)
    {
    case 1:
    A=1;B1=0;break;
    
    case 2:
    A=0;B1=1;break;
    }

    SMG_A_DP_PORT=display[k]; 
    delay_ms(1);
    SMG_A_DP_PORT=0x00;//消隐                    
}

void matrix_key(void)
{
        matrix_ranks=0xfe;
        if(matrix_ranks!=0xfe)//第一列为低电平
        {
                delay_ms(1);//消除抖动
                switch(matrix_ranks)
                {
                    case 0xee: smg_display(1,0);smg_display(2,0);break;
                    case 0xde: smg_display(1,0);smg_display(2,4);break;
                    case 0xbe: smg_display(1,0);smg_display(2,8);break;
                    case 0x7e: smg_display(1,1);smg_display(2,2);break;
                }
        }

        matrix_ranks=0xfd;
        if(matrix_ranks!=0xfd)//第二列为低电平
        {
                delay_ms(1);//消除抖动
                switch(matrix_ranks)
                {
                    case 0xed: smg_display(1,0);smg_display(2,1);break;
                    case 0xdd: smg_display(1,0);smg_display(2,5);break;
                    case 0xbd: smg_display(1,0);smg_display(2,9);break;
                    case 0x7d: smg_display(1,1);smg_display(2,3);break;
                }
        }
        
        matrix_ranks=0xfb;    
        if(matrix_ranks!=0xfb)//第三列为低电平
        {
                delay_ms(1);//消除抖动
                switch(matrix_ranks)
                {
                    case 0xeb: smg_display(1,0);smg_display(2,2);break;
                    case 0xdb: smg_display(1,0);smg_display(2,6);break;
                    case 0xbb: smg_display(1,1);smg_display(2,0);break;
                    case 0x7b: smg_display(1,1);smg_display(2,4);break;
                }
        }    
    
        matrix_ranks=0xf7;
        if(matrix_ranks!=0xf7)//第四列为低电平
        {
                delay_ms(1);//消除抖动
                switch(matrix_ranks)
                {
                    case 0xe7: smg_display(1,0);smg_display(2,3);break;
                    case 0xd7: smg_display(1,0);smg_display(2,7);break;
                    case 0xb7: smg_display(1,1);smg_display(2,1);break;
                    case 0x77: smg_display(1,1);smg_display(2,5);break;
                }
        }    
}

void main()
{        
    while(1)
    {
         matrix_key();
    }
}