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); 
}