单片机

简单键盘扫描静态数码管显示总结

一、矩阵按键扫描

程序采用行列翻转扫描

void Key_Scan()                                       //行列翻转式扫描
{
    uchar a;
    KEY=0x0F;
    if(KEY!=0x0F)
    {
        Delayms(10);                                  //消抖
        if(KEY!=0x0F)
        {
            KEY=0x0F;             //低四位为低电平;高四位为高电平
            switch(KEY)
            {
                case(0x1f):Key_Value=0;break;
                case(0x2F):Key_Value=1;break;
                case(0x4F):Key_Value=2;break;
                case(0x8F):Key_Value=3;break;
                default:break;
            }
            KEY=0xf0;       //低四位为高电平;高四位为低电平
            switch(KEY)
            {
                case(0xf1):Key_Value=Key_Value;break;
                case(0xf2):Key_Value=Key_Value+4;break;
                case(0xf4):Key_Value=Key_Value+8;break;
                case(0xf8):Key_Value=Key_Value+12;break;
                default:break;
            }
            while((a<50)&&(KEY!=0x0f))                     //检测按键是否松开
            {
                Delayms(100);
                a++;
            }
        }
        
    }
}

仿真现象:一般高电平置低容易,低电平置高难,而此仿真现象就为按键按下,I/O端口读取的就为高电平;(原因还未明白)

矩阵键盘扫描显示

二、独立键盘扫描显示

说明:数码管显示内容为00-59,其中有一个按键是定时器控制自加1
键盘扫描程序:

void Key_Scan()
{
    if(ADD_1==0)
    {
        Delayms(10);
        if(ADD_1==0)
        {
            Key_Units++;
            if(Key_Units>9)
            {
                Key_Units=0;
                Key_Tens++;
                if(Key_Tens>5)
                    Key_Tens=0;
            }
        }
        while(!ADD_1);
    }
    if(MINUS_1==0)
    {
        Delayms(100);
        if(MINUS_1==0)
        {
            Key_Units--;
            if(Key_Units<0)
            {
                Key_Units=9;
                Key_Tens--;
                if(Key_Tens<0)
                {
                    Key_Tens =5;
                }
            }
        }
        while(!MINUS_1);
    }
    if(RESET==0)
    {
        Delayms(100);
        if(RESET==0)
        {
            Key_Units=0;
            Key_Tens =0;
        }
        while(!RESET);
    }
    if(AUTO_ADD_1==0)
    {
        Delayms(100);
        if(AUTO_ADD_1==0)
        {
            TR0=~TR0;
        }
        while(!AUTO_ADD_1);
    }
}

**注意:**我的困难在于当显示到59时,按键再次按下怎么让其显示到00;
总结:
1、为了能从59减到00,在做if条件语句判断的时候用到小于零的语句,考虑要把个位、十位定义为有符号的变量,在无符号变量的情况下程序实现的效果时不正确的。
2、加到大于九要清零,而非是等于九的时候清零;当为59加到00时,程序实现是在前面判断大于九个位清零的前提下;十位大于的时候也要清零,同样的不是在等于5的时候清零;
3、本次代码较好的思想是通过按键控制定时器0的运行控制位语句是用取反语句完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣中的渣中渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值