付正龙 发表于 2019-9-20 16:27:34

74HC165并转串程序疑惑

关于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;                                //取反 点击哪个 哪个亮,否则点击哪个 哪个熄灭
               }
          }
}




神奇 发表于 2019-9-20 22:52:50

for循环的8次操作,令indata读取8个位得到一个字节的数据,每次读取的位从低位置入,先左移一位(indata=indata<<1;),然后新读的位从最低位置入(indata|=INT_data;)。

付正龙 发表于 2019-9-21 10:21:28

还是不明白 能解释的详细一点吗? 感谢

付正龙 发表于 2019-9-21 10:22:08

神奇 发表于 2019-9-20 22:52
for循环的8次操作,令indata读取8个位得到一个字节的数据,每次读取的位从低位置入,先左移一位(indata=in ...


还是不明白 能解释的详细一点吗? 感谢 :)

神奇 发表于 2019-9-21 21:55:02

已经讲得足够明白了
页: [1]
查看完整版本: 74HC165并转串程序疑惑