请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3432|回复: 4

74HC165并转串程序疑惑

[复制链接]

1

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2019-9-20 16:27:34 | 显示全部楼层 |阅读模式
关于165那个循环里的或运算 我不太理解,8个独立按键初始为0xff (按下哪个后对应位为低电平),和8个LED灯对应(已经初始化为0x00)。3.0的板子
举例:按下第七个键K7, 此时8个独立按键的数据应该为1011 1111,当SH/LD低电平时并行置入165寄存器的数据是1011111(疑惑1:这个按键的数据1011 1111是不是进入了indata这个变量?) ,
假设INT_data=1 开始进入循环左移第一位后 indata由1011 1111变成0111 1110 等待上升沿移至串口输出最高位1 (这个移位没问题)
然后或运算(indata|=INT_data;)后 indata=1111 1111,第一 次循环结束第二次移位对象就是1111 1111的最高位了不是原本按键数据的次高位0?(疑惑2)

没有描述清楚的地方 请各位不吝赐教


#include "reg51.h"
#include "intrins.h"                                       

typedef unsigned char u8;                               
#define GPIO_LED P0                                        //宏定义p0口控制8个LED

sbit SH_LD=P1^6;                                                //用p1.6控制置入SH/LD管脚 已经接好
sbit INT_data=P1^7;                                        //用p1.7控制Qh管脚        数据通过P1.7脚移进单片机内处理        只需和74HC165的QH短接
sbit CLK=P3^6;                                                //用p3.6控制时序 已经接好

u8 Read74HC165()                                                //有返回值的u8类型函数
{  
        u8 indata=0;                                                //数据清零
        u8 i;
        SH_LD=0;                                                //低电平置入才有效        将8个独立按键的实时数据置入寄存器中
                             (疑惑1:这个按键的数据1011 1111是不是进入了indata这个变量?)
        _nop_();                                                         //延时一个机器周期
        SH_LD=1;                                                //锁存刚才的数据 将寄存器功能由置入变成移位 高电平移位功能才有效  
        _nop_();                                                         //延时一个机器周期
       
        for(i=0;i<8;i++)
        {
           indata=indata<<1;                                //数据左移一位 保证每一位轮流为最高位
           CLK=0;                                                        //CLK低电平
           _nop_();                                                 //延时一个机器周期
           indata|=INT_data;                                //或运算                   (疑惑2:最主要不理解的地方)       
           CLK=1;                                                        //CLK高电平 产生了上升沿(↑有效) 数据会从高位开始产生移位
        }
        return indata;
}
void main()
{
          u8 HC165;                                                        //用于保存函数的返回值
          GPIO_LED=0;                                                //初始化LED    使LED全部熄灭 (默认上拉电阻高电平 亮)
          while(1)
          {
                 HC165=Read74HC165();                               //获得从独立按键处的按键信息数据 无按键按下时 独立按键处为0xff
                 if(HC165!=0xff)
                 {
                   GPIO_LED=~HC165;                                //取反 点击哪个 哪个亮,否则点击哪个 哪个熄灭
                 }
          }
}




回复

使用道具 举报

0

主题

66

帖子

246

积分

中级会员

Rank: 3Rank: 3

积分
246
发表于 2019-9-20 22:52:50 | 显示全部楼层
for循环的8次操作,令indata读取8个位得到一个字节的数据,每次读取的位从低位置入,先左移一位(indata=indata<<1;),然后新读的位从最低位置入(indata|=INT_data;)。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
 楼主| 发表于 2019-9-21 10:21:28 | 显示全部楼层
还是不明白 能解释的详细一点吗? 感谢
回复 支持 反对

使用道具 举报

1

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
 楼主| 发表于 2019-9-21 10:22:08 | 显示全部楼层
神奇 发表于 2019-9-20 22:52
for循环的8次操作,令indata读取8个位得到一个字节的数据,每次读取的位从低位置入,先左移一位(indata=in ...


还是不明白 能解释的详细一点吗? 感谢
回复 支持 反对

使用道具 举报

0

主题

66

帖子

246

积分

中级会员

Rank: 3Rank: 3

积分
246
发表于 2019-9-21 21:55:02 | 显示全部楼层
已经讲得足够明白了
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-3-29 04:48 , Processed in 0.088754 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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