[51单片机] 就四行代码?就是推不出预期结果?求大神灵犀一指!!!

[复制链接]
2437|10
 楼主| 鼹鼠 发表于 2013-12-18 22:02 | 显示全部楼层 |阅读模式
请教大神们一下?前提是P1口接4*4矩阵按键 P1 = 0x0f;row = P1;
P1 = 0xf0;
column = P1>>4;
n = (row<<4)|column;这段代码n 会有哪些值呢?源程序上是 0xee,0xed,0xeb,0xe7,0xde...0xbe...0x7e,0x7d,0x7b,0x77,可是我推了好几遍 就是推不出这些结果值 程序已下载到原理图中仿真没有错——————本人对这段代码的理解:比如随便按下一个按键 假设P1值为0x0E,则row=0x0e,给P1重新赋值后P1右移四位为0x0f,赋给column,row左移四位为0xe0,与column位或(0xe0|0x0f)这样结果为0xef,同理所有的低四位都为1 我的理解哪错了呢
 楼主| 鼹鼠 发表于 2013-12-18 22:03 | 显示全部楼层
  1. #include "key_board.h"
  2. #include "1602_display.h"


  3. /********************************************************************
  4. * 名称 : get_key(void)
  5. * 功能 : 捕获键盘按下的键
  6. * 输入 : 无
  7. * 输出 : 相应的按键对应的字符
  8. ***********************************************************************/
  9. char get_key(void)
  10. {

  11.     uchar row,column,n;
  12.    
  13.         P1 = 0xf;
  14.         if(P1 != 0xf)
  15.         {
  16.         delay(15);
  17.                 if(P1 != 0xf)
  18.                 {
  19.                     row = P1;
  20.                         P1 = 0xf0;
  21.                         column = P1>>4;
  22.                         n = (row<<4)|column;

  23.                         switch(n)
  24.                 {
  25.                     case (0xee):return 'c';
  26.                         case (0xed):return '0';
  27.                         case (0xeb):return '=';
  28.                         case (0xe7):return '/';
  29.                         case (0xde):return '1';
  30.                         case (0xdd):return '2';
  31.                         case (0xdb):return '3';
  32.                         case (0xd7):return '*';
  33.                          case (0xbe):return '4';
  34.                         case (0xbd):return '5';
  35.                         case (0xbb):return '6';
  36.                         case (0xb7):return '-';
  37.                         case (0x7e):return '7';
  38.                         case (0x7d):return '8';
  39.                          case (0x7b):return '9';
  40.                         case (0x77):return '+';
  41.                         default:    return '#';
  42.                  }         
  43.                 }
  44.                 else
  45.                     return '$';
  46.     }
  47.         return NOKEY;          
  48. }


  49. 这是扫描按键的部分源码
hdp7891000 发表于 2013-12-18 23:38 | 显示全部楼层
51是准双口,读前写1
ayb_ice 发表于 2013-12-19 08:11 | 显示全部楼层
这个测试一下就知道了
按一个键读一个值就行了,
以后记住这个值对应这个键就行了

当然画个图,稍加分析一下也就知道了
huasanshao0206 发表于 2013-12-19 09:14 | 显示全部楼层
不要被P1=0xf0;这句误导了,column = P1>>4;这个时候读回来的P1值是按键后的P1值,而不是0xf0,所以n的低四位不是全1
 楼主| 鼹鼠 发表于 2013-12-19 11:16 | 显示全部楼层
ayb_ice 发表于 2013-12-19 08:11
这个测试一下就知道了
按一个键读一个值就行了,
以后记住这个值对应这个键就行了

这是准备焊接实物计算器中的源代码 已经仿真运行测试没问题 矩阵按键的图我也画了只是
这这几句代码有疑惑
 楼主| 鼹鼠 发表于 2013-12-19 11:19 | 显示全部楼层
huasanshao0206 发表于 2013-12-19 09:14
不要被P1=0xf0;这句误导了,column = P1>>4;这个时候读回来的P1值是按键后的P1值,而不是0xf0,所以n的低四 ...

我也这样想过 但是按照c语言语法规则 这里给p1口重新赋值难道不覆盖原来的扫描值 其实我就卡在P1 = 0XF0这一句上 刨根问底我还是没懂为什么?
 楼主| 鼹鼠 发表于 2013-12-19 11:29 | 显示全部楼层
hdp7891000 发表于 2013-12-18 23:38
51是准双口,读前写1

读前置高电平 一句如醍醐灌顶 以前是直接P1 = 0XFF,明白了 这里在读取高四位时同低四位一样要提前置1
这个在哪里看过。。。我查查资料。非常感谢啊
 楼主| 鼹鼠 发表于 2013-12-19 11:31 | 显示全部楼层
huasanshao0206 发表于 2013-12-19 09:14
不要被P1=0xf0;这句误导了,column = P1>>4;这个时候读回来的P1值是按键后的P1值,而不是0xf0,所以n的低四 ...

弄明白了 问题所在如一楼所说 自己确实被P1 = 0XF0,迷惑了 这个语句不过是读前置1 非常感谢!
ayb_ice 发表于 2013-12-19 11:38 | 显示全部楼层
就是正反读二次,把两次输入(每次为半个字节有效)组合成一个字节输出,即可

这都看不明白,确实不适合干这行的
 楼主| 鼹鼠 发表于 2013-12-19 12:12 | 显示全部楼层
ayb_ice 发表于 2013-12-19 11:38
就是正反读二次,把两次输入(每次为半个字节有效)组合成一个字节输出,即可

这都看不明白,确实不适合干 ...

:loveliness:前辈又在拍砖了 额 这个是真心看了好久才明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

33

帖子

0

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