完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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; //²¦Â뿪¹ØÈ¡·´ |
|
相关推荐
20个回答
|
|
这是初始化:
GPIO_InitTypeDef ADDR_SW_GPIO_InitStructure; /* GPIOD Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // /* Configure zoom and focus pins in output pushpull mode */ ADDR_SW_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;//0:clock;1L;2:clock_en GPIO_SetBits(GPIOC, 0);//clock GPIO_SetBits(GPIOC, 1);//PL GPIO_SetBits(GPIOC, 2);//clock_en ADDR_SW_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ADDR_SW_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure); /* Configure SPI1 pins: MISO and MOSI */ ADDR_SW_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//DATA_OUT ADDR_SW_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure); |
|
|
|
本帖最后由 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只。 |
|
|
|
“板凳”那一页的代码缺少移位语句,数据只是LSB的1bit。看看是吗?
|
|
|
|
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空。
|
|
|
|
ADDR_SW_Data = 0; 没定义数据类型?? 16位数据用 uchar 应该会出错吧。
|
|
|
|
本帖最后由 wenyangzeng 于 2017-4-5 10:09 编辑 GPIO_SetBits( ADDR_SW_Data, i);//先前变量弄错了 else GPIO_ResetBits( ADDR_SW_Data, i); i已经在移位了,74HC165自己已经根据时钟在移动其并行端口的数据到串行输出端了。 |
|
|
|
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空
|
|
|
|
先试试驱动一片165行不行,一片能行再驱动两片165
|
|
|
|
ctwewer 发表于 2019-2-12 15:45 你这个应该用上升沿或下降沿读取吧,你用电平肯定不行呀,而且中间没有延时,循环太快太快了。你循环结束了,一个位还没完呢。 |
|
|
|
按照你例程每接收1个bit延时1毫秒,接收1个字节就需要8毫秒,怎么受得了?如果不可靠,顶多在时钟沿到来之后加1-2个NOP足够矣。 纳秒级的呀: |
|
|
|
|
|
|
|
ctwewer 发表于 2019-2-12 17:22 不好意,看错了。以为是楼主的帖子,被程序给误导了。 |
|
|
|
楼主,把程序注释弄成能显示的字符吧,这乱码猜不到是什么意思。或者发一个原理图。
|
|
|
|
本帖最后由 toofree 于 2017-4-5 16:14 编辑
|
|
|
|
没问题,我的程序可以了,只是我设置上的问题
|
|
|
|
#include "74HC165D.h"
#include "delay.h" #include "485test.h" unsigned int ADDR_SW_Data,HC=0; void ADDR_SW_Init(void)//74HC165D各引脚初始化 { GPIO_InitTypeDef ADDR_SW_GPIO_InitStructure; /* GPIOD Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // /* Configure zoom and focus pins in output pushpull mode */ ADDR_SW_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;//0:clock;1L;2:clock_en GPIO_SetBits(GPIOC, GPIO_Pin_0);//clock GPIO_SetBits(GPIOC, GPIO_Pin_1);//PL GPIO_SetBits(GPIOC, GPIO_Pin_2);//clock_en ADDR_SW_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ADDR_SW_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure); /* Configure SPI1 pins: MISO and MOSI */ ADDR_SW_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//DATA_OUT ADDR_SW_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure); } void read_ADDR_SW(void)//读取74HC165D函数值 { unsigned char i; ADDR_SW_Data = 0; GPIO_ResetBits(GPIOC, GPIO_Pin_2);//clock_en //打开165选通端 GPIO_ResetBits(GPIOC, GPIO_Pin_1); //运行数据计入165 delay_ms(1); GPIO_SetBits(GPIOC, GPIO_Pin_1); //允许数据移位 for(i=0;i<16;i++) //读16次数据 { GPIO_ResetBits(GPIOC, GPIO_Pin_0); delay_ms(1); ADDR_SW_Data = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) | (ADDR_SW_Data<<1); GPIO_SetBits(GPIOC, GPIO_Pin_0); delay_ms(1); } GPIO_SetBits(GPIOC, GPIO_Pin_2); //关闭165选通端 GPIO_ResetBits(GPIOC, GPIO_Pin_1); //运行数据计入165 ADDR_SW_Data = ~ADDR_SW_Data; //拨码开关取反 //PT_currentaddr = ADDR_SW_Data & 0x00ff; //拨码开关低8位为地址 switch((ADDR_SW_Data >> 8) & 0x0003) //拨码开关高8位为波特率设置,低2位为波特率设置位 { case 0x0000 : { //current_BautRate = 2400; USART_SendData(USART1, 1); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器 break ; } case 0x0001 : { //current_BautRate = 4800; USART_SendData(USART1, 2); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器 break ; } case 0x0002 : { //current_BautRate = 9600; USART_SendData(USART1,3); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器 break ; } case 0x0003 : { //current_BautRate = 19200; USART_SendData(USART1, 4); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器 break ; } default : //current_BautRate = 2400; {USART_SendData(USART1, 1); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器 } break ; } } |
|
|
|
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空
|
|
|
|
74HC165,我用来做按键,接了三个74HC165,还有LED共用,
|
|
|
|
项目有点相同。74HC165用处多多。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1906 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1027 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1436 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1879 浏览 1 评论
566 浏览 0 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-18 03:14 , Processed in 0.847697 second(s), Total 78, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号