前言
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};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, LS165_CLK_Pin | LS165_YW_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PtPin */
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);
/*Configure GPIO pins : PAPin PAPin */
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; //数据输出
//IO口根据个人实际接线更改
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 //165级联数
51单片机引脚操作无需写替换只需替换下列代码即可
#define uint8_t unsigned char
#define uint16_t unsigned int
#define data_bit 1 //165级联数
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; //置位,读入8位并行数据
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++) //循环8次
{
State[i] = State[i] << 1; //数据左移一位,保存数据
if (LS165_data == GPIO_PIN_SET) //判断数据引脚状态|GPIO_PIN_SET = 1
{
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(?);//?为选择读取芯片的8位数据 1就是选择第一个芯片的数据,以此类推
//函数前面加 "~" 就是取反8位数据 即源数据 为 0X00 ~ 取反后为 0XFF
//数据也可直接赋值给整组的端口
总结
我怕自己忘记,先发个帖,如有需要请随意使用.
附件:74LS165英文数据手册