4491|8

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一个按键程序 [复制链接]

P1.0~P1.3接行     P1.4~P1.7接列
#include
#define uchar unsigned char
#define uint  unsigned int
uchar num,temp,num1;
uchar i=0,j=0;
uchar code table[]={0x02,0X9F,0x25,0x0D,0x99,0x49,0x40,0x1F,0x00,0x08 };
//延时函数
void delay(uint i)
{
  uint j;
  for(;i>0;i--)
    for(j=100;j>0;j--);
}
//主函数
main()
{
   uchar key;
   while(1)
   {
      key=keyscan();
      delay(5);
    }

}
//键盘扫描函数
uchar keyscan()
{
   uchar code_h;         //行扫描。
   uchar code_l;         //列扫描。
   P1=0xf0;              //P1.0~P1.3发全0,准备读列状态
   if((P1&0Xf0))!=0xf0)  //如果P1.4~p1.7不全位0,怎有键被按下
   {  
      delay();
      if((P1&0XF0))!=0xf0)           //确认有键按下
     {
      code_h=0xfe;                   //P1.0置为0,开始行扫描
      while((code_h&0x10)!=0xf0)     //判断是不是最后1行,若不是,继续扫描
        {
            P1=code_h;                                //P1口输出行扫描
            if((P1&0XF0)!=0xf0)                       //如果P1.4~P1.7不全1,该行有键按下
             {
                     code_1=(P1&0XF0|0X0F) ;        //保留P1搞四位,第四位变为1,作为列值。     
                     return((~code_h)+(~code_l));     //键码值=行扫描值+列扫描值,返回主程序

              }
                 else                                //若该行无键按下,行扫描左移,扫描下一行
                      code_h=(code_h<<1)|0x01;

        }
      }
    }

}

  return (0);                                     //无键按下,返回0.


为什么while((code_h&0x10)!=0xf0)     可以判断判断是不是最后1行呢,

最新回复

呵呵,女生更值得佩服  详情 回复 发表于 2009-12-16 13:06
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主的0x10和0xf0的位置是不是写反了?
如果改成 while( (code_h & 0xf0) != 0x10 )就可以理解了。
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主的0x10和0xf0的位置是不是写反了?
如果改成 while( (code_h & 0xf0) != 0x10 )就可以理解了。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
code_h=0xfe;                  //P1.0置为0,开始行扫描


如果code_h为0x7f 表示循环了4次 行扫描完成   0x7f&0x10=xf0
如果code_h不为0x7f 表示循环不够4次 行扫描要继续,0x7f&0x10!=xf0


while((code_h&0x10)!=0xf0)    //判断是不是最后1行,

code_h=(code_h < <1)|0x01; //初值code_h是0xfe 经过这样的运算  code_h为 0xfd 0xfb 0xf7 0x7f
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
jf
 
 
 

回复

97

帖子

7

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 cfanlwn 的回复:
code_h=0xfe;? ? ? ? ? ? ? ? ? //P1.0置为0,开始行扫描


如果code_h为0x7f 表示循环了4次 行扫描完成? 0x7f&0x10=xf0
如果code_h不为0x7f 表示循环不够4次 行扫描要继续,0x7f&0x10!=xf0

while((code_h&0x10)!=0xf0)? ? //判断是不是最后1行,

code_h=(code_h < <1)|0x01; //初值code_h是0xfe 经过这样的运算? code_h为 0xfd 0xfb 0xf7 0x7f

楼上哥们儿已经解释得很清楚,其实就是将P1.0-P1.3依次拉低,而其他位置拉高,通过code_h=(code_h < <1)|0x01实现的,当code_h=0x7f时,就表示已经检测完将P1.3拉低的情形,检测完成!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 heyme 的回复:
楼上哥们儿已经解释得很清楚,其实就是将P1.0-P1.3依次拉低,而其他位置拉高,通过code_h=(code_h  <  <1)|0x01实现的,当code_h=0x7f时,就表示已经检测完将P1.3拉低的情形,检测完成!

我不是哥们,我是女的,嘿嘿
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
MARK.
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 cfanlwn 的回复:
引用 5 楼 heyme 的回复:
楼上哥们儿已经解释得很清楚,其实就是将P1.0-P1.3依次拉低,而其他位置拉高,通过code_h=(code_h?
我不是哥们,我是女的,嘿嘿


呵呵,女生更值得佩服
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表