max7219 八位数码管

#include <stdio.h>
#include <stdint.h>

typedef enum {
	DIGIT_1 = 1, DIGIT_2 = 2, DIGIT_3 = 3, DIGIT_4 = 4,
	DIGIT_5 = 5, DIGIT_6 = 6, DIGIT_7 = 7, DIGIT_8 = 8
} MAX7219_Digits;

static uint32_t lcdPow10(uint8_t n)
{
	uint32_t retval = 1u;

	while (n > 0u)
	{
		retval *= 10u;
		n--;
	}

	return retval;
}

MAX7219_Digits max7219_PrintNtos(MAX7219_Digits position, uint32_t value, uint8_t n)
{
	if (n > 0u)
	{
		uint32_t i = lcdPow10(n - 1u);

		while (i > 0u)	/* Display at least one symbol */
		{
			if(position > 0u)
			{
				printf("i : [%d]\n",(value / i) % 10u);
				position--;
			}

			i /= 10u;
		}
	}
	return position;
}

int main(int argc, char **argv)
{
	max7219_PrintNtos(DIGIT_8,12345678,8);
return 0;

}
i : [1]
i : [2]
i : [3]
i : [4]
i : [5]
i : [6]
i : [7]
i : [8]

https://www.21ic.com/embed/hardware/drivers/201801/50256.html
http://news.eeworld.com.cn/LED/article_2018012012418.html

#define DECODE_MODE  0x09   //译码控制寄存器
#define INTENSITY    0x0A   //亮度控制寄存器
#define SCAN_LIMIT   0x0B   //扫描界限寄存器
#define SHUT_DOWN    0x0C   //关断模式寄存器
#define DISPLAY_TEST 0x0F   //测试控制寄存器        
    Write7219(SHUT_DOWN,0x01);         //开启正常工作模式(0xX1)
    Write7219(DISPLAY_TEST,0x00);      //选择工作模式(0xX0)
    Write7219(DECODE_MODE,0xff);       //选用全译码模式
    Write7219(SCAN_LIMIT,0x07);        //8只LED全用
    Write7219(INTENSITY,0x04);          //设置初始亮度     
(1)        译码控制寄存器(X9H)
如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。实际应用中可以按位设置选择B译码或是不译码方式。
	w_max7219(0x09, 0x00); //译码方式,0x00为不译码,0xff为译码[!--empirenews.page--]

(2)        扫描界限寄存器(XBH)
如图5所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED 0~5显示。
	w_max7219(0x0b, 0x07); //8位扫描显示,取值范围0x01~0x07
(3)        亮度控制寄存器(XAH)
共有16级可选择,用于设置LED的显示亮度,从0xX0~0xXF
	w_max7219(0x0a, 0x01); //显示亮度,取值范围0~f
(4)        关断模式寄存器(XCH)
共有两种模式选择,一是关断状态,(最低位 D0=0)一是正常工作状态(D0=1)。
	w_max7219(0x0c, 0x01); //操作方式,0x00为低功耗模式,0x01为正常操作模式
(5)        显示测试寄存器(XFH)
用于设置LED是测试状态还是正常工作状态,当测试状态时(最低位 D0=1)各位显示全亮,正常工作状态(D0=0)。
各寄存器具体操作见驱动程序详解。
	w_max7219(0x0f, 0x00); //显示状态,0x00为正常显示,0x01为显示测试

bit顺序

/*
 *   AAAAAA\      
 *  FF  __BB\     
 *  FF /  BB |    
 *   GGGGGG  |    
 *  EE  __CC<     
 *  EE /  CC |    
 *  \DDDDDD  |  DP\ 
 *   \______/   \__|
 *  
 *    数码管
 */
disp_table[i]| (1 << 7) 打开dp方法
unsigned char disp_table[] = {
//0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x77, 0x1f, 0x4e, 0x3d, 0x01, 0x00
//dp,a,b,c,d,e,f,g 位
0b01111110,//0
0b00110000,//1
0b01101101,
0b01111001,
0b00110011,
0b01011011,
0b01011111,
0b01110000,
0b01111111,
0b01111011,
0b01110111,
0b00011111,
0b01001110,
0b00111101,
0b00000001,
0b00000000
};
static const uint8_t to_ascii_tab[][2] = {
    'A', 0x77,  '=',0x09,
    'B', 0x1F,  '-',0x01,
    'C', 0x4E,  '+',0x31,
    'D', 0x3D,  '(',0x4E,
    'E', 0x4f,  ')',0x78,
    'F', 0x47,  0,  0,
    'G', 0x5e,
    'H', 0x37,
    'I', 0x78,
    'J', 0x38,
    'K', 0x57,
    'L', 0x0e,
    'M', 0x76,
    'N', 0x15,
    'O', 0x1d,
    'P', 0x67,
    'Q', 0x73,
    'R', 0x46,
    'S', 0x49,
    'T', 0x0f,
    'U', 0x3e,
    'V', 0x1c,
    'W', 0x3f,
    'X', 0x13,
    'Y', 0x3b,
    'Z', 0x2d,
};

/*
*********************************************************************************************************
* LED Segments:         a
*                     ----
*                   f|    |b
*                    |  g |
*                     ----
*                   e|    |c
*                    |    |
*                     ----  o dp
*                       d
*   Register bits:
*      bit:  7  6  5  4  3  2  1  0
*           dp  a  b  c  d  e  f  g
*********************************************************************************************************
* Example : The letter 'I' is represented by illuminating LED's 'b' and 'c' (refer above diagram)
*           Therfore the binary representation of 'I' is as follows
*
*           abcdefg
*           0110000
* 
*           The table below contains all the binary values for the desired font. New font characters
*           can be added or altered as required. 
*           
*           The DP bit is used to switch on the decimal place LED. DP is not included in the below table
*           but is added in the register within the libary depending on the content being displayed.  
*********************************************************************************************************

*/

点阵屏

https://blog.csdn.net/qq_36955622/article/details/114090207

arduion

https://zhuanlan.zhihu.com/p/353321881
原文地址:https://www.cnblogs.com/marklove/p/15717505.html