小白求助,矩阵键盘检测问题

[复制链接]
1125|7
 楼主| 小甲鱼123 发表于 2017-3-29 19:04 | 显示全部楼层 |阅读模式
void keyscan()
{
        uchar temp;//
        P3 = 0xf0;
        temp=(P3 & 0xf0);
       
        if(temp != 0xf0)//
        {
               
                delay(5);//
                temp=P3 & 0xf0;
                if(temp != 0xf0)//
                {
                        P3 = temp | 0x0f;
                        keyvalue = P3;//
                        while((P3 = temp | 0x0f) == keyvalue);//
                }
        }
         
}


不用变量temp时,直接if(p3 & 0xf0 != 0xf0),检测不了矩阵键盘按下是什么原因呢?

 楼主| 小甲鱼123 发表于 2017-3-29 20:31 | 显示全部楼层
按多了,会检测不到是怎么回事儿?
 楼主| 小甲鱼123 发表于 2017-3-29 20:32 | 显示全部楼层
void main()
{
         for(;;)
        {
               
                keyscan();
                if(1 == key_deal(keyvalue))
                {
                  led1 = 0;
                }
                if(4 == key_deal(keyvalue))
                {
                  led1 = 1;
                }
        }
}

void keyscan()
{
        uchar temp;
        P3 = 0xf0;
        temp=(P3 & 0xf0);
        if(temp != 0xf0)// ÅжÏÊÇ·ñÓа´¼ü°´ÏÂ
        {
               
                delay(5);// Ïû¶¶
                temp=P3 & 0xf0;
                if(temp != 0xf0)// ÔÙ´ÎÅжϣ¬È·¶¨ÊÇ·ñÕæµÄÓа´¼ü°´ÏÂ
                {
                        P3 = temp | 0x0f;//°Ñ¸ßËÄλµÄÖµ¸³¸øP3£¬´Ó¶ø¿ÉÒԵõ½Ò»¸ö°ËλµÄ¼üÖµÂë
                        keyvalue = P3;// »ñÈ¡¼üÖµÂë
                        while((P3 = temp | 0x0f) == keyvalue);//ËÉÊÖ¼ì²â
                }
        }
         
}

uchar key_deal(uchar temp)//
{
        uchar num = 0;
        switch(temp)
        {
                case 0xee : num = 1;
                        break;
                case 0xed : num = 5;
                        break;
                case 0xeb : num = 9;
                        break;
                case 0xe7 : num = 13;
                        break;

                case 0xde : num = 2;
                        break;
                case 0xdd : num = 6;
                        break;
                case 0xdb : num = 10;
                        break;
                case 0xd7 : num = 14;
                        break;

                case 0xbe : num = 3;
                        break;
                case 0xbd : num = 7;
                        break;
                case 0xbb : num = 11;
                        break;
                case 0xb7 : num = 15;
                        break;

                case 0x7e : num = 4;
                        break;
                case 0x7d : num = 8;
                        break;
                case 0x7b : num = 12;
                        break;
                case 0x77 : num = 16;
                        break;

                default : ;
        }

        return num;
}
dirtwillfly 发表于 2017-3-30 21:00 | 显示全部楼层
51单片机?
电路是怎么样的?
 楼主| 小甲鱼123 发表于 2017-3-30 21:18 | 显示全部楼层
dirtwillfly 发表于 2017-3-30 21:00
51单片机?
电路是怎么样的?

对啊,新手当然是学51
 楼主| 小甲鱼123 发表于 2017-3-30 21:21 | 显示全部楼层
dirtwillfly 发表于 2017-3-30 21:00
51单片机?
电路是怎么样的?

行线依次接P3的第四位,列线接高四位,led1接的是P1^0
hbin85 发表于 2017-4-18 14:50 | 显示全部楼层
(p3 & 0xf0 != 0xf0)
优先级问题
!= 优先级高于&运算符
if((p3 & 0xf0) != 0xf0)这样应该就可以了
 楼主| 小甲鱼123 发表于 2017-5-1 14:48 | 显示全部楼层
hbin85 发表于 2017-4-18 14:50
(p3 & 0xf0 != 0xf0)
优先级问题
!= 优先级高于&运算符

谢谢啊,C语言运算符不熟悉,真是尴尬啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部