标题: C语言键盘扫描程序的疑问 [打印本页]

作者: 单片机初学者174    时间: 2019-10-23 22:13
标题: C语言键盘扫描程序的疑问
void keydown()
{
u8 a;
key=0x0f;
if(key!=0x0f)
{
delay(1000);
   if(key!=0x0f)
    {
        key=0x0f;//为什么这里要再一次赋值,如果赋值后,KEY置不冲突吗??前面明明判断为不等于0x0f.
         switch(key)
         {
         case(0x07):keyvalue=0;break;
         case(0x0b):keyvalue=1;break;
         case(0x0d):keyvalue=2;break;
         case(0x0e):keyvalue=3;break;         
         }


作者: csmyldl    时间: 2019-10-23 23:46
void keydown()
{
u8 a;
key=0x0f;                    //这里的key应该是定义为按键的端口了,如P0,key=0x0f是打通低4位输入通道
if(key!=0x0f)               //读出端口判断有无键按下
{
delay(1000);               //一般是延时10ms进行消抖
   if(key!=0x0f)           //再次读低4位进行判断
    {
        key=0x0f;          //再一次打通低4位输入通道
         switch(key)       //读出端口值进行判断
         {
         case(0x07):keyvalue=0;break;     //这个地方似乎常量不对,应包括高4位的的值,,否则要改为switch(key&0x0f)
         case(0x0b):keyvalue=1;break;
         case(0x0d):keyvalue=2;break;
         case(0x0e):keyvalue=3;break;         
         }
作者: 噗噗噗p    时间: 2019-10-24 01:15
再一次赋值,是为了进行列扫描。虽然赋了值,但按下按键的所在列的管脚会被拉低,switch语句则可以正常识别哪一列导通,所以KEY值并不会冲突
作者: wulin    时间: 2019-10-24 07:47
在这个程序中,楼主的疑问基本是对的。这是一赘句,没有好处也没有害处。只是白占了一点资源。
作者: 单片机初学者174    时间: 2019-10-24 18:38
csmyldl 发表于 2019-10-23 23:46
void keydown()
{
u8 a;

谢谢,说的很详细!!
作者: 单片机初学者174    时间: 2019-10-24 18:39
噗噗噗p 发表于 2019-10-24 01:15
再一次赋值,是为了进行列扫描。虽然赋了值,但按下按键的所在列的管脚会被拉低,switch语句则可以正常识别 ...

大概明白了,就是说在按键按下时,赋值,立马拉低,单片机会更好的识别。
作者: 单片机初学者174    时间: 2019-10-24 18:41
wulin 发表于 2019-10-24 07:47
在这个程序中,楼主的疑问基本是对的。这是一赘句,没有好处也没有害处。只是白占了一点资源。

嘿嘿,谢了哦,一开始不好理解。后来我把这行删除,似乎不影响效果~
作者: yzwzfyz    时间: 2019-10-24 20:58
原则上付一次1就可以了,赞同地板的说法。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1