打印
[51单片机]

就四行代码?就是推不出预期结果?求大神灵犀一指!!!

[复制链接]
2022|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 | 只看该作者
#include "key_board.h"
#include "1602_display.h"


/********************************************************************
* 名称 : get_key(void)
* 功能 : 捕获键盘按下的键
* 输入 : 无
* 输出 : 相应的按键对应的字符
***********************************************************************/
char get_key(void)
{

    uchar row,column,n;
   
        P1 = 0xf;
        if(P1 != 0xf)
        {
        delay(15);
                if(P1 != 0xf)
                {
                    row = P1;
                        P1 = 0xf0;
                        column = P1>>4;
                        n = (row<<4)|column;

                        switch(n)
                {
                    case (0xee):return 'c';
                        case (0xed):return '0';
                        case (0xeb):return '=';
                        case (0xe7):return '/';
                        case (0xde):return '1';
                        case (0xdd):return '2';
                        case (0xdb):return '3';
                        case (0xd7):return '*';
                         case (0xbe):return '4';
                        case (0xbd):return '5';
                        case (0xbb):return '6';
                        case (0xb7):return '-';
                        case (0x7e):return '7';
                        case (0x7d):return '8';
                         case (0x7b):return '9';
                        case (0x77):return '+';
                        default:    return '#';
                 }         
                }
                else
                    return '$';
    }
        return NOKEY;          
}


这是扫描按键的部分源码

使用特权

评论回复
板凳
hdp7891000| | 2013-12-18 23:38 | 只看该作者
51是准双口,读前写1

使用特权

评论回复
地板
ayb_ice| | 2013-12-19 08:11 | 只看该作者
这个测试一下就知道了
按一个键读一个值就行了,
以后记住这个值对应这个键就行了

当然画个图,稍加分析一下也就知道了

使用特权

评论回复
5
huasanshao0206| | 2013-12-19 09:14 | 只看该作者
不要被P1=0xf0;这句误导了,column = P1>>4;这个时候读回来的P1值是按键后的P1值,而不是0xf0,所以n的低四位不是全1

使用特权

评论回复
6
鼹鼠|  楼主 | 2013-12-19 11:16 | 只看该作者
ayb_ice 发表于 2013-12-19 08:11
这个测试一下就知道了
按一个键读一个值就行了,
以后记住这个值对应这个键就行了

这是准备焊接实物计算器中的源代码 已经仿真运行测试没问题 矩阵按键的图我也画了只是
这这几句代码有疑惑

使用特权

评论回复
7
鼹鼠|  楼主 | 2013-12-19 11:19 | 只看该作者
huasanshao0206 发表于 2013-12-19 09:14
不要被P1=0xf0;这句误导了,column = P1>>4;这个时候读回来的P1值是按键后的P1值,而不是0xf0,所以n的低四 ...

我也这样想过 但是按照c语言语法规则 这里给p1口重新赋值难道不覆盖原来的扫描值 其实我就卡在P1 = 0XF0这一句上 刨根问底我还是没懂为什么?

使用特权

评论回复
8
鼹鼠|  楼主 | 2013-12-19 11:29 | 只看该作者
hdp7891000 发表于 2013-12-18 23:38
51是准双口,读前写1

读前置高电平 一句如醍醐灌顶 以前是直接P1 = 0XFF,明白了 这里在读取高四位时同低四位一样要提前置1
这个在哪里看过。。。我查查资料。非常感谢啊

使用特权

评论回复
9
鼹鼠|  楼主 | 2013-12-19 11:31 | 只看该作者
huasanshao0206 发表于 2013-12-19 09:14
不要被P1=0xf0;这句误导了,column = P1>>4;这个时候读回来的P1值是按键后的P1值,而不是0xf0,所以n的低四 ...

弄明白了 问题所在如一楼所说 自己确实被P1 = 0XF0,迷惑了 这个语句不过是读前置1 非常感谢!

使用特权

评论回复
10
ayb_ice| | 2013-12-19 11:38 | 只看该作者
就是正反读二次,把两次输入(每次为半个字节有效)组合成一个字节输出,即可

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

使用特权

评论回复
11
鼹鼠|  楼主 | 2013-12-19 12:12 | 只看该作者
ayb_ice 发表于 2013-12-19 11:38
就是正反读二次,把两次输入(每次为半个字节有效)组合成一个字节输出,即可

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

:loveliness:前辈又在拍砖了 额 这个是真心看了好久才明白

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

33

帖子

0

粉丝