#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 ;
}
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) ;
}
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; ;
}
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[ ] =
{
0x3F , 0x06 , 0x5B , 0x4F , 0x66 , 0x6D , 0x7D , 0x07 , 0x7F , 0x6F ,
} ;
static const uint8_t charTable[ ] =
{
0x77 , 0x7C , 0x39 , 0x5E , 0x79 , 0x71 , 0x6f ,
0x76 , 0x10 , 0x0e , 0x00 , 0x38 , 0x00 , 0x54 ,
0x5c , 0x73 , 0x67 , 0x50 , 0x6d , 0x78 ,
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