一文搞定数码管的软件开发(源代码获取见底部)


《《《《《正文》》》》》


建议先看数码管的显示原理这篇文章:

数码管是如何亮起来的?跟液晶屏又有什么关系?

 

《硬件设计》

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》》》》》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值