论坛元老
 
- 积分
- 4467
- 金钱
- 4467
- 注册时间
- 2013-6-27
- 在线时间
- 565 小时
|
发表于 2019-5-10 21:48:22
|
显示全部楼层
本帖最后由 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 + . + \0
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);
}
|
|