📄 max7219.c
字号:
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include <stdio.h>
#include "max7219.h"
#define Max7219_Code 0x09 // 译码模式,后接Data
#define Max7219_NoC 0x00 // 0x00: 非译码
#define Max7219_0C 0x01 // 0x01: D0译码,D1~D7非译码
#define Max7219_03C 0x0F // 0x0F: D0~D3译码,D1~D7非译码
#define Max7219_AC 0xFF // 0xFF: D0~D7全译码
#define Max7219_Bright 0x0A // 调亮命令,后接Data:0x00~0x0f
#define Max7219_Show 0x0B // 显示数字,后接Data:
// 0x00: 0b10000000 0x01: 0b11000000
// 0x02: 0b11100000 0x03: 0b11110000
// 0x04: 0b11111000 0x05: 0b11111100
// 0x06: 0b11111110 0x07: 0b11111111
#define Max7219_Close 0x0C // 关闭模式,后接Data: 0x00 关闭显示 0x01 正常显示
#define Max7219_Test 0x0F // 显示测试,后接Data: 0x00 关闭测试 0x01 开启测试
#define Max7219_Nop 0x00 // 空操作
#define MAX7219_TIME 3
alt_u8 Max7219_Num[] = {
0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B, // 0~9
0xFE, 0xB0, 0xED, 0xF9, 0xB3, 0xDB, 0xDF, 0xF0, 0xFF, 0xFB, // 0.~9.
0x77, 0x1F, 0x4E, 0x3D, 0x4F, 0x47, 0x37, 0x0E, 0x67, 0x01, // ABCDEFHLP-
0xF7, 0x9F, 0xCE, 0xBD, 0xCF, 0xC7, 0xB7, 0x8E, 0xE7, 0x81, // ABCDEFHLP-.
0x00, 0x80 // 消隐,全亮
};
// 公共函数
void Max7219_Init( void ) // 初始化,参数为译码方式,默认为不译码,中亮,全部显示
{
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CLK_BASE, 0x00 );
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CS_BASE, 0x00 );
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_DATA_BASE, 0x00 );
Max7219_Command( Max7219_Code, 0x00 ); // 非译码模式
Max7219_Command( Max7219_Bright, 0x03 ); // 中亮度
Max7219_Command( Max7219_Show, 0x07 ); // 全显示
Max7219_Command( Max7219_Close, 0x01 ); // 开启显示
}
void Max7219_Show_Num( alt_u8 address, alt_u8 num ) // 控制一个数码管显示数字
{
alt_u8 ref = address % 8;
if( ref == 0x00 ) ref = 0x08;
Max7219_Command( ref, Max7219_Num[ num % 42 ] );
}
void Max7219_All_Num( alt_u8 d1, alt_u8 d2, alt_u8 d3, alt_u8 d4, alt_u8 d5, alt_u8 d6, alt_u8 d7, alt_u8 d8 ) // 控制全部数码管显示数字
{
Max7219_Show_Num( 1, d1 );
Max7219_Show_Num( 2, d2 );
Max7219_Show_Num( 3, d3 );
Max7219_Show_Num( 4, d4 );
Max7219_Show_Num( 5, d5 );
Max7219_Show_Num( 6, d6 );
Max7219_Show_Num( 7, d7 );
Max7219_Show_Num( 8, d8 );
}
// 私有函数
void Max7219_Command( alt_u8 max_comm, alt_u8 max_data ) // Max7219单条命令
{
alt_u8 i, ref;
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CS_BASE, 0x00 ); Max7219_Delay();
for( i = 0; i < 4; i++ ) {
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CLK_BASE, 0xFF ); Max7219_Delay();
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CLK_BASE, 0x00 ); Max7219_Delay();
}
max_comm = max_comm << 4;
for( i = 0; i < 4; i++ ) {
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CLK_BASE, 0x00 );
ref = max_comm & 0x80;
if( ref ) IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_DATA_BASE , 0xFF );
else IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_DATA_BASE , 0x00 );
max_comm = max_comm << 1; Max7219_Delay();
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CLK_BASE, 0xFF );
Max7219_Delay();
}
for( i = 0; i < 8; i++ ) {
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CLK_BASE, 0x00 ); ref = max_data & 0x80;
if( ref ) IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_DATA_BASE, 0xFF );
else IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_DATA_BASE, 0x00 );
max_data = max_data << 1;
Max7219_Delay();
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CLK_BASE, 0xFF );
Max7219_Delay();
}
IOWR_ALTERA_AVALON_PIO_DATA( MAX7219_CS_BASE, 0xFF );
}
void Max7219_Delay( void ) // MAX7219初始化
{
volatile int i;
for( i = 0; i<MAX7219_TIME; i++ );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -