前言
74LS165芯片单颗与级联的万能代码
一、代码
1.引脚配置:
32单片机引脚配置: 74LS165 串行数据输出(9脚|Q7) 配置为输入 74LS165 时钟(2脚|CP) 配置为输出 74LS165 移位控制/置入控制(1脚|PL) 配置为输出 51单片机引脚定义 根据实际接线定义到对应的IO口即可
32单片机引脚配置如下:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, LS165_CLK_Pin | LS165_YW_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = LS165_DATA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(LS165_DATA_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LS165_CLK_Pin | LS165_YW_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
51单片机引脚配置如下:
sbit ls165_PL = P1^0;
sbit ls165_CP = P1^1;
sbit ls165_DATA = P1^2;
2.替换
32单片机引脚操作替换
#define LS165_PL_0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define LS165_PL_1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)
#define LS165_CP_0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define LS165_CP_1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define LS165_data HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)
#define data_bit 1
51单片机引脚操作无需写替换只需替换下列代码即可
#define uint8_t unsigned char
#define uint16_t unsigned int
#define data_bit 1
3.延时函数
void delay(uint8_t i)
{
while (i--)
;
}
4.数据读取
uint8_t LS165_Read(uint8_t bit)
{
uint8_t State[data_bit];
delay(10);
LS165_PL_0;
delay(10);
LS165_PL_1;
for (size_t i = 0; i < data_bit; i++)
{
LS165_CP_1;
State[i] = 0;
for (size_t j = 0; j < 8; j++)
{
State[i] = State[i] << 1;
if (LS165_data == GPIO_PIN_SET)
{
State[i]++;
}
LS165_CP_0;
delay(10);
LS165_CP_1;
delay(10);
}
}
return (State[bit - 1]);
}
注:上方for语句中的 size_t类型 它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。 如果这个有报错就添加 cstddef头文件(应该可以解决QAQ) size_t类型 一键直达
5.函数使用
uint8_t DATA = 0;
DATA = LS165_Read(?);
总结
我怕自己忘记,先发个帖,如有需要请随意使用. 附件:74LS165英文数据手册
|