关于矩阵键盘反转法中的一个奇怪的问题

2019-07-16 00:23发布

矩阵键盘扫描-----反转法
#include<reg52.h>#define uint unsigned int
#define uchar unsigned char
uchar low,high,temp;
void delay(uint t);
void main()
{
        while(1)
        {       
                        P3=0x0f;
                        if(P3!=0x0f)
                        {        delay(100);
                                low=P3&0x0f;
                                P3=0xff; //What the hell  ??????
                                P3=0xf0;        //如果没了上面那行,此处用 P3=low|0xf0 什么的 同样失效。。。。                       
                                high=P3&0xf0;
                               
                                temp=high+low;       
                                switch(temp)
                                                {
                                                        case 0xd7:P0=0x3f;break; //0
                                                        case 0xeb:P0=0x06;break; //1
                                                        case 0xdb:P0=0x5b;break;   //2
                                                        case 0xbb:P0=0x4f;break;  //3
                                                        case 0xed:P0=0x66;break;   //4
                                                        case 0xdd:P0=0x6d;break;  //5
                                                        case 0xbd:P0=0x7d;break;   //6
                                                        case 0xee:P0=0x07;break;   //7
                                                        case 0xde:P0=0x7f;break;        //8
                                                        case 0xbe:P0=0x6f;break;        //9
                                                }                                 
                        }
       
        }  
}
void delay(uint t)
{
        while(t--);
}

-----------------------------------------------------------------------------------------------------------------------
首先 这个程序是正确的,虽然有些地方不足,但是是可以正常工作的。。。

主要是红 {MOD}字体那 就是让我纠结了好久的一个问题,实在是想不出来了 所以来论坛里求助 希望大家能帮帮忙 看一下也行  谢谢了 :)

因为实在是太奇怪了,
如果没有他,
如果我将她该为0x0f;那么高四位(P3.4~P3.7)相当于失效。
如果将他改为0xfe;那么P3.0口就失效。。。
总之就是,这个P3端口必须要置1一下 后面才能使用。
但是从C语言上,对于下面一条语句来说,他是多余的呀,难道和硬件有关吗???
如果有关的话 那这句话究竟起着什么作用呢???  
我是在仿真软件上进行测试的 也没有提示有错误

QQ截图20130526101448.jpg


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
默默地努力
2019-07-16 13:42
仔细看了看你的代码,没发现什么问题,我把你写的和我自己写的对比了一下,可能是有些地方直接对IO口操作了?我也不太清楚,我是把IO口的值拿出来在进行操作的。我写的代码粘在下面了。另外,仿真和在实际的硬件环境真的有很大差别,有时候仿真对的程序,在硬件上不一定对,所以还是尽量用硬件吧。找到问题的话,跟我说一声

//键盘扫描函数
uchar Matrixkeyscan()
{
        uchar num;
        uchar key_lie;                                                //按键扫描函数里用来存储列的变量
        uchar key_hang;                                        //存储行的变量
        uchar key;                                                //具体按下的键值的编码                                                       

        P2=0xf0;                                                         //1111 0000,行为低电平,列为高电平
        key_lie=P2;                                                //读取IO的数值
        key_lie=key_lie&0xf0;                               //与,将低四位屏蔽
        if(key_lie!=0xf0)                                       //如果不等,说明有按键按下
        {
                Delay_ms(10);                                         //去抖动
                if(key_lie!=0xf0)                              //说明确实有按键被按下
                {
                        key_lie=P2;                                //读取最新的P2值
                        key_lie=key_lie&0xf 0;             //得到最新的列的信息(这两行可以不写,写上更严谨)
                                                                        //假如第一列的某个按键按下,则key_lie为1110 0000
                        P2=0x0f;                                       //0000 1111,列为低电平,行为高电平
                        key_hang=P2;                               //读取P2口
                        key_hang=key_hang&0x0f;        //将高四位屏蔽掉,得到具体的行的信息,假如第一行的某个按键被按下
                                                                        //则key_hang为0000 1110
                        key=key_hang|key_lie;              //将行和列的信息相或,1110 0000 |0000 1110=1110 1110,
                                                                        //可知第一行,第一列的按键被按下
                }
                while(P2!=0x0f);                                //等待按键被释放
        }
        switch(key)                                                //根据按键的数值进行判断
        {
                case 0xee: num=0;break;                //0xee=1110 1110 说明第一个按键被按下,则num的值为0;
                case 0xde: num=1;break;
                case 0xbe: num=2;break;
                case 0x7e: num=3;break;
                case 0xed: num=4;break;
                case 0xdd: num=5;break;
                case 0xbd: num=6;break;
                case 0x7d: num=7;break;
                case 0xeb: num=8;break;
                case 0xdb: num=9;break;
                case 0xbb: num=10;break;
                case 0x7b: num=11;break;
                case 0xe7: num=12;break;
                case 0xd7: num=13;break;
                case 0xb7: num=14;break;
                case 0x77: num=15;break;
                case 0x00: num=16;break;               //如果没有按键按下,则不显示
        }
        return num;
}

一周热门 更多>