微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51C语言编程的疑问!希望高手们能帮我解答

51C语言编程的疑问!希望高手们能帮我解答

时间:10-02 整理:3721RD 点击:
temp  去掉,直接用P1 代替  , 这样有什么区别吗 ?

void  keyscan(void)
{  P1=0xF0;                 //高四位输入   列为高电平  行为低电平
    delay(1);
        temp=P1;                                 //延时               //读P1口
    temp=temp&0xF0;                         //屏蔽低四位
    temp=~((temp>>4)|0xF0);          
   if(temp==1)          // p1.4 被拉低
        key=1;  //第1个按键键值
    else if(temp==2)   // p1.5 被拉低
        key=2;          //第2个按键键值
    else if(temp==4)   // p1.6 被拉低
        key=3;         //第3个按键键值
    else if(temp==8)   // p1.7 被拉低
         key=4;          //第4个按键键值
        else
           key = 16;
    P1=0x0F;             //低四位输入  行为高电平 列为低电平
    delay(1);                         //延时
        temp=P1;             //读P1口      
    temp=temp&0x0F;
    temp=~(temp|0xF0);
    if(temp==2)                   //第一行  p1.1  被拉低(直接P1==2 是因为我们P1.0空的,是3*4的矩阵键盘)
        key=key+0;
    else if(temp==4)   //第二行  p1.2  被拉低
        key=key+4;
    else if(temp==8)   //第三行 p1.3  被拉低
        key=key+8;
        else
          key = 16;

这个算法不可以用P1直接代替。

能具体一点吗,我就是不知道为什么不可以,因为我试了是不行的

不行的!因为temp 读取的是 P1 的状态,它保留的是 P1的状态,如果你用 P1 = xxxx,那么 P1 的状态就被你强行改变了,,不能读取按键的状态了。!懂了撒?

temp只是开辟了个存储空间,作为键码缓存处理用。肯定不能用P1代替了。
解释P1:其是reg52.h中定义的sfr(特殊功能寄存器)类型的。实体P1口被映射到单片机内RAM高128B的地址中。操作P1类似读写片内RAM。而对P1的操作,会反映在P1口上,也就是说P1口会相应的被置位、清零。
temp:你自定义的变量,开辟空间在片内RAM低128B内。不会造成外设的动作。
假设你P1替换了temp,那么与逻辑相悖了。具你的这句代码来说:temp=temp&0xF0;换成P1,那么P1口就会受到影响。从而影响你键值的输入和判断。因为你这个逻辑,P1是要此刻等于0xf0的,也就是判断4x4中某行被选中。

现在懂了,真心感谢你的解答!谢谢

现在懂了,真心感谢你的解答!谢谢

高手太多了,惭愧惭愧,学习学习
来自:中国电子技术论坛 Windows Phone 8 客户端来自: WindowsPhone客户端

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top