数码管、lED显示相关代码

#include "NixieTube_Drv.h"
#include "Display_Lib.h"

#ifdef NixieTube_EN

static void Disp_String(char * src)
{
	uint8_t wei = 0;
	for(uint8_t i = 0 ;i < 10 ; i ++)
	{
	  if(*(src + i + 1) == '.' )
		{
	   nixietube.SetupDisplayBuf_ByChar(wei,* (src + i) , 1);		
		 i++;
		}
		else
		 nixietube.SetupDisplayBuf_ByChar(wei,* (src + i) , 0);			
		
		wei ++;
		if(wei >= 3)
			break;
	}
}

static void Disp_Number(uint32_t number , uint8_t point)
{
	if(number > 999)
		number = 999;
	
	nixietube.SetupDisplayBuf_ByChar( 0 ,number / 100 + '0' , point == 3);	
	nixietube.SetupDisplayBuf_ByChar( 1 ,(number % 100 )/ 10 + '0' , point == 2);	
	nixietube.SetupDisplayBuf_ByChar( 2 ,number % 10 + '0' , point == 1);	
}


static void Disp_Led(uint8_t channel , uint8_t state , uint16_t ratio)
{
	nixietube.SetupDisplayBuf_UnitDuan(3,channel,state);
	nixietube.SetupBlinkRate_UnitDuan(3,channel,ratio);
}


#endif



#include "NixieTube_Drv.h"


static uint8_t  Display_Buf[SMG_WEI];
static uint16_t  Blink_Rate[SMG_WEI][8];

static uint8_t Gpio_IsReady = 0;
void (*Setup_NixieTube_Duan)(uint8_t );
void (*Setup_NixieTube_Wei)(uint8_t );	



static uint8_t DisplayCharacter(uint8_t ch)
{
    if ((ch >= 'A') && (ch <= 'Z'))
    {
        return charTable[ch-'A'];
    }
    else if ((ch >= 'a') && (ch <= 'z'))
    {
        return charTable[ch-'a'];
    }
		else if ((ch >= '0') && (ch <= '9'))
		{
			return digitTable[ch  - '0'];
		}
    return 0;
}
/*
 *  根据闪烁情况来获取当前位要显示的段,不对外开放
 */
static uint8_t Get_Rt_NixieTube_Duan(uint8_t Wei)
{
	static uint32_t systick_cnt = 0;
	
	uint8_t Rt_Duan = Display_Buf[Wei];
	
	for(uint8_t i = 0 ; i < 8 ; i ++)
	{
		if(Blink_Rate[Wei][i] == ALWAYS_ON)
			continue;
		else if(Blink_Rate[Wei][i] == ALWAYS_OFF)
		{
			Rt_Duan &= ~(1<<i);
			continue;
		}
		//大于Blink_Rate[Wei][i]灭这一位的这一段
		else if(((systick_cnt / Blink_Rate[Wei][i]) % 2) == 1)
			Rt_Duan &= ~(1<<i);
	}
	
	return Rt_Duan;
}

//------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------对外接口函数----------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
/*
 *  根据闪烁情况来获取当前位要显示的段,不对外开放
 */

static void Setup_Gpio_Func( void (*set_gpio_duan)(uint8_t) , void (*set_gpio_wei)(uint8_t) )
{
	Setup_NixieTube_Duan = set_gpio_duan;
	Setup_NixieTube_Wei = set_gpio_wei;
	Gpio_IsReady = 1;
}





/*
 *  显示任务
 */
static void Task()
{
	static uint8_t rt_wei = 0;

	if(Gpio_IsReady == 0)
		return;
	
	if(rt_wei < (SMG_WEI - 1))
		rt_wei ++;
	else
		rt_wei = 0;

	Setup_NixieTube_Duan(Get_Rt_NixieTube_Duan(rt_wei));
	Setup_NixieTube_Wei(rt_wei);
}

/*
 *  设置闪烁速率,ALWAYS_ON为常亮,ALWAYS_OFF为不亮
 */
