stm32读取两片74hc165d数据不正确

2019-07-14 14:16发布

unsigned char i;
  ADDR_SW_Data = 0;
  GPIO_ResetBits(GPIOC, 2);//clock_en ´ò¿ª165ѡͨ¶Ë
  GPIO_ResetBits(GPIOC, 1);//PL  //ÔËÐÐÊý¾Ý¼ÆÈë165
  delay_ms(1);
  GPIO_SetBits(GPIOC, 1);//PL //ÔÊÐíÊý¾ÝÒÆλ
  delay_ms(1);
  for(i=0;i<16;i++)  //¶Á16´ÎÊý¾Ý
  {
    GPIO_ResetBits(GPIOC, 0);//clock
    delay_ms(1);
   
    ADDR_SW_Data = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) | (ADDR_SW_Data<<1);//¶ÁÊäÈëÊý¾Ýλ  
   
    GPIO_SetBits(GPIOC, 0);//clock
    delay_ms(1);
  }
  GPIO_SetBits(GPIOC, 2);//clock_en //¹Ø±Õ165ѡͨ¶Ë
  GPIO_ResetBits(GPIOC,1);//PL  //ÔËÐÐÊý¾Ý¼ÆÈë165
  
  ADDR_SW_Data  =  ~ADDR_SW_Data;      //²¦Â뿪¹ØÈ¡·´
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
ctwewer
1楼-- · 2019-07-14 15:49
本帖最后由 wenyangzeng 于 2017-4-5 10:10 编辑

这个74HC165是串行接收,每次只读入1Bit,,读出后要马上移一位
for(i=0;i<16;i++)
{
GPIO_ResetBits(GPIOC, 0);
if( GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)
  GPIO_SetBits( ADDR_SW_Data, i);//先前变量弄错了
else
GPIO_ResetBits( ADDR_SW_Data, i);
GPIO_SetBits(GPIOC, 0);
}

补充一点:2只74HC165硬件还需要进行级连,否则只能8位8位的分别读其中1只。
HELLOKITTYNEW
2楼-- · 2019-07-14 15:58
 精彩回答 2  元偷偷看……
xieweibin
3楼-- · 2019-07-14 17:33
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空。
60user189
4楼-- · 2019-07-14 22:34
ADDR_SW_Data = 0;   没定义数据类型??   16位数据用 uchar 应该会出错吧。
ctwewer
5楼-- · 2019-07-15 02:32
HELLOKITTYNEW 发表于 2019-2-12 16:03
“板凳”那一页的代码缺少移位语句,数据只是LSB的1bit。看看是吗?

本帖最后由 wenyangzeng 于 2017-4-5 10:09 编辑

GPIO_SetBits( ADDR_SW_Data, i);//先前变量弄错了
else
GPIO_ResetBits( ADDR_SW_Data, i);
i已经在移位了,74HC165自己已经根据时钟在移动其并行端口的数据到串行输出端了。
andyfly7
6楼-- · 2019-07-15 04:39
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空

一周热门 更多>