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

📄 max.c

📁 自制实验max7219.rar调试仿真和硬件都可用
💻 C
字号:
#include  <reg51.h>           
/*********************** 定义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 (0x0b);               // 设置显示亮度
	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);
}

⌨️ 快捷键说明

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