OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3885|回复: 2

各位大神,请问一下关于pstwo的程序

[复制链接]

22

主题

61

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-2-28
在线时间
22 小时
发表于 2021-11-11 20:20:38 | 显示全部楼层 |阅读模式
8金钱
void PS2_ReadData(void)
{
        volatile u8 byte=0;
        volatile u16 ref=0x01;
        CS_L;
        PS2_Cmd(Comd[0]);  //开始命令
        PS2_Cmd(Comd[1]);  //请求数据
        for(byte=2;byte<9;byte++)          //开始接受数据
        {
                for(ref=0x01;ref<0x100;ref<<=1)
                {
                        CLK_H;
                        DELAY_TIME;
                        CLK_L;
                        DELAY_TIME;
                        CLK_H;
                      if(DI)
                      Data[byte] = ref|Data[byte];
                }
        delay_us(16);
        }
        CS_H;
}
关于 Data[byte] = ref|Data[byte]; 这个部分 为啥要或 ref 这个变量啊   
ps2的按键都在Date【3】和 Date【4】上 但是每一个Date都对应八个按键 而本身Date也是个u8的数据
如果或上ref的话岂不是始终有两个按键一直处于1 也就是没有被按的状态??
但是把ref|Data[byte]给改成Data[byte]的话 debug读取data的值都是0

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2020-6-12
在线时间
49 小时
发表于 2021-11-12 08:36:47 | 显示全部楼层
没见过程序,如果程序没有问题的话,那么|ref的意义就是把对应bit置1;在该程序中,只要DI非0,Data对应bit就读到1的意思,否则为0,所以读到什么数据,关键在于DI的值
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4915
金钱
4915
注册时间
2015-1-10
在线时间
616 小时
发表于 2021-11-12 09:08:39 | 显示全部楼层
没好好理清除逻辑啊,光看这段代码就知道原来Data[byte]就是0,而是通过if(DI)为真的时候对Data[byte]的某一位置位,这就表示某个键按下了,而ref就是每个键值位,分别是0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 10:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表