📄 digital_led.c
字号:
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 + -