普通网站一年要多少钱,适合大学生做的网站有哪些,6免费建站的网站,泉州制作网站开发1.小故事
最近#xff0c;我接到了一个既“清肺”又“烧脑”的新任务#xff0c;设计一个低功耗蓝牙肺活量计。在这个项目中我们借鉴了一款蓝牙跳绳的硬件设计方案#xff0c;特别是它的显示方案——数码管。
在电子工程领域#xff0c;初学者往往从操作LED开始#xff…1.小故事
最近我接到了一个既“清肺”又“烧脑”的新任务设计一个低功耗蓝牙肺活量计。在这个项目中我们借鉴了一款蓝牙跳绳的硬件设计方案特别是它的显示方案——数码管。
在电子工程领域初学者往往从操作LED开始随后进阶到控制数码管由此可见数码是非常基础使用非常广泛的一个电子元件。 然而刚拿到这个4位数码管时我注意到了一个不寻常的特点这个4位数码管仅有7个引脚而传统4位数码管至少需要12个引脚最初我误以为该数码管内部集成了某种芯片所以才导致引脚简化。
但是当供应商提供资料时我才发现它内部并没有芯片它就是通过普通IO脚控制的数码管但是这种数码管并不是我们常见的数码管供应商给的名字是阴阳脚数码管单排数码管 顿时我被这霸气名字所吸引决定探究一番经过查阅资料、搭建电路、编写程序不出意外地我成功点亮了这个阴阳脚数码管。
这个阴阳脚数码管十分有趣于是我记录下这段简短开发经历既是对自己学习的总结也是希望将这个过程分享朋友们。
2.常见的数码管电路
众所周知常见的数码管分为两大类共阴数码、共阳数码。如下图所示 数码管内部由二极管组成当给二极管加正向电压时二极管点亮下图是4位数码管的内部电路图这个数码管有个12引脚。
3.阴阳脚数码管电路
阴阳脚数码管的电路图很奇怪4位数码管电路图如下 根据电路图不难发现 1脚和2脚之间接了一个二极管2脚和1脚之间又接了一个二极管。正是这种神奇的操作一个引脚即接了一个发光二极管的阳极正极同时还接了其他发光二极管的阴极负极因此这种数码管就被称为阴阳脚数码管。
4.工作原理
阴阳脚数码管工作原理是什么 阴阳脚数码管使用了二极管的单向导通性前文说到数码管的 1脚和2脚之间接了一个二极管12脚和1脚之间又接了一个二极管2工作原理如下图 为什么会有阴阳脚数码管它的优势是什么 阴阳脚数码管的优势是控制引脚少功耗低。 控制引脚少
对于阴阳脚数码管两个引脚可以控制2个LED 3个引脚可以控制6个LED7个引脚可以控制48个LED
引脚和控制LED数量的关系是一种组合关系这就意味着控制同样数量的LED阴阳脚数码的控制引脚更少。 低功耗
由于阴阳脚数码管的同一个引脚接了多个LED例如7个引脚的阴阳脚数码管其中1个脚最多可以接12个LED通常情况下阴阳脚数码管同一时刻只会有1个发光二极管被点亮而普通二极管最多会有8个发光二极管被点亮因此阴阳脚数码管功耗低亮度低。
5.程序设计
代码设计思路是
1、设置一组大小为36的IO控制数组这个数组中存放这控制36组LED的IO引脚。
2、设置一个大小为36的显示缓存每个数据对应一个LED的状态。
3、设计一个循环显示36个LED状态的函数。
4、设计一个0~9这10个数值转换为7段数码管的映射函数。
5、将4位数转换映射到36个显示缓存。 注意事项需要亮的LED通过两个引脚的高低电平点亮其它的IO口一定要设为悬浮输入模式。
代码如下
/*
*********************************************************************************************************
Includes
*********************************************************************************************************
*/
#include FreeRTOS.h
#include impedance_bsp.h
#include stm32f10x.h
#include task.h
/*
********************************************************************************************************
Define
*********************************************************************************************************
*/
//数码管中的LED总数
#define LED_NUM (36)
//数码管的IO总数
#define IO_NUM (7)
//数码管中的一位显示8中的段码数量
#define SEG_NUM (7)
/*
*********************************************************************************************************
Variables
*********************************************************************************************************
*/
//定义单片机IO引脚归一化操作
uint16_t led_pin_buff[IO_NUM]
{GPIO_Pin_4,GPIO_Pin_5,GPIO_Pin_7,GPIO_Pin_0,GPIO_Pin_1,GPIO_Pin_2,GPIO_Pin_12 };
//定义单片机IO口归一化操作
GPIO_TypeDef *led_port_buff[IO_NUM]
{GPIOA,GPIOA,GPIOA,GPIOB,GPIOB,GPIOB,GPIOB
};
//通常情况下控制外设IO不会是同花顺同一个IO口的依次相连的引脚
//因此我们定义一个数组将数码管的物理引脚按照顺序填入数组。//大小为36的LED正极控制IO数组1个数值对应1个LED 1代表脚1 7代表脚7
uint8_t positive_io_buff[LED_NUM]
{
1,1,4,5,1,2,3,
2,2,5,2,2,3,4,
5,3,4,6,6,4,5,
7,6,5,6,4,6,5,
3,7,6,1,3,1,3,
7
};
//大小为36的LED负极控制IO数组1个数值对应1个LED 1代表脚1 7代表脚7
uint8_t negative_io_buff[LED_NUM]
{
2,3,1,1,4,1,1,
3,4,2,6,5,2,2,
4,5,5,1,3,3,3,
6,7,6,4,6,5,7,
6,3,2,5,4,6,7,
2
};//大小为36显示缓存1个缓存对应1个LED
uint8_t display_cache[LED_NUM]
{
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
0
};//数码管 0~ 9 的段码映射值 10 为空显示
uint8_t led_table[11]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
// 0x3f 0x0011 1111
//数组中的每个数值对应4位数码管中的一个数码管显示内容
uint8_t display_data[4] {0,0,0,0};/*
*********************************************************************************************************
Function
*********************************************************************************************************
*/
/*
*********************************************************************************************************
Function
*********************************************************************************************************
*/
/***********************************************************************************************************
* 描述 : 初始化led_gpio_init的IO口
***********************************************************************************************************/
void led_bsp_init(void)
{ GPIO_InitTypeDef GPIO_InitStructure; /* 使能SPI引脚相关的时钟 */RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE );/* 普通IO即可 */GPIO_InitStructure.GPIO_Pin GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_Init(GPIOA, GPIO_InitStructure);/* 普通IO即可 */GPIO_InitStructure.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_Init(GPIOB, GPIO_InitStructure);
}
/***********************************************************************************************************
* 描述 : IO全部设置为悬浮模式
***********************************************************************************************************/
void led_gpio_clear(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, GPIO_InitStructure);
}
/***********************************************************************************************************
* 描述 : 设置IO口
***********************************************************************************************************/
void led_gpio_set( GPIO_TypeDef * port ,uint16_t pin)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin pin;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_Init(port, GPIO_InitStructure);
}
/***********************************************************************************************************
* 描述 : 设置一个LED状态
***********************************************************************************************************/
void set_one_led_state(uint8_t num , uint8_t state)
{//IO全部设置为悬浮模式led_gpio_clear();//将本次对应LED的IO口设置为输出led_gpio_set(led_port_buff[ positive_io_buff[num] - 1 ] , led_pin_buff[ positive_io_buff[num] - 1] );led_gpio_set(led_port_buff[ negative_io_buff[num] - 1 ] , led_pin_buff[ negative_io_buff[num] - 1] );// 显示缓存为1 则点亮LEDif( state 1){GPIO_SetBits( led_port_buff[ positive_io_buff[num] - 1 ] , led_pin_buff[ positive_io_buff[num] - 1] );}else{GPIO_ResetBits( led_port_buff[ positive_io_buff[num] - 1 ] , led_pin_buff[ positive_io_buff[num] - 1] );}//无论LED亮或者灭 负极IO都为低0GPIO_ResetBits( led_port_buff[ negative_io_buff[num] - 1 ] , led_pin_buff [ negative_io_buff[num] - 1] );
}/***********************************************************************************************************
硬件层
***********************************************************************************************************//***********************************************************************************************************
* 描述 : 根据缓存数据刷新LED亮灭状态
***********************************************************************************************************/
void refresh_led(void)
{uint8_t i;//设置LED_NUM个LED状态for(i 0 ; i LED_NUM ; i){ set_one_led_state(i,display_cache[i]);vTaskDelay(1); }
}
/***********************************************************************************************************
* 描述 : 段码值映射
***********************************************************************************************************/
void led_8bit_mapping(uint8_t *buff ,uint8_t value)
{uint8_t i;for(i 0 ; i SEG_NUM ; i)buff[i] 0;for(i 0 ; i SEG_NUM ; i){if((led_table[value] (0x01i)) ! 0)buff[i] 1; }
}
/***********************************************************************************************************
* 描述 : 4位数据转换成段码
***********************************************************************************************************/
void data_mapping_cache(uint8_t *buff)
{uint8_t i;for(i 0 ; i 4 ; i){ led_8bit_mapping(display_cache[i*SEG_NUM] , buff[i]); }
}
/***********************************************************************************************************
* 描述 : LED显示数据
***********************************************************************************************************/
void led_show_data(uint8_t *buff)
{//数据映射到LED显示缓存data_mapping_cache(buff);//LED更新显示内容refresh_led();
}
/***********************************************************************************************************
数据显示
***********************************************************************************************************//***********************************************************************************************************
* 描述 : led测试
***********************************************************************************************************/
void led_test(void)
{static uint32_t clk_num 0;uint8_t i;//用于测试 数据变化if((clk_num%70)0){for(i 0 ; i 4 ; i){ display_data[i];if(display_data[i] 10)display_data[i] 0; }}//显示数据led_show_data(display_data);//延时vTaskDelay(1);
}
/***********************************************END*********************************************************/6.总结
1、介绍了阴阳脚数码管。 2、学习了阴阳脚数码管工作原理。 3、学习了阴阳脚数码管驱动代码。
7.打油诗 希望获取源码和数据表的朋友可以在评论区留言
希望获取源码和数据表的朋友可以在评论区留言
希望获取源码和数据表的朋友可以在评论区留言
创作不易希望朋友们点赞转发评论关注! 大家的点赞转发评论关注将是我持续更新的动力!