点亮数码管

这段时间也是有点太忙了,没有更新,最近有些小伙伴问数码管应该如何点亮,这里详细说说。

首先呢,宏定义得打开:(config.h下)

#define GUI_SELECT      GUI_LEDSEG_7P7S //GUI_NO    //GUI Display Select

打开之后底层就打开了,之后就是修改底层的驱动了:

第二步修改对应的IO口:(port_ledseg.c 下)

#define LED7P7S_ANY_IO          1                                   //Support Any IO drv ledseg7p7s

 //这里的IO口为:PA0 - PA6,从右往左依次计数为PA0到PA6
 //实际上你可能只有5个脚,没关系,随便再写两个脚补足7个脚即可
#define LEDSEG_ALL_DIRIN() {GPIOADE |=0x7F; GPIOADIR |= 0x7F; } 
#define LEDSEG_HDRV_EN()   {GPIOADE |=0x7F;  GPIOADRV |= 0x7F;}
#define LEDSEG_HDRV_DIS()  {GPIOADRV &= ~0x7F;}
#define LEDSEG_ALL_CLR() {LEDSEG_ALL_DIRIN(); LEDSEG_HDRV_EN();}    //DirIn, Open High Drv.
#define LEDSEG_ALL_OFF() {LEDSEG_ALL_DIRIN(); LEDSEG_HDRV_DIS();}   //DirIn, Close High Drv.

//下面是已经写好的,只要和上面一一对应就可以了
//note, must first IO "SET", then set "DIR". Otherwise have some unwanted pulse
#define LEDSEG0_H()  {GPIOASET = BIT(0); GPIOADIR &= ~BIT(0);}
#define LEDSEG0_L()  {GPIOACLR = BIT(0); GPIOADIR &= ~BIT(0);}

之后就要修改对应的显示模块了,你首先得有电量的逻辑图,如下:
在这里插入图片描述
之后就是将软件修改为对应的了:(port_ledseg.c 下)

//标准7段编码如下:
//  |--A--|
//  F     B
//  |--G--|
//  E     C
//  |--D--|
void ledseg_7p7s_update_dispbuf(void)
{
    u8 dis_buf[7];
    memset(dis_buf, 0, 7);
//这里需要注意:LED给出的原理图是从1开始计数,但是软件里面是从0开始计数,有多少个数码屏显示的数字就写多少个
    if (ledseg_buf[0] & SEG_A)  dis_buf[1] |= PIN2;
    if (ledseg_buf[0] & SEG_B)  dis_buf[2] |= PIN1;
    if (ledseg_buf[0] & SEG_C)  dis_buf[3] |= PIN2;
    if (ledseg_buf[0] & SEG_D)  dis_buf[3] |= PIN1;
    if (ledseg_buf[0] & SEG_E)  dis_buf[4] |= PIN1;
    if (ledseg_buf[0] & SEG_F)  dis_buf[4] |= PIN2;
    if (ledseg_buf[0] & SEG_G)  dis_buf[4] |= PIN3;

    if (ledseg_buf[1] & SEG_A)  dis_buf[0] |= PIN1;
    if (ledseg_buf[1] & SEG_B)  dis_buf[1] |= PIN0;
    if (ledseg_buf[1] & SEG_C)  dis_buf[0] |= PIN2;
    if (ledseg_buf[1] & SEG_D)  dis_buf[2] |= PIN0;
    if (ledseg_buf[1] & SEG_E)  dis_buf[0] |= PIN3;
    if (ledseg_buf[1] & SEG_F)  dis_buf[3] |= PIN0;
    if (ledseg_buf[1] & SEG_G)  dis_buf[4] |= PIN0;

//下面是出厂就写好的,不需要修改
    if (ledseg_buf[4] & ICON_DOT)    dis_buf[6] |= PIN4;
    ledseg_7p7s_update_dispbuf_do(dis_buf);
}

好了,到这里,数码屏是能点亮了,显示的都是出厂时候显示的,下一步就是修改为需求的了。

创建一个自己定义的显示函数:(display_ledseg.h 下)

//在需要调用显示的时候,就调用这里的定义即可
enum {
    DISP_POWERON = 0,
    ......
    DISP_BASS,
    DISP_TREBLE,
};

在display_ledseg.c 下去实现具体显示:

//这里需要注意,必须和 display_ledseg.h 创建的位置是一样的,调用的时候会一一对应 
const PFUNC ledseg_disp_pfunc[] = {
    ledseg_disp_welcome,
    ......
    ledseg_disp_bass,
    ledseg_disp_treble,
};

下面就是具体点亮示例:(display_ledseg.c 下)


void ledseg_disp_bass(void)
{
    ledseg_buf[0] = T_LEDSEG_B;
	ledseg_buf[1] = T_LEDSEG_A;
}

void ledseg_disp_treble(void)
{
    ledseg_buf[0] = T_LEDSEG_T;
	ledseg_buf[1] = T_LEDSEG_R;
}

到这里就是点亮LED的方法了。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值