IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 蓝桥杯国赛之数码管 -> 正文阅读

[嵌入式]蓝桥杯国赛之数码管

一、数码管显示原理

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

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:06:25  更:2022-05-14 10:06:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:37:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码