数码管、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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 Arduino 开发板实现的 4 位 LED 数码管动态显示的实验代码: ```c++ // 数码管引脚定义 const int DIGIT_1 = 2; const int DIGIT_2 = 3; const int DIGIT_3 = 4; const int DIGIT_4 = 5; // 数码管段引脚定义 const int SEG_A = 6; const int SEG_B = 7; const int SEG_C = 8; const int SEG_D = 9; const int SEG_E = 10; const int SEG_F = 11; const int SEG_G = 12; const int SEG_DP = 13; // 数码管数字编码定义 const byte DIGIT_CODE[] = { 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111 // 9 }; // 数字显示缓存 byte digits[4] = {0, 0, 0, 0}; void setup() { // 初始化数码管引脚 pinMode(DIGIT_1, OUTPUT); pinMode(DIGIT_2, OUTPUT); pinMode(DIGIT_3, OUTPUT); pinMode(DIGIT_4, OUTPUT); // 初始化数码管段引脚 pinMode(SEG_A, OUTPUT); pinMode(SEG_B, OUTPUT); pinMode(SEG_C, OUTPUT); pinMode(SEG_D, OUTPUT); pinMode(SEG_E, OUTPUT); pinMode(SEG_F, OUTPUT); pinMode(SEG_G, OUTPUT); pinMode(SEG_DP, OUTPUT); } void loop() { // 模拟动态显示 for (int i = 0; i < 4; i++) { digitalWrite(DIGIT_1, i == 0 ? HIGH : LOW); digitalWrite(DIGIT_2, i == 1 ? HIGH : LOW); digitalWrite(DIGIT_3, i == 2 ? HIGH : LOW); digitalWrite(DIGIT_4, i == 3 ? HIGH : LOW); delay(5); // 短暂延迟,使显示效果更流畅 displayDigit(digits[i]); // 显示当前位的数字 } } void displayDigit(byte digit) { // 显示数字 for (int i = 0; i < 7; i++) { digitalWrite(i + 6, bitRead(digit, i) ? LOW : HIGH); // 设置数码管段的引脚状态 } } ``` 此代码实现了一个 4 位 LED 数码管动态显示的程序,每个数码管的数字会依次显示,形成动态效果。要在数码管上显示具体的数字,可以将需要显示的数字存储在 `digits` 数组中,然后程序会依次显示 `digits` 数组中的数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值