这段时间也是有点太忙了,没有更新,最近有些小伙伴问数码管应该如何点亮,这里详细说说。
首先呢,宏定义得打开:(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的方法了。