搜索
bottom↓
回复: 8

74hc165读取的驱动,读取第一位的时序问题

[复制链接]

出0入0汤圆

发表于 2014-11-18 21:02:46 | 显示全部楼层 |阅读模式
本帖最后由 防滑销钉 于 2014-11-18 22:02 编辑

关于74hc165大家应该都很熟悉了,这里我想将8个按键连接在hc165的8个并行接口上,转换为串行数据输出。然后通过单片机采集串行数据,判断按键的状态。
网上常见的读取的驱动如下。
UINT8 _74HC165_GetData(void)//读取数据
{
        UINT8 i,Data=0;
        
        _74HC165_nPL=0;
        _74HC165_nPL=1;
        
        for(i=0;i<8;i++)
        {        
                Data<<=1;
                Data|=_74HC165_SDA;
                _74HC165_CLK=0;
                _74HC165_CLK=1;
        }

        _74HC165_CLK=0;

        return(Data);
}


语句 _74HC165_nPL=0;将并行数据送入芯片内部寄存器,然后紧接着就是将数据串行输出了。

_74HC165_nPL=1;使能串行输出,在时钟的每个上升沿将数据从高位到低位依次送到串行口上。


这里我不明白的是,当第一次进入for循环时,先将时钟置为0 (_74HC165_CLK=0;),然后读取当前的电平( Data|=_74HC165_SDA),然后将时钟置1(_74HC165_CLK=1),也就是产生上升沿。

但是在第一次读取电平的时候,上升沿还没有来到啊?74hc165不是在时钟的每个上升沿,才会依次将数据送到串行线上吗?

第一次进入for循环的时候,还没有产生上升沿,那么这次的读取岂不是没有作用?

for循环结束的时候,不就只读到了7个有效数字吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2014-11-18 22:00:39 | 显示全部楼层
没有人能给个提示吗?按照我的理解,程序应该是这样的:
UINT8 _74HC165_GetData(void)//读取数据
{
        UINT8 i,Data=0;
        
        _74HC165_nPL=0;
        _74HC165_nPL=1;

         _74HC165_CLK=0;
        
        for(i=0;i<8;i++)
        {        
               
                _74HC165_CLK=1;
                Data<<=1;
                Data|=_74HC165_SDA;
                _74HC165_CLK=0;
        }
        return(Data);
}
但这样,最高位就错过了,造成最后依次读取的是无效位。

那我的理解究竟那里出了问题呢?有人能帮一下忙吗?

出0入0汤圆

发表于 2014-11-18 22:13:05 | 显示全部楼层
你把165的内部示意图贴上来看看,你这么问问题是不行的,呵呵,第一,大家手里都没有这个东西,第二,我的习惯是这样的东西调完了不会记住,第三,很少有人会为这个去找数据手册看,所以你直接把165的内部示意图发上来,再把程序贴出来,才会有人注意,呵呵!

出0入0汤圆

发表于 2014-11-18 22:13:13 | 显示全部楼层
看看下面的,我正在用的

unsigned char  ReadByte165(void)
{
        unsigned char i,scanbit=0x01;
        unsigned char v0=0;
        clr_cp;
        clr_pl;
        __NOP();
        __NOP();
        set_pl;
        for(i=0;i<8;i++)
        {
                if(LPC_GPIO3->DATA&(1<<0))
                {v0|=scanbit<<i;}
                set_cp;
                __NOP();
                __NOP();
                __NOP();
                __NOP();
                clr_cp;
        }
        return v0;
}

出0入0汤圆

 楼主| 发表于 2014-11-20 19:19:46 | 显示全部楼层
wangpengcheng 发表于 2014-11-18 22:13
你把165的内部示意图贴上来看看,你这么问问题是不行的,呵呵,第一,大家手里都没有这个东西,第二,我的 ...

是啊,我明白了。确实想我这样发帖,大家都不会留意,而且也没有什么可以参照的东西。
我重新编辑一下好了。

出0入0汤圆

 楼主| 发表于 2014-11-20 19:34:25 | 显示全部楼层
cu_ice 发表于 2014-11-18 22:13
看看下面的,我正在用的

unsigned char  ReadByte165(void)

谢谢你的回复了,我发现我好像理解的不对,我再仔细,看看数据手册。

出0入0汤圆

发表于 2015-4-20 15:46:41 | 显示全部楼层
我写的
/******74HC165串行接收程序************/
unsigned char RXD_74HC165 (void)
{ unsigned char i,rdata;
  SCLK_1;
  SL_0;
  _NOP();_NOP();_NOP();_NOP(); _NOP();_NOP();
  SL_1;
  for(i=0;i<8;i++)
  {  rdata>>=1;
     SCLK_0;
     _NOP();_NOP();_NOP();
    if(SIN==0x10)     //读数据
      rdata|=0x80;
     SCLK_1;
    _NOP();_NOP();_NOP();
  }
   return rdata;
}

出0入0汤圆

发表于 2015-4-20 17:40:16 | 显示全部楼层
正好在搞一个项目要用到。留名!!

出10入12汤圆

发表于 2015-6-28 19:36:36 | 显示全部楼层
cu_ice 的可用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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