📄 max7219_function.c
字号:
/******************************************************************************
MAX7219:
1.数据定义:
| D15 D14 D13 D12 | D11 D10 D09 D08 | D07 D06 D05 D04 D03 D02 D01 D00 |
* * * * [地址] [数据]
2. 时序图:
CP0 CP1 ... ... CP14 CP15
____ ____ ____ ____ ____ ____
CLK: ____| |____| |____| |____| |____| |____| |_________
D15 D14 ..... ..... D01 D00
DIN: __=======____=======___=======___=======___=======___======__________
____ __________
LOAD: |__________________________________________________________|
3. 寄存器地址定义:
寄存器: 地址: 16进制
REGISTER D15-D12 D11 D10 D09 D08 HEX
NO-OP 非操作 * * * * 0 0 0 0 0x0
DIGIT0 数码管0 * * * * 0 0 0 1 0x1
DIGIT1 数码管1 * * * * 0 0 1 0 0x2
DIGIT2 数码管2 * * * * 0 0 1 1 0x3
DIGIT3 数码管3 * * * * 0 1 0 0 0x4
DIGIT4 数码管4 * * * * 0 1 0 1 0x5
DIGIT5 数码管5 * * * * 0 1 1 0 0x6
DIGIT6 数码管6 * * * * 0 1 1 1 0x7
DIGIT7 数码管7 * * * * 1 0 0 0 0x8
译码方式 * * * * 1 0 0 1 0x9
亮度控制 * * * * 1 0 1 0 0xA
扫描范围 * * * * 1 0 1 1 0xB
停机方式 * * * * 1 1 0 0 0xC
显示测试 * * * * 1 1 0 1 0xD
****************************************************************************/
#include "SPCE061V004.h"
//#define IO_DATA *P_IOA_Data //设置输出口为IOA口
#define IO_DATA *P_IOB_Data //设置输出口为IOB口
#define LOAD 0x0004 //io2
#define CLK 0x0001 //io0
#define DIN 0x0002 //io1
//#define LOAD 0x0002 //io1,检测用
//#define CLK 0x0004 //io2,检测用
//#define DIN 0x0001 //io0,检测用
#define Set_LOAD_Low (IO_DATA &= ~LOAD )
#define Set_LOAD_High (IO_DATA |=LOAD)
#define Set_CLK_Low (IO_DATA &= ~CLK)
#define Set_CLK_High (IO_DATA |= CLK)
#define Set_DIN_Low (IO_DATA &= ~DIN)
#define Set_DIN_High (IO_DATA |= DIN)
/* 向 MAX7219 发送命令(16 bit) */
/*这是其他函数的公共函数,真正的应用函数在后面。*/
void sent_LED( unsigned int n )
{
unsigned int i;
i = (unsigned char)( n );
Set_CLK_Low;
Set_LOAD_Low;
Set_DIN_Low;
for ( i=0x8000; i>=0x0001; i=i>>1 )
{
if ( ( n & i ) == 0 ) Set_DIN_Low;else Set_DIN_High;
Set_CLK_High;
Set_CLK_Low;
}
Set_LOAD_High;
}
extern void sent_LED( unsigned int );
/******************************************************************************
初始化 MAX7219
******************************************************************************/
void Init_MAX7219()
{
sent_LED( 0x0C01 ); /* 置LED为正常状态 */
sent_LED( 0x0A04 ); /* 置LED亮度为9/32 */
sent_LED( 0x0B07 ); /* 置LED扫描范围DIGIT0-7 */
sent_LED( 0x0900 ); /* 置LED显示为不译码方式 */
}
/******************************************************************************
清除显示:
void cls()
******************************************************************************/
void cls()
{
unsigned int i;
for (i=0x0100; i<=0x0800; i+=0x0100 ) sent_LED( i ); /* DIGIT0-7 = 0
*/
}
/* 定义显示数字0-9,E,H,L,P数组 */
unsigned int LED_code_09[14]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x4f,0x37,0x0e,0x67};
/* 定义显示位置L0-L7数组 */
unsigned int LED_code_L07[8]=
{0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,0x0800};
/******************************************************************************
显示数字0-9:
void LEDdisplay( uchar H, uchar n )
输入: H 显示位置0-7 [7][6][5][4][3][2][1][0]
n 显示数值0-9
DP 显示小数点 1xxxxxxx :ON/0xxxxxxx:OFF
******************************************************************************/
void LEDdisplay( unsigned char H, unsigned char n )
{
if ( ( n & 0x80 ) == 0 )
{
sent_LED( LED_code_L07[ H ] | LED_code_09[ n ] );
}
else
{
sent_LED( LED_code_L07[ H ] | LED_code_09[ n & 0x7F ] | 0x80 );
}
}
/******************************************************************************
函数:unsigned char PointCTL(unsigned char );
功能:将段码经过加小数点处理,返回处理后段码
输入:段码Seg_Code,作为 LEDdisplay的参数,并且要用在紧靠 LEDdisplay之前
返回:经过加小数点控制的段码
******************************************************************************/
unsigned char PointCTL(unsigned char segcode)
{
segcode|=0x80;
return(segcode);
}
/*******************************************************************************
函数:Intensity_CTL(unsigned char )
功能:亮度控制,控制量只能处于0-15之间
输入:亮度控制量
********************************************************************************/
void Intensity_CTL(unsigned char ctlword)
{
if(ctlword<0xf)
{
ctlword|=0x0a00;
sent_LED(ctlword );
}
}
/******************************************************************************
函数:ScanLimit(unsigned char )
功能:显示位数控制,1-8可设制
输入:要显示的位数
*******************************************************************************/
void ScanLimit(unsigned char ctlchar)
{
if(ctlchar<=0x8)
{
ctlchar-=1;
ctlchar|=0x0b00;
sent_LED( ctlchar);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -