实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示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);
        }
    }
}
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值