蓝桥杯国赛之数码管

一、数码管显示原理

一般数码管是由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初始状态设置为推挽输出,默认点电平。

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

在C语言中,要实现单片机的数码管显示部分,通常我们会使用8位LED数码管,比如7段共阴极或共阳极LED数码管。对于第十五届蓝桥杯单片机国赛,你需要了解以下几个关键步骤: 1. **数码管驱动**: - 首先需要配置相应的寄存器来控制数码管的段选和公共端。如果你使用的是4位双向IO口(如P0~P3),可以采用动态扫描的方式,逐位点亮各段。 ```c void display_digit(unsigned char digit) { for(int i = 0; i < 8; ++i) { if(digit & (1 << i)) { // 判断当前位是否应该亮 // 对应的段地址,例如P0口的0~7位置 DDR[i] = 1; // 设置为输出 PORT[i] = 1; // 点亮该段 } else { PORT[i] = 0; // 灭掉该段 } } } ``` 2. **字符映射表**: - 为了将输入的ASCII码转换为对应的数码管显示状态,你需要创建一个256字节的字符映射表,存储每个数字、字母等对应各个数码管段的状态。 ```c const unsigned char digit_map[16] = {...}; // 数码管字符映射数组 ``` 3. **用户输入处理**: - 用户输入(如键盘输入或者其他传感器读取)会被转换为ASCII码,然后通过映射表转换成数码管显示的数据。 ```c char input; while(1) { input = get_user_input(); // 获取用户输入 display_digit(digit_map[input]); // 显示对应的数码管字符 } ``` 4. **注意事项**: - 单片机环境下的内存管理和定时器设置也很重要,确保在有限的时间内完成数码管的刷新。 - 可能还需要考虑错误处理和数码管的初始化工作。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值