6918|11

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

帮帮我啊。矩阵键盘扫描前为什么要给P3口赋初值 [复制链接]


  1. UCHAR keyScan()
  2. {
  3.     void delay(UINT);
  4.     UCHAR xTemp, yTemp, readKey, reReadKey;

  5.     keyFlag = 0; //扫描按键前清除按键标记  
  6.     xTemp = (P3 = 0x0f) & 0x0f; //获取低四位的值,即矩阵键盘的行值
  7.     if(xTemp == 0x0f) //无按下键
  8.         return 0xff;
  9.     yTemp = (P3 = 0xf0) & 0xf0; //获取高四位的值,即矩阵键盘的列值
  10.     readKey = xTemp | yTemp;
  11.     delay(5);  //延时后再测
  12.     xTemp = (P3 = 0x0f) & 0x0f; //获取低四位的值,即矩阵键盘的行值
  13.     if(xTemp == 0x0f) //无按下键
  14.         return 0xff;
  15.     yTemp = (P3 = 0xf0) & 0xf0; //获取高四位的值,即矩阵键盘的列值
  16.     reReadKey = xTemp | yTemp;
  17.     if(reReadKey == readKey)
  18.     {
  19.         keyFlag = 1;
  20.         return readKey;
  21.     }      
  22. }

  23. xTemp = (P3 = 0x0f) & 0x0f; //获取低四位的值,即矩阵键盘的行值 ,P3 = 0x0f我看不懂。。。为什么要给P3赋初值,赋完值后P3的值不就是保持0x0f 不变了吗?去掉赋初值的话程序就有问题了。 这里的赋初值P3 = 0x0f 和P3 = 0xf0到底有什么作用?
  24. 请大侠帮帮我。
复制代码

最新回复

输入和输出不一样啊,要看看读和写的区别(51),8515就需要设置了端口了  详情 回复 发表于 2010-5-17 22:27
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
xTemp = (P3 = 0x0f) & 0x0f; //赋完值完后,P3的值就是0x0f,那么和0x0f进行&操作。值不就肯定是0x0f了吗?
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
建议楼主看一下何谓“准双向i/o口”。如果一个端口只用作读取的话,读取之前不需要做特殊处理。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 a006045 的回复:
xTemp = (P3 = 0x0f) & 0x0f; //赋完值完后,P3的值就是0x0f,那么和0x0f进行&操作。值不就肯定是0x0f了吗?


51单片机作为输入口,也就是检测IO电平的时候,要先设置输出一下,对应输出为1。你用P3的低4bit作为按键检测,那么检测前要将P3 = 0x0f,然后再判断其口上的电平,& 0xf0。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 jiqiang01234 的回复:
建议楼主看一下何谓“准双向i/o口”。如果一个端口只用作读取的话,读取之前不需要做特殊处理。

嗯。我去看看先。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
获取点经验……
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
xTemp = (P3 = 0x0f) & 0x0f; //获取低四位的值,即矩阵键盘的行值

这个语句是两个过程,可以分开来看。
1。(P3 = 0x0f),这个先对P3发送扫描信号,扫描低四位
2. xTemp=P3&0x0f,这句的意思就是读取键盘按下的信息,看看是否有键按下
并且用接下来的一句来判断 if(xTemp == 0x0f) //无按下键
        return 0xff;
你自己多看看这个键盘电路的硬件连接就理解了。。。。呵呵
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 

  1. UCHAR keyScan()
  2. {
  3.     void delay(UINT);
  4.     UCHAR xTemp, yTemp, readKey, reReadKey;

  5.     keyFlag = 0; //扫描按键前清除按键标记  
  6.     xTemp = (P3 = 0x0f) & 0x0f; //获取低四位的值,即矩阵键盘的行值
  7.     if(xTemp == 0x0f) //无按下键
  8.         return 0xff;
  9.     yTemp = (P3 = 0xf0) & 0xf0; //获取高四位的值,即矩阵键盘的列值
  10.     readKey = xTemp | yTemp;
  11.     delay(5);  //延时后再测
  12.     xTemp = (P3 = 0x0f) & 0x0f; //获取低四位的值,即矩阵键盘的行值
  13.     if(xTemp == 0x0f) //无按下键
  14.         return 0xff;
  15.     yTemp = (P3 = 0xf0) & 0xf0; //获取高四位的值,即矩阵键盘的列值
  16.     reReadKey = xTemp | yTemp;
  17.     if(reReadKey == readKey)
  18.     {
  19.         keyFlag = 1;
  20.         return readKey;
  21.     }      
  22. }[

复制代码

另外,我想问下这段程序是否有问题。。怎么我下载到实验板上去了按下键没反应。我用的实验板是郭祥的十天学会单片机里的TX-1实验板。下面这段程序下载到实验板上按下键盘就有反应。

  1. void keyScan()
  2. {
  3.     void delay(UINT);
  4.     UCHAR temp, i;
  5.    
  6.     for(i = 0; i < 4; i++)
  7.     {
  8.         switch(i)
  9.         {
  10.             case 0: P3 = 0xfe;break;
  11.             case 1: P3 = 0xfd;break;
  12.             case 2: P3 = 0xfb;break;
  13.             case 3: P3 = 0xf7;break;
  14.         }
  15.         if((P3 & 0xf0) != 0xf0)
  16.         {
  17.             delay(5);
  18.             if((P3 & 0xf0) != 0xf0)
  19.             {
  20.                 temp = P3;
  21.                 switch(temp)
  22.                 {
  23.                     case key1: number = 1;break;
  24.                     case key2: number = 4;break;
  25.                     case key3: number = 9;break;
  26.                     case key4: number = 16;break;
  27.                     case key5: number = 25;break;
  28.                     case key6: number = 36;break;
  29.                     case key7: number = 49;break;
  30.                     case key8: number = 64;break;
  31.                     case key9: number = 81;break;
  32.                     case key10: number = 100;break;
  33.                     case key11: number = 121;break;
  34.                     case key12: number = 144;break;
  35.                     case key13: number = 169;break;
  36.                     case key14: number = 196;break;
  37.                     case key15: number = 225;break;
  38.                     case key16: number = 256;break;
  39.                 }
  40.                 while(P3 & 0xf0 != 0xf0)
  41.                     ;  
  42.             }
  43.         }
  44.     }
  45. }   
复制代码

 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
你要说明你的电路和你的程序的逻辑....
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

10
 
P3做读入状态时,应该要先写1的,才能正确读入数据
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

11
 
按照课本原文 作输入时:必须先将1写入口锁存器,使场效应管截止,该口线同时被内部上拉电阻拉成高电平,同时也能被外部输入源拉成低电平,即外部输入1时,该口线为高电平,输入0时,该口线为低电平
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

12
 
输入和输出不一样啊,要看看读和写的区别(51),8515就需要设置了端口了
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表