您的当前位置:首页正文

基于mega16 max7219数码管显示

2021-05-26 来源:好走旅游网


基于Mega16、Max7219数码管显示

此设计通过codevision AVR 编程软件向导生成SPI基本程序,选用mega16 SPI第三种工作模式进行数据传输,首先通过向Max7219控制器写入工作模式(下文介绍),之后再向Max 7219写需要显示的数据(下文介绍),在写入需要显示的内容中采用数组形式简单易用。

Max7219工作模式

MAX7219采用串行接收数据,在传送的串行数据中包含有RAM的地址。按照时序要求,单片机将16位二进制数逐位发送到DIN端,在CLK上升沿到来之前DIN必须有效,在CLK的每个上升沿,DIN被串行逐位移入MAX7219内部的16位串行寄存器中。设最先移入的数据是D15,最后移入的数据是D0,则数据格式如下: RAM或SFR地址 显示数据或控制字 D1D1D1D1D1D1DDDDDDDDDD5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 ⑴显示RAM(地址:*1—*8)

接到DIG0引脚的显示器显示地址为*1H的RAM中的数据,接到DIG1引脚的显示器显示地址为*2H的RAM中的数据,如此类推。 ⑵译码方式寄存器(地址:*9H)

该寄存器的8位二进制数的各位值分别控制着8个LED显示的译码方式。当该位为1时选择相应的显示位位BCD码模式,为0时选择不译码。小数点不译码,它由显示数据的D7位控制,D7=1时小数点亮,D7=0时小数点不亮。 ⑶扫描界限寄存器(地址:*BH)

该寄存器的D0—D3位数据设定值为0—7H。设定值表示显示器动态扫描个数为1—8。

⑷停机寄存器(地址:*CH)

该寄存器的D0=0时,MAX7219处于停机状态;当D0=1时,处于正常工作状态。

⑸显示测试寄存器(地址:*FH)

当该寄存器的D0=0时,MAX7219按设定模式正常工作;当D0=1时,处于测试状态,在测试状态下,不管MAX7219处于什么模式,全部LED将按最大亮度接通显示。

⑹亮度寄存器(地址:*AH)及亮度的调节与控制 LED的亮度可通过硬件和软件两种方式调节或控制。 硬件调节

在V+和ISET之间外接电阻RSET,可控制LED段电流,达到硬件调节LED亮度的目的。

LED亮度的程控

亮度寄存器中的D0—D3位可以控制LED显示器的亮度。该寄存器可按其地址

方便地写入,从而实现亮度的程控。方法是:D0—D3控制内部的脉宽调制器(DAC)的占空比来控制LED段电流的平均值,以达到控制亮度的目的。 当亮度寄存器D0—D3位从0变化到0FH时,DAC的占空比从1/32变化到31/32,共16个控制等级,每级变化2/32。 ⑺MAX7219级联

在实际应用中MAX7219可以级联,即前一片的DOUT可接到后一片的DIN上,各片的CLK、LOAD分别并接。与单片机接口时,只需3根控制线即可进行多片MAX7219的控制。数据传送与装载方法同单片MAX7219时相似,所不同的是当N片级联时,各片MAX7219共接收到N×16位数据后再将LOAD由低变高,从而实现N片MAX7219同时装载数据。

数码管

程序

#include #include #include

#define uchar unsigned char

uchar seg[10]={0X7E,0X30,0X6D,0X79,0X33, 0X5B,0X5F,0X70,0X7F,0X7B};

//0X7E,0X30,0X6D,0X79,0X33, //0X5B,0X5F,0X70,0X7F,0X7B

// Dp A B C D E F G // 0 0 1 1 1 1 1 1 0 7e // 1 0 0 1 1 0 0 0 0 30 // 2 0 1 1 0 1 1 0 1 6d // 3 0 1 1 1 1 0 0 1 79

// 4 0 0 1 1 0 0 1 1 33 // 5 0 1 0 1 1 0 1 1 5b // 6 0 1 0 1 1 1 1 1 5f // 7 0 1 1 1 0 0 0 0 70 // 8 0 1 1 1 1 1 1 1 7f // 9 0 1 1 1 1 0 1 1 7b

void spi_write(uchar i,uchar j) {

PORTB.4=0;

SPDR=i; //10101010 10101010 while(SPSR.7==0); SPDR=j; // while(SPSR.7==0); PORTB.4=1; delay_us(100); };

void init_7219(void) //初始化 {

spi_write(0x09,0x00); // 地址9,不译码

spi_write(0x0f,0x00); // 地址16,处于正常工作模式 spi_write(0x0a,0x05); // 地址10,亮度调节

spi_write(0x0b,0x06); // 地址11,动态扫描个数4 spi_write(0x0c,0x01); // 地址12,处于正常工作状态 }

// Declare your global variables here

void main(void) {

PORTB=0x00; DDRB=0xB0;

// SPI initialization // SPI Type: Master

// SPI Clock Rate: 62.500 kHz 625000 // SPI Clock Phase: Cycle Start

// SPI Clock Polarity: High // SPI Data Order: MSB First

//SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 // 0 1 0 1 1 1 1 0 // SPIE Interrupt 1 0 // SPE Enable 1 UnEnable 0

// DORD LSB 1 MSB 0 // MSTR Master 1 Slave 0 // CPOL High 1 Low 0 // CPHA End 1 Start 0

// SPR1 SCK 0 0 1 1 // SPR0 SCK 0 1 0 1 // 1/4 1/8 1/64 1/128

SPCR=0x5E; SPSR=0x00; init_7219(); while (1) {

spi_write(0x01,seg[5]); spi_write(0x02,seg[2]); spi_write(0x03,seg[0]); spi_write(0x04,seg[1]); spi_write(0x05,seg[3]); spi_write(0x06,seg[1]); spi_write(0x07,seg[4]); delay_ms(10000); }; }

显示效果

电路连接

SPI波形

因篇幅问题不能全部显示,请点此查看更多更全内容