著名的电子商务网站,手机网站开发,自己做的图片哪个网站可以出售,快速网站排名提升工具4位数码管 在使用一位数码管的时候#xff0c;会用到8个IO口#xff0c;那如果使用4位数码管#xff0c;难道要使用32个IO口吗#xff1f;肯定是不行的#xff0c;太浪费了IO口了。把四个数码管全部接一起共用8个IO口#xff0c;然后分别给他们一个片选。所以4位数码管共…4位数码管 在使用一位数码管的时候会用到8个IO口那如果使用4位数码管难道要使用32个IO口吗肯定是不行的太浪费了IO口了。把四个数码管全部接一起共用8个IO口然后分别给他们一个片选。所以4位数码管共有12个IO口。 当选择数码管1显示的时候这可以选择1位选然后再根据1位数码管的原理段选显示这个数码管。
动态显示 根据人眼视觉残留的原理在显示的时候位选依次选择数码管然后段选控制数码管显示。这种依次选择依次显示的速度非常快快到人眼反应不过来从而使4位数码管上的数字同时显示只是人眼看上去同时显示。
消影 在动态显示的时候会发现数码管在闪烁这是位选和段选不同步导致的。我们可以通过加延迟或者置零来解决这个问题这就是常说的消影。 如果还想用更少的引脚控制4位数码管我们可以使用74HC595。
74HC595 74HC595是一个8位串行输入、并行输出的位移缓存器并行输出为三态输出。在SCK 的上升沿串行数据由SDL输入到内部的8位位移缓存器并由Q7#39;输出而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时并行输出端的输出值等于并行输出缓存器所存储的值。 74HC595引脚 符号引脚描述Q0---Q7第15脚第1-7脚8位并行数据输出GND第8脚地Q7第9脚串行数据输出/MR第10脚主复位低电平有效SH_CP第11脚数据输入时钟线ST_CP第12脚输出存储器锁存时钟线/OE第13脚输出有效第电平有效DS第14脚串行数据输入VCC第16脚 电源
串入并出 当我们给DS依次输入8个bit的数据会同时在Q0-Q7输出那不就可以只用1个IO口连接到DS相当于扩展成8个IO口。而4位数码管要12个IO口那用2个74HC595不就好了。 串入串出 从原理图上我们可以看见74HC5951左侧的的QH’连接到了74HC5952的SER也就是一个74HC595的串行输出连接到了下一个74HC595的串行输入。 当输入的数据超出并行输出的范围时会依次顶替之前的数据当输入16位数据时原先输入到74HC5951的数据D0-D7就会顶替掉成D8-D15而被顶替的数据则通过QH到SER的连接传输到74HC5952中使其位D0-D7。 第一个74HC595左侧的用于选择数码管位选第二个74HC595用于显示数码管段选。
SH_CP和ST_CP
SH_CP(11脚)上升沿时数据寄存器的数据移位。Q0-Q1-Q2--Q3--...--Q7;下降沿移位寄存器数据不变。ST_CP(12脚)上升沿时移位寄存器的数据进入数据存储寄存器下降沿时存储寄存器数据不变。通常我将ST_CP置为低电平当移位结束后在ST_CP端产生一个正脉冲更新显示数据。
使用方法 第一步目的将要准备输入的位数据移入74HC595数据输入端上。 方法送位数据到_595。 第二步目的将位数据逐位移入74HC595即数据串入 方法SH_CP产生一上升沿将DS上的数据移入74HC595移位寄存器中先送低位后送高位。应该是先送高位 第三步目的并行输出数据。即数据并出 方法ST_CP产生一上升沿将由DS上已移入数据寄存器中的数据 送入到输出锁存器。 说明 从上可分析从SH_CP产生一上升沿(移入数据)和ST_CP产生一上升沿(输出数据)是二个独立过程实际应用时互不干扰。即可输出数据的 同时移入数据。 引脚连接 P1的5个IO口连接单片机而P2通过级联可以继续接数码管。
输入顺序 从图中可以看到数据是QA-QB-QC...QH最先输入的是QA。 上图最后一行PARALLEL OUTPUTS并行输出可以知道QA是高位。
代码
bsp_74HC595.c
#include bsp_74HC595.hunsigned int num[] {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x00};void HC595_GPIO_Configuration()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET);
}
//串入
void HC595_Send_Byte(unsigned char num)
{unsigned int i;for(i 0;i8;i){if(num 0x80)//取最高位 1000 0000{GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_SET);}else{GPIO_WriteBit(GPIOB,GPIO_Pin_15,Bit_RESET);}GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET);Delay_us(10);GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);Delay_us(10);num 1;}
}
//并出
void HC595_Send_Data(unsigned char num,unsigned char show_bit)
{HC595_Send_Byte(num);HC595_Send_Byte(1 show_bit);//高4位没有用GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);Delay_us(10);GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);Delay_us(10);
}
bsp_74HC595.h
#ifndef __BSP_74HC595_H__
#define __BSP_74HC595_H__#includestm32f10x.h
#include Delay.h
extern unsigned num[];
void HC595_GPIO_Configuration(void);void HC595_Send_Data(unsigned char num,unsigned char show_bit);void HC595_Send_Byte(unsigned char num);#endifmain.c
int main(void)
{HC595_GPIO_Configuration();while(1){HC595_Send_Data(num[2],4);//4号数码管显示数字2HC595_Send_Data(num[0],1);//1号数码管显示数字0HC595_Send_Data(num[3],2);//2号数码管显示数字3}
}