static void SetupBlinkRate_UnitWei(uint8_t Wei ,uint16_t Rate)
{
	if(Wei >= SMG_WEI)
		return;
	
  for(uint8_t i = 0 ; i < 8 ; i ++)
	  Blink_Rate[Wei][i] = Rate;;
}


/*
 *  设置闪烁速率,ALWAYS_ON为常亮,ALWAYS_OFF为不亮
 */
static void SetupBlinkRate_UnitDuan(uint8_t Wei , uint8_t Duan,uint16_t Rate)
{
	if(Wei >= SMG_WEI)
		return;
	if(Duan >= 8)
		return;
	
	  Blink_Rate[Wei][Duan] = Rate;;
}


/*
 *  设置显存,自动找到对应字符,没有则不显示
 */
static void SetupDisplayBuf_ByChar(uint8_t Wei ,uint8_t ch ,uint8_t with_point)
{
	if(Wei >= SMG_WEI)
		return;
  if(with_point > 0)
	  Display_Buf[Wei] =  DisplayCharacter(ch) | POINT_WEI;
}

/*
 *  设置显存,
 */
static void SetupDisplayBuf_UnitWei(uint8_t Wei ,uint8_t buf)
{
	if(Wei >= SMG_WEI)
		return;

	Display_Buf[Wei] =  buf;
}
/*
 *  设置显存,
 */
static void SetupDisplayBuf_UnitDuan(uint8_t Wei , uint8_t Duan,uint8_t bit_buf)
{
	if(Wei >= SMG_WEI)
		return;
	
	if(Duan >= 8)
		return;
	
	if(bit_buf > 0)
	  Display_Buf[Wei] |= (1 << Duan);
	else
	  Display_Buf[Wei] &= ~(1 << Duan);
	
}



nixietube_operations nixietube = {
.Task = Task,
.Setup_Gpio_Func = Setup_Gpio_Func,
.SetupBlinkRate_UnitWei = SetupBlinkRate_UnitWei,
.SetupBlinkRate_UnitDuan = SetupBlinkRate_UnitDuan,
.SetupDisplayBuf_UnitWei = SetupDisplayBuf_UnitWei,
.SetupDisplayBuf_UnitDuan = SetupDisplayBuf_UnitDuan,
.SetupDisplayBuf_ByChar = SetupDisplayBuf_ByChar,
};

#ifndef _NIXIETUBE_H
#define _NIXIETUBE_H


typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;

#define NixieTube_EN

#define SMG_WEI    4
#define ALWAYS_ON  0
#define ALWAYS_OFF 0xffff

#define POINT_WEI 0x80

static const uint8_t digitTable[] = 
{
    /* 0     1     2     3     4     5     6     7     8     9      */
    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
};

static const uint8_t charTable[] = 
{
    /* A     b     c     d     e     f     g    */
    0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x6f, 
    /* H     i     J     k     L     m     n    */
    0x76, 0x10, 0x0e, 0x00, 0x38, 0x00, 0x54,
    /* o     P     q     r     S     t          */
    0x5c, 0x73, 0x67, 0x50, 0x6d, 0x78, 
    /* u     v     w     x     y     z          */
    0x1c, 0x3e, 0x00, 0x00, 0x6e, 0x00, 
};






typedef struct
{
	void (*Task)(void);
  void (*Setup_Gpio_Func)( void (*)(uint8_t) , void (*)(uint8_t) );
	void (*SetupBlinkRate_UnitWei)(uint8_t  ,uint16_t );
	void (*SetupBlinkRate_UnitDuan)(uint8_t  , uint8_t ,uint16_t );
	void (*SetupDisplayBuf_ByChar)(uint8_t  ,uint8_t , uint8_t);
	void (*SetupDisplayBuf_UnitWei)(uint8_t  ,uint8_t );
	void (*SetupDisplayBuf_UnitDuan)(uint8_t  , uint8_t ,uint8_t );
}nixietube_operations;


extern nixietube_operations nixietube;

#endif


猜你喜欢

转载自blog.csdn.net/tiantangmoke/article/details/103256737