www.pudn.com > C51max7219.rar > max7219.c
#include/*********************** 定义MAX7219 内部寄存器 **********************/ #define REG_DECODE 0x09 // 译码方式寄存器 #define REG_INTENSITY 0x0a // 亮度寄存器 #define REG_SCAN_LIMIT 0x0b // 扫描界限寄存器 #define REG_SHUTDOWN 0x0c // 停机寄存器 #define REG_DISPLAY_TEST 0x0f // 显示测试寄存器 #define INTENSITY_MIN 0x00 // 最小显示亮度 #define INTENSITY_MAX 0x0f // 最大显示亮度 /*********************** 定义MAX7219 端口信号 ************************/ sbit DATA=P1^0; sbit LOAD=P1^1; sbit CLK=P1^2; /************************** 定义显示常数表格 *************************/ static const struct { char ascii; char segs; } Font[] = { {' ', 0x00},{'0', 0x7e},{'1', 0x30},{'2', 0x6d},{'3', 0x79},{'4', 0x33}, {'5', 0x5b},{'6', 0x5f},{'7', 0x70},{'8', 0x7f},{'9', 0x7b},{'A', 0x77}, {'B', 0x1f},{'C', 0x4e},{'D', 0x3d},{'E', 0x4f},{'F', 0x47},{'H',0x37}, {'L',0x0e}, {'O',0x7e},{'\0', 0x00} }; /************************** 函数原型说明 *****************************/ static void Write (unsigned char reg_number, unsigned char dataout); static void SendByte (unsigned char dataout); static unsigned char LookupCode (char character); void Init (void); void ShutdownStart (void); void ShutdownStop (void); void DisplayTestStart (void); void DisplayTestStop (void); void SetBrightness (char brightness); void Clear (void); void DisplayChar (char digit, char character); /************************************************************************ * 函数原型:void Init() * 功 能: 对MAX7219进行初始化,调用任何其他函数之前必需先调用此函数 *************************************************************************/ void Init (void) { DATA=1;LOAD=1;CLK=1; Write(REG_SCAN_LIMIT, 7); // 扫描8位数字 Write(REG_DECODE, 0x00); // 设置不译码方式 ShutdownStop(); // 结束停机方式,正常工作 DisplayTestStop(); // 结束显示测试,正常工作 Clear(); // 清零全部显示器 SetBrightness(INTENSITY_MAX); // 设置最大亮度 } /************************************************************************* * 函数原型:void ShutdownStart() * 功 能: 进入停机方式 **************************************************************************/ void ShutdownStart (void) { Write(REG_SHUTDOWN, 0); } /************************************************************************* * 函数原型:void ShutdownStop() * 功 能:结束停机方式 **************************************************************************/ void ShutdownStop (void) { Write(REG_SHUTDOWN, 1); } /************************************************************************* * 函数原型:void DisplayTestStart() * 功 能:启动显示测试 **************************************************************************/ void DisplayTestStart (void) { Write(REG_DISPLAY_TEST, 1); } /************************************************************************* * 函数原型:void DisplayTestStop() * 功 能:结束显示测试 **************************************************************************/ void DisplayTestStop (void) { Write(REG_DISPLAY_TEST, 0); } /************************************************************************* * 函数原型:void SetBrightness(char brightness) * 功 能:设置LED显示亮度 * 参 数:亮度值(brightness = 0-15) *************************************************************************/ void SetBrightness (char brightness) { brightness &= 0x0f; // 屏蔽参数中的多余位 Write(REG_INTENSITY, brightness); // 设置亮度 } /************************************************************************* * 函数原型:void Clear() * 功 能:关闭全部显示器 **************************************************************************/ void Clear (void) { char i; for (i=1; i <= 8; i++) Write(i, 0x00); // 关闭全部显示器 } /************************************************************************* * 函数原型:void DisplayChar(char digit, char character) * 功 能:在指定数位上显示字符 * 参 数:digit = 数位(0-7) character = 显示字符(0-9, A-Z) *************************************************************************/ void DisplayChar (char digit, char character) { Write(digit, LookupCode(character)); } /************************************************************************* * 函数原型:static unsigned char LookupCode(char character) * 功 能:查段码表将显示字符转换为显示段码 * 参 数:character = 显示字符 * 返 回 值:显示段码 **************************************************************************/ static unsigned char LookupCode (char character) { char i; for (i = 0; Font[i].ascii; i++) // 查表搜寻显示字符的ASCII码 if (character == Font[i].ascii) return Font[i].segs; // 找到则返回对应的显示段码 return 0; // 未找到则返回0 } /************************************************************************* * 函数原型:static void Write (unsigned char reg_number, unsigned char dataout) * 功 能:向指定的MAX7219内部寄存器写入数据 * 参 数: reg_number = MAX7219内部寄存器地址 dataout = 待写入的数据 **************************************************************************/ static void Write (unsigned char reg_number, unsigned char dataout) { LOAD=1; // 使LOAD变高,启动串行数据发送 SendByte(reg_number); // 发送MAX7219内部寄存器地址 SendByte(dataout); // 发送待写入的数据 LOAD=0; // 使LOAD变低,锁存数据 LOAD=1; // 使LOAD变高,串行数据结束 } /************************************************************************* * 函数原型:static void SendByte (unsigned char dataout) * 功 能:向MAX7219发送一个字节串行数据 * 参 数:dataout = 待发送的数据 **************************************************************************/ static void SendByte (unsigned char dataout) { char i; for (i=8; i>0; i--) { unsigned char mask = 1 << (i - 1); CLK=0; // 使CLK变低 if (dataout & mask) // 发送一位数据"1"或"0" DATA=1; else DATA=0; CLK=1; // 使CLK变高 } } /************************************************************************** * 函数原型:main() * 功 能:初始化MAX7219,设置亮度,在指定数位上显示字符 **************************************************************************/ void main(void) { Init (); // 初始化MAX7219 ShutdownStart (); // 停机 ShutdownStop (); // 结束停机 DisplayTestStart (); // 显示测试 DisplayTestStop (); // 结束显示测试 SetBrightness (0x02); // 设置显示亮度 DisplayChar (0x01, '0'); // 第1位LED显示0 DisplayChar (0x02, '1'); // 第2位LED显示1 DisplayChar (0x03, '2'); // 第3位LED显示2 DisplayChar (0x04, '3'); // 第4位LED显示3 Clear (); // 关闭全部LED显示器 DisplayChar (0x05, 'A'); // 第5位LED显示A DisplayChar (0x06, 'B'); // 第6位LED显示B DisplayChar (0x07, 'C'); // 第7位LED显示C DisplayChar (0x08, 'D'); // 第8位LED显示D DisplayChar (0x08, '\0'); // 第8位LED显示“暗码” while(1); }