《《《《《正文》》》》》
建议先看数码管的显示原理这篇文章:
《硬件设计》
4个Com ,8个seg,共阴极设计方案!seg0-seg7对应a、b。。。f、g、dp(小数点)。
《软件设计》
一、宏定义COM 和SEG的输出操作
//需用户配置
///**************************************
//此处调用GPIO控制函数头文件
#include "gpio.h"
//*******************************************/
//需用户配置
//Comx_SetGpio()输出高电平 Comx_ClrGpio()输出低电平
//必须跟硬件上实际comX口对应
#define Com0_SetGpio() Gpio_SetIO(GpioPortA, GpioPin11)
#define Com0_ClrGpio() Gpio_ClrIO(GpioPortA, GpioPin11)
#define Com1_SetGpio() Gpio_SetIO(GpioPortA, GpioPin10)
#define Com1_ClrGpio() Gpio_ClrIO(GpioPortA, GpioPin10)
#define Com2_SetGpio() Gpio_SetIO(GpioPortA, GpioPin9)
#define Com2_ClrGpio() Gpio_ClrIO(GpioPortA, GpioPin9)
#define Com3_SetGpio() Gpio_SetIO(GpioPortA, GpioPin8)
#define Com3_ClrGpio() Gpio_ClrIO(GpioPortA, GpioPin8)
//需用户配置
//Seg0_WriteGpio(a)输出a电平,a=1,高电平;a=0,低电平
//必须跟硬件上实际segX口对应
#define Seg0_WriteGpio(a) Gpio_WriteOutputIO(GpioPortA, GpioPin12,a)
#define Seg1_WriteGpio(a) Gpio_WriteOutputIO(GpioPortA, GpioPin15,a)
#define Seg2_WriteGpio(a) Gpio_WriteOutputIO(GpioPortB, GpioPin3,a)
#define Seg3_WriteGpio(a) Gpio_WriteOutputIO(GpioPortB, GpioPin4,a)
#define Seg4_WriteGpio(a) Gpio_WriteOutputIO(GpioPortB, GpioPin5,a)
#define Seg5_WriteGpio(a) Gpio_WriteOutputIO(GpioPortB, GpioPin6,a)
#define Seg6_WriteGpio(a) Gpio_WriteOutputIO(GpioPortB, GpioPin7,a)
#define Seg7_WriteGpio(a) Gpio_WriteOutputIO(GpioPortA, GpioPin2,a)
二、定义数码管显示内存映射,以及数码管个数
//需用户配置
//COM口个数名称配置 必须从0开始
enum{
COM0 = 0,
COM1,
COM2,
COM3,
//................
COM_MAX
};
//4个数码管内存映射
//一字节8bit 对应各数码管的8段LED
//1:为亮 0:为灭
uint8_t LED_MapTable[COM_MAX]={0}; //abcdefg.
三、编写SEG口数据显示函数
/******************************************************************************
* 函 数:
* 功 能:SEG口数据输出
* 参 数:data:8bit对应数码管seg的8段LED显示
* 返回值:无
* 备 注:无
*******************************************************************************/
void Scan_SegX(uint8_t data)
{
Seg0_WriteGpio((data>>0)&0x01);//a
Seg1_WriteGpio((data>>1)&0x01);//b
Seg2_WriteGpio((data>>2)&0x01);//c
Seg3_WriteGpio((data>>3)&0x01);//d
Seg4_WriteGpio((data>>4)&0x01);//e
Seg5_WriteGpio((data>>5)&0x01);//f
Seg6_WriteGpio((data>>6)&0x01);//g
Seg7_WriteGpio((data>>7)&0x01);//dp
}
四、配置显示数据函数指定
由上面的 Scan_SegX函数可以知道8bit由低到高对应abcdefg.,配置数据如下:
/*****************
一般数码管abcdefg段码顺时针排列,外加小数点
a
——
f | g | b
——
e | | c
—— 。dp
d
比如我显示3,则需要abcdg点亮,则由硬件seg0-seg7 对应abcdefg.可得
dp g f e d c b a
x 1 0 0 1 1 1 1 = 0x4F
//更多显示字符 用户自定义
*******************************/
const uint8_t LED_Number[] =
{
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4F, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6F, // 9
};
五、编写COM口扫描函数
/******************************************************************************
* 函 数:
* 功 能:COM口扫描函数
* 参 数:无
* 返回值:无
* 备 注:需周期调用,太慢会出现屏闪,一般2ms
*******************************************************************************/
void Scan_ComX(void)
{
static uint8_t scan_index = COM_MAX;
Com0_SetGpio();
Com1_SetGpio();
Com2_SetGpio();
Com3_SetGpio(); //数码管全部不选择
scan_index++;
if(scan_index >=COM_MAX) //扫描COM
{
scan_index = 0;
}
Scan_SegX(LED_MapTable[scan_index]); //输出SEG数码管显示数据
switch(scan_index) //选择一个COM(数码管)
{
case COM0:
Com0_ClrGpio();
break;
case COM1:
Com1_ClrGpio();
break;
case COM2:
Com2_ClrGpio();
break;
case COM3:
Com3_ClrGpio();
break;
default:
scan_index =0;
break;
}
}
六、编写显示函数
/******************************************************************************
* 函 数:
* 功 能:显示数据
* 参 数:com:选择需要显示的数码管 data:显示数据 point:是否点亮小数点
* 返回值:无
* 备 注:无
*******************************************************************************/
void LED_Display(uint8_t com,uint8_t data , uint8_t point)
{
point<<=7;
LED_MapTable[com] = LED_Number[data]|point;
}
七、周期调用void Scan_ComX()函数,由LED_Display控制显示数据,比如我要数码显示数据3,且带小数点,则调用LED_Display(COM0,3,1);即可;效果图:
我写的一个demo,分秒到分的时钟显示功能;
2ms周期调用Scan_ComX,100ms周期调用airX_Time函数即可;
/******************************************************************************
* 函 数:
* 功 能:分秒、秒、分显示
* 参 数:无
* 返回值:无
* 备 注:100ms周期调用
*******************************************************************************/
void airX_Time(void)
{
static uint8_t SecMin =0; //分秒 0.1s
static uint8_t Sec =0; //秒 1s
static uint8_t Minute =0; //分 1min
static uint8_t cnt = 0;
cnt++;
if(cnt>9)
{
cnt = 0;
SecMin++;
}
if(SecMin>59)
{
SecMin =0;
Minute++;
}
if(Minute>9)
{
Minute =0;
}
LED_Display(COM0,cnt,0);
LED_Display(COM1,SecMin%10,1);
LED_Display(COM2,SecMin/10,0);
LED_Display(COM3,Minute,1);
}
效果视频:
源代码获取盘:https://pan.baidu.com/s/1TDqv1yQL1TEJzguVCteGWA
关注公众号发送1234,获取提取码
《《《《《END》》》》》