max7219.c

来自「51单片机开发与应用技术详解(珍藏版)PPT及源码」· C语言 代码 · 共 142 行

C
142
字号
#include  <reg51.h>   
        
#define DECODE_REG        0x09            	//译码方式寄存器
#define INTENSITY_REG     0x0a            	//亮度寄存器
#define SCANLIMIT_REG    0x0b            	//扫描界限寄存器
#define SHUTDOWN_REG      0x0c            //停机寄存器
#define DISPLAYTEST_REG  0x0f            	//显示测试寄存器

#define MIN     0x00            				//最小显示亮度
#define MAX     0x0f            				//最大显示亮度

sbit DATA=P2^0;							//DATA接口
sbit CLK=P2^1;								//CLK接口
sbit LOAD=P2^2;							//LOAD接口

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 SendByte (unsigned char dataout) 
{
  char i;
  for (i=8; i>0; i--)							//循环发送
{
    unsigned char mask = 1 << (i - 1); 
    CLK=0;                                   	//CLK变低电平
    if (dataout & mask)                      	//发送一位数据
      DATA=1; 
    else 
      DATA=0; 
    CLK=1;                                    //CLK变高电平
}
}

static void WriteMAX7219 (unsigned char reg_number, unsigned char dataout) 
{
  LOAD=1;                               		//置LOAD为高电平,用于启动串行数据发送
  SendByte(reg_number);                 		//发送内部寄存器地址
  SendByte(dataout);                    		//发送数据
  LOAD=0;                               		//置LOAD为低电平,锁存数据
  LOAD=1;                               		//置LOAD为高电平,结束串行数据
}

void OpenShutdown (void) 
{
  WriteMAX7219(SHUTDOWN_REG, 0);			//写停机寄存器
}

void StopShutdown (void)
{
  WriteMAX7219(SHUTDOWN_REG, 1);          //写停机寄存器
}

void OpenLEDTest (void) 
{
  WriteMAX7219(DISPLAYTEST_REG, 1); 		//写显示测试寄存器
}

void StopLEDTest (void) 
{
  WriteMAX7219(DISPLAYTEST_REG, 0);		//写显示测试寄存器
}

void SetLevel (char ch) 
{
  ch &= 0x0f;                         			//屏蔽参数中的多余位
  WriteMAX7219(INTENSITY_REG, ch);          //写亮度寄存器
}

void ClearLED (void) 
{
  char i;
  for (i=1; i <= 8; i++)						//循环
    WriteMAX7219(i, 0x00);                    	//写数字寄存器,关闭全部数码管
}

static unsigned char FindCode (char character) 
{
  char i;
  for (i = 0; Font[i].ascii; i++)             		//循环查表
    if (character == Font[i].ascii)
      return Font[i].segs;                    	//返回对应的显示段码
  return 0;                                   	//未找到,返回0
}

void LEDDisplay (char digit, char character) 
{
  WriteMAX7219(digit, FindCode(character));		//写数字寄存器
}

void main(void) 
{
//初始化MAX7219
DATA=1;LOAD=1;CLK=1;
    WriteMAX7219(SCANLIMIT_REG, 7);         //扫描8位数字
    WriteMAX7219(DECODE_REG, 0x00);        //设置不译码方式
    StopShutdown();                    		//结束停机方式,正常工作
    StopLEDTest();                 			//结束显示测试,正常工作
    ClearLED();                           		//清零全部显示器
    SetLevel(MAX/2);      					//设置一半的亮度

	OpenLEDTest ();                			//显示测试
	StopLEDTest ();                 			//结束显示测试
 
 	LEDDisplay (0x01, '0');            			//第1位LED显示0
	LEDDisplay (0x02, '1');	    				//第2位LED显示1
	LEDDisplay (0x03, '2'); 	    				//第3位LED显示2
	LEDDisplay (0x04, '3'); 	    				//第4位LED显示3
	LEDDisplay (0x05, '4');            			//第5位LED显示4
	LEDDisplay (0x06, '5');	   				//第6位LED显示5
	LEDDisplay (0x07, '6'); 	    				//第7位LED显示6
	LEDDisplay (0x08, '7'); 	   				//第8位LED显示7

	ClearLED ();                           	//关闭全部LED显示器

 	LEDDisplay (0x01, 'A');            			//第1位LED显示A
	LEDDisplay (0x02, 'B');	    				//第2位LED显示B
	LEDDisplay (0x03, 'C'); 	    				//第3位LED显示C
	LEDDisplay (0x04, 'D'); 	    				//第4位LED显示D
	LEDDisplay (0x05, 'E');            			//第5位LED显示E
	LEDDisplay (0x06, 'F');	    				//第6位LED显示F
	LEDDisplay (0x07, 'H'); 	    				//第7位LED显示H
	LEDDisplay (0x08, 'L'); 	    				//第8位LED显示L

	OpenShutdown ();                   		//停机 
	StopShutdown ();                    		//结束停机

	while(1)								//主循环
	{
	}
}

⌨️ 快捷键说明

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