数码管驱动问题

2019-07-20 01:58发布



基于STM32的数码管,现在已经实现点亮,可以控制每一小段,一共8个灯,每个灯14bit,可以控制每个bit,但是现在想通过一个char String[8] = " ~~";这样的方式去改变数码管,比如我在" ~~"里面写 Hello 数码管就会显示出来,包括空格,空格表示1个灯,我在写Hello的时候,可以通过空格偏移数码管的位置。达到目的,谢谢大家不吝赐教,给出方案即可。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
烈日灼心
1楼-- · 2019-07-20 05:48
请帮忙顶一下
LRW
2楼-- · 2019-07-20 06:28
帮顶!都可以控制每个小段了,要显示字符还是很容易吧。
烈日灼心
3楼-- · 2019-07-20 10:41
 精彩回答 2  元偷偷看……
烈日灼心
4楼-- · 2019-07-20 14:06
 精彩回答 2  元偷偷看……
DongInker
5楼-- · 2019-07-20 19:26
本帖最后由 DongInker 于 2019-5-10 21:53 编辑

下面是我很久之前写的 使用51单片机实现格式化驱动数码管
数码管关键是处理小数点,毕竟在数码管小数点得特殊处理掉。

#define LED_SEG_NUM 4 //数码管位数
u8 _XDATA LedSegBuf[LED_SEG_NUM];

typedef struct {
        char Ascii;
        u8   SegVal;
}tLedSeg;

_ROM tLedSeg LedSegTab[] = {
{' ',0XFF},
{'x',0X00},        

{'0',0X88},
{'1',0XBB},
{'2',0XC1},
{'3',0X91},
{'4',0XB2},
{'5',0X94},
{'6',0X84},
{'7',0XB9},
{'8',0X80},
{'9',0X90},
{'-',0XF7},
{'C',0XCC},
{'p',0XE0},

{'V',0X8A},
{'I',0XEE},
{'A',0XA0},
{'d',0X83},
{'c',0XC7},

{'Z',0XC1},
{'e',0XC4},
{'r',0XE6},
{'o',0X87},

{'F',0XE4},// FULL
{'U',0X8A},
{'L',0XCE},

{0,0}};

/************************************************************************/
/*      Local Functions                                                 */
/************************************************************************/
static void sBufToDis(void)
{   

}

static u8 sScanLedSegTab(u8 dat)
{
        u8 i;
        for(i=0;LedSegTab.Ascii;i++)
                {
                if(dat == LedSegTab.Ascii)
                        return LedSegTab.SegVal;
                }
        return 0;
}

/************************************************************************/
/*      Application Interface                                           */
/************************************************************************/
u8 _XDATA LedSegPrf[LED_SEG_NUM+2];// LedSegNum + . +
GLOBAL void LedSegDis(u8 Up, char *format,...)
{
        u8 i,n = 0;

        va_list arg_ptr;
        va_start (arg_ptr, format);           /* format string */
        vsprintf (LedSegPrf, format, arg_ptr);   //使用时要注意内存溢出问题
        va_end (arg_ptr);

        for(i=0;i<LED_SEG_NUM+1;i++)
                {
                if(LedSegPrf == '.')
                        LedSegBuf[n-1] = LedSegBuf[n-1]&0X7F;//将小数点添加到前面一位数码管缓存中
                else
                        LedSegBuf[n++] = sScanLedSegTab(LedSegPrf);
                if(n >= LED_SEG_NUM)
                        break;
                }
        
        if(Up)
                sBufToDis();
}

GLOBAL void LedSegInit(void)
{
        LedSegDis(1,"xxxx");
        Delay1mS(20);
        LedSegDis(1,"    ");
        Delay1mS(20);
        LedSegDis(1,"V%s",GetVersionNum());
        Delay1mS(30);
}

烈日灼心
6楼-- · 2019-07-20 23:00
 精彩回答 2  元偷偷看……

一周热门 更多>