51单片机按键相关问题

keybuf = (keybuf << 1) | KEY4; //只取 KEY4 为例,缓冲区左移一位,并将当前扫描值移入最低位
不太理解这行代码的意思,有没有老哥能举个实例解释一下。

比如keybuf当前值为0x10,按键key4按下为低电平,不按下为高电平。如果按键按下,计算后的结果为0x10<<1为0x20,或上最后一位0等于0x20。不知道能明白不?

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/750922
  • 这篇博客你也可以参考下:51单片机~数码管电路原理分析,计算,编码表完整版,显示代码,中文命名.c文件报错问题
  • 除此之外, 这篇博客: 51单片机按键值显示在数码管上,数码管亮度控制,数码管显示原理中的 解决方案: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 将数码管显示函数放到key();函数里面,实现了功能。同时进行了优化,将位选直接写在main函数while循环之前,然后直接操作P0确定段选即可。并且也没有延时。

    #include <regx52.h>
    #include "key.h"
    sbit LS_A=P2^2;
    sbit LS_B=P2^3;
    sbit LS_C=P2^4;
    unsigned code Nixie_Value[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
    void Key()
    {
    	unsigned char KeyNumber=0;
    	
    	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;P0=Nixie_Value[KeyNumber];}
    	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;P0=Nixie_Value[KeyNumber];}
    	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;P0=Nixie_Value[KeyNumber];}
    	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;P0=Nixie_Value[KeyNumber];}
    }
    int main()
    {
    	LS_A=0;LS_B=0;LS_C=0;
    	P0=0x3F;
    	while(1)
    	{
    		key();
    	}
    }