实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0-f,6个数码管同时静态显示。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int


uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};


sbit dula=P2^6;
sbit wela=P2^7;


void delayms(uint);//延迟函数
void init();//初始化函数
void matrixkeyscan();
void display(uchar);


void main()
{
    init();
    while(1)
    {
        matrixkeyscan();
    }
}


void init()
{
    P0=0;//关闭所有段选
    dula=1;
    dula=0;
    P0=0xfe;
    wela=1;
    wela=0;
}
void delayms(uint xms)//延迟 xms ms
{
    uint i, j;
    for(i=xms;i>0;i--)
        for(j=xms;j>0;j--);   
}
void display(uchar num)//显示函数
{
    P0=table[num];
    dula=1;
    dula=0;
}


void matrixkeyscan()
{
    uchar temp,key;
    P3=0xfe;//P3口设置一值 把第一行设置为低电平
    temp=P3;//读取当前P3状态值,赋给temp  此时当键按下时P3改变了 否则没有改变
    temp=temp&0xf0; //目的判断temp高四位是否有0
    if(temp!=0xf0)//键盘被按下后 P3改变 temp与运算后改变,此时不等于0xf0
    {
        delayms(10);//去抖动
        temp=P3;//重新读取P3
        temp=temp&0xf0;//重新进行与运算
        if(temp!=0xf0)//如果temp仍然不等于0xf0,确认键被按下
        {
            temp=P3;//重新读取P3
            switch(temp)
            {
                case 0xee: key=0; break;//第一行第一个键被按下
                case 0xde: key=1; break;//第一行第二个键被按下
                case 0xbe: key=2; break;//。。。
                case 0x7e: key=3; break;           
            }//下面判断是否释放键,即判断高电位是否都为0,此时不考虑低四位,所以判断是否与0xf0相等
            while(temp!=0xf0)  
            {
                temp=P3;
                temp=temp&0xf0;
            }
            display(key);
        } 
    }


    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delayms(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xed: key=4; break;
                case 0xdd: key=5; break;
                case 0xbd: key=6; break;
                case 0x7d: key=7; break;           
            }
            while(temp!=0xf0)  
            {
                temp=P3;
                temp=temp&0xf0;
            }
            display(key);
        }
    }


    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delayms(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xeb: key=8; break;
                case 0xdb: key=9; break;
                case 0xbb: key=10; break;
                case 0x7b: key=11; break;           
            }
            while(temp!=0xf0)  
            {
                temp=P3;
                temp=temp&0xf0;
            }
            display(key);
        }
    }


    P3=0xf7;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
        delayms(10);
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
                case 0xe7: key=12; break;
                case 0xd7: key=13; break;
                case 0xb7: key=14; break;
                case 0x77: key=15; break;           
            }
            while(temp!=0xf0)  
            {
                temp=P3;
                temp=temp&0xf0;
            }
            display(key);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37131037/article/details/79682032