单片机与数码管驱动芯片连接问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机与数码管驱动芯片连接问题相关的知识,希望对你有一定的参考价值。
工厂的设备改装,想用单片机实现,问题如下:
单片机选用89S51,设备占用比较多IO口,留给数码管的不多,打算用TM1629C,可以驱动15位数码管和8个按键,TM1629C芯片的DIO、CLK、STB三个脚是不是跟单片机的32个IO口其中的任意三个脚连接都行?还是说一定要跟三个脚?用这种芯片,单片机编程会不会很麻烦?或者有没有更好的芯片?
本人是机械设计,对单片机不太熟悉,想了解一下其功能。谢谢各位的帮助。谢谢。
排除必须使用的串口和中断口,其它的口任意接
STM32学习(29)STM32实现595驱动三个数码管(标准库和HAL库实现)
我选用的单片机型号为:STM32F103系列
74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。
现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下:
只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下:
要求完成功能:实现数码管显示456,如何实现?
首先需要熟悉74LS595芯片的工作原理:
到这里就可以完成代码了:
代码完成分为标准库和HAL库
接线表设计:
模块数码管 | STM32的IO口 | 设置的功能 |
SER | PA1 | GPIO_Mode_Out_PP (推挽输出) |
RCLK | PA2 | GPIO_Mode_Out_PP (推挽输出) |
SCK | PA3 | GPIO_Mode_Out_PP (推挽输出) |
1.标准库实现
/****************************************
函数名称:void STM3210B_SEG_Init(void)
函数参数:无参
函数返回值:无
函数功能:IO的基本配置初始化
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void STM3210B_SEG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/****************************************
函数名称:void SEG_DisplayValue(u8 value1, u8 value2, u8 value3)
函数参数:
u8 value1:取值范围为0-16 如输入0-9则显示0-9 如输入10-15,显示就是a-f,如输入16则表示数码管灭(不亮)
u8 value2:取值范围为0-16 如输入0-9则显示0-9 如输入10-15,显示就是a-f,如输入16则表示数码管灭(不亮)
u8 value3:取值范围为0-16 如输入0-9则显示0-9 如输入10-15,显示就是a-f,如输入16则表示数码管灭(不亮)
函数返回值:无
函数功能:数码管显示
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void SEG_DisplayValue(u8 value1, u8 value2, u8 value3)
{
u8 i = 0; //
u8 code_tmp = 0;
code_tmp = Seg[value3];
for(i=0;i<8;i++){
if(code_tmp & 0x80){
SER_H;
}else{
SER_L;
}
SCK_H;
code_tmp = code_tmp << 1;
SCK_L;
}
code_tmp = Seg[value2];
for(i=0;i<8;i++){
if(code_tmp & 0x80){
SER_H;
}else{
SER_L;
}
SCK_H;
code_tmp = code_tmp << 1;
SCK_L;
}
code_tmp = Seg[value1];
for(i=0;i<8;i++){
if(code_tmp & 0x80){
SER_H;
}else{
SER_L;
}
SCK_H;
code_tmp = code_tmp << 1;
SCK_L;
}
RCLK_H;
RCLK_L;
}
2.HAL库实现
实现效果:
需要的可以留言,我发给你,互相学习共同进步!!!!
以上是关于单片机与数码管驱动芯片连接问题的主要内容,如果未能解决你的问题,请参考以下文章
51单片机 3个IO口 + TM1638+24个独立按键扫描+驱动8位共阳数码管显示+Proteus仿真