⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 digital_led.c

📁 MAX7219控制数码管显示程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	Digital_LED_WriteReg( SHUTDOWN_REG, 1 );
	
	OS_EXIT_CRITICAL();
}

/*
//--------------------------------------------------------------
// 测试数码管,当数码管处于测试状态时,全部LED将按最大亮度接通显示
//--------------------------------------------------------------
void Digital_LED_DispTest( void )
{
	Digital_LED_WriteReg( DISPLAY_TEST_REG, 1 );
}
*/

/*
//--------------------------------------------------------------
// 调整数码管的亮度
//--------------------------------------------------------------
void Digital_LED_AdjustLighteness( INT8U lighteness )
{
	// MAX7219的亮度等级从0到0x0f,所以只保留lighteness的低4位
	lighteness &= 0x0f;
	
	Digital_LED_WriteReg( INTENSITY_ADJUST_REG, lighteness );
}
*/



//--------------------------------------------------------------
// 在数码管上显示字符串
//
// 字符串中的字符和数码管的对应关系如下:
// str[0]  str[1]  str[2] ......
// DIG0    DIG1    DIG2   ......
//--------------------------------------------------------------
void Digital_LED_DispStr( const INT8U *str )
{
	INT8U i, segment;
	
	if( str==NULL )
		return ;
	
	for( i=0; i<MAX_DIGITAL_LED_NUM && *str!='\0'; i++, str++ )
	{
	      /*
	            注意:本程序中定义的段码表的数据位和数码管上的段码的对应关系如下
                                      a
                                    ------
                                 f |      | b
                                   |  g   |
                                    ------
                                 e |      | c
                                   |  d   |
                                    ------

                  a    b    c    d    e    f    g    dp
                  --   --   --   --   --   --   --   --
                  B7   B6   B5   B4   B3   B2   B1   B0
                  
                  而MAX7219的段码表的数据位和数码管上的段码的对应关系如下(可参见MAX7219datasheet Page8)
                                      a
                                    ------
                                 f |      | b
                                   |  g   |
                                    ------
                                 e |      | c
                                   |  d   |
                                    ------

                  dp   a    b    c    d    e    f    g
                  --   --   --   --   --   --   --   --
                  B7   B6   B5   B4   B3   B2   B1   B0
                  
                  下面的代码就是将本程序定义的段码表变成MAX7219的这种映射关系
            */
            
	      segment = (INT8U)(DispASCIItoSegTbl[*str]>>1);
	      segment &= 0x7f;
	      if( (DispASCIItoSegTbl[*str]&0x01) == 0x01 )
	            segment |= 0x80;
	            
	      if( '.' == *(str+1) )  // 如果下一个字符为小数点,则直接在本位显示
	      {
	            segment |= 0x80;
	            ++str;
	      }
	       
		Digital_LED_WriteRAM( i+1, segment );
	}
}


	

//--------------------------------------------------------------
// 写显存
//--------------------------------------------------------------
static void Digital_LED_WriteRAM( INT8U addressRAM, INT8U value )
{
	// MAX7219的显存地址范围是 1 ~ 8
	if( 0<addressRAM && addressRAM<9 )
	{
		MAX7219_Write( addressRAM, value );
	}
}

//--------------------------------------------------------------
// 写寄存器
//--------------------------------------------------------------
static void Digital_LED_WriteReg( INT8U reg, INT8U value )
{
	MAX7219_Write( reg, value );
	
}


//--------------------------------------------------------------
// 向MAX7219的某一地址写入数据
// 
// 参数说明:
// 		address		地址
//		value			要写入的数据
//--------------------------------------------------------------
static void MAX7219_Write( INT8U address, INT8U value )
{
#if OS_CRITICAL_METHOD == 3
      OS_CPU_SR   cpu_sr;
#endif
	
	OS_ENTER_CRITICAL();
	// MAX7219只有14个地址空间,所以只保留低4位
	address &= 0x0f;
	
	MAX7219_SendByte( address );
	MAX7219_SendByte( value );
	
	LOAD = 0;
	_nop_();
	_nop_();
	LOAD = 1;
	_nop_();
	OS_EXIT_CRITICAL();
}

	

//--------------------------------------------------------------
// 向MAX7219发送8位数据或地址
//--------------------------------------------------------------
static void MAX7219_SendByte( INT8U value )
{
	INT8U i;
	for( i=0; i<8; i++ )
	{
		CLK = 0;
		
		if( value&0x80 )
			DIN = 1;
		else
			DIN = 0;	
		value<<=1;
		
		CLK = 1;
	}
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -