蓝桥杯国赛之数码管

一、数码管显示原理

一般数码管是由8个发光二极管组成的,想要显示数字或者字母,只需要将相应的二极管点亮。

 一个数码管的连接有两种方式:共阴(二极管负极连在一起)和共阳(二极管正极连接在一起)。

 

若是共阴连接方式,只需要给对于的io高电平即可,反之。

若是多个多个数码可能会出现段选和位选:

com1和com2是位选端控制那一个数码管点亮,a-g是段选段控制数码管显示的数字。

数码管工作方式有两种:静态显示方式动态显示方式

静态显示:每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。

动态显示:将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示,即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的

常用字段码:

 

二、扩展板数码管

原理图连接:

 数码管一边接的是74LS595,另一边接的是GND,采用共阴方式连接。所以给IO口高电平点亮,低电平熄灭。

蓝桥杯扩展板使用的是3片74LS595来静态驱动数码管,三片74LS595串行连接,每一片的输出接数码管的8个段,3片就可以实现控制三个数码管。
 

74LS595工作原理:

数据从SER进入,在SCK的时钟触发下,上升沿数据移位,下降沿数据保持。当数据移动8次之后,即SCK发生8次高低电平的翻转,即8bit的数据已经完全输入到 移位数据寄存器,输入的数据按照QA->QB->...->QH移位,直到8位数据输入完毕

然后在RCLK 一个上升沿,移位数据寄存器的数据全部输入到数据存储寄存器进行输出

这里是将三个移位寄存器联结到一起,进行拓展,控制三个数码管。SER不断输入数据,然后SRCK共翻转24次,将24bit的数据输入到移位数据寄存器

RCLK的一个上升沿,使得数据输出到数据存储寄存器,三位数码管显示
 

总之:

1.设置SER的电平(即数据)
2. 每一个SCK脉冲上升沿(将数据输入到移位寄存器里)
3. 重复第1步和第2步动作8次(8位移位寄存器)
4. 在RCLK上升沿,更新移位寄存器的值(将数据输入到数码管端口)

三个控制端口原理图:

 即操作PA1,PA2,PA3即可控制数码管。

注意:使用数码管时,需要将跳线帽上对应的IO相连接

 三、程序

// 0-f + '灭'
uint8_t Seg[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};

// 配置RCLK,SCK,SER的高低电平

#define RCLK_L	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);	
#define RCLK_H 	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);	 

#define SCK_L	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
#define SCK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);	 

#define SER_L	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
#define SER_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);


/*value1: 数码管1显示的数据
  value2: 数码管2显示的数据
  value3: 数码管3显示的数据*/
void Seg_Display(uint8_t value1,uint8_t value2,uint8_t value3)
{
	uint8_t i=0;
	uint8_t temp =0;
	
	//准备动作,为了将数据从移位寄存器送到数码管io口
	RCLK_L;
	
	// 设置第三位数码管
	temp = Seg[value3]; // 读取第三位的数据
	for(i=0;i<8;i++)
	{
		// 准备动作,为了将每一位送入到移位寄存器
		SCK_L;
		// 判断最高位数据,依次将最高位输入
		if(temp & 0x80)
		{
			SER_H;   // 数据为1,SER电平为高
		}
		else
		{
			SER_L;   // 数据为0,SER电平为高
		}
		temp = temp << 1;
		// 上升沿时,将每一位数据送入到移位寄存器
		SCK_L;
		SCK_H;
	}
	
	// 设置第二位数码管
	temp = Seg[value2];
	for(i=0;i<8;i++)
	{
		SCK_L;
		if(temp & 0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		temp = temp << 1;
		SCK_L;
		SCK_H;
	}
	
	// 设置第一位数码管
	temp = Seg[value1];
	for(i=0;i<8;i++)
	{
		SCK_L;
		if(temp & 0x80)
		{
			SER_H;
		}
		else
		{
			SER_L;
		}
		temp = temp << 1;
		SCK_L;
		SCK_H;
	}
	
	RCLK_L;//等待将数值从移位寄存器送到输出
	RCLK_H;//将数值从移位寄存器送到输出
}	

 控制引脚PA1,PA2,PA3初始状态设置为推挽输出,默认点电平。

注意:由于原理图移位寄存器是串行连接,所以需要在编写程序时要注意数码写入的顺序,需先写第三位然后第二位最后第一位

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>