
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; //²¦Â뿪¹ØÈ¡·´ |
#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;1
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_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;1
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);
这个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只。
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
GPIO_SetBits( ADDR_SW_Data, i);//先前变量弄错了
else
GPIO_ResetBits( ADDR_SW_Data, i);
i已经在移位了,74HC165自己已经根据时钟在移动其并行端口的数据到串行输出端了。
点评
评分
查看全部评分
你这个应该用上升沿或下降沿读取吧,你用电平肯定不行呀,而且中间没有延时,循环太快太快了。你循环结束了,一个位还没完呢。
评分
查看全部评分
按照你例程每接收1个bit延时1毫秒,接收1个字节就需要8毫秒,怎么受得了?如果不可靠,顶多在时钟沿到来之后加1-2个NOP足够矣。
纳秒级的呀:
曾做过测试,使用电平方式特别容易受干扰,而是用上升沿/下降沿触发方式则可靠得多
评分
查看全部评分
不好意,看错了。以为是楼主的帖子,被程序给误导了。