基于MAX7219的数码管显示

发布者:心怀梦想最新更新时间:2016-09-07 来源: eefocus关键字:MAX7219  数码管显示 手机看文章 扫描二维码
随时随地手机看文章
在学习了单片机驱动7段数码管显示电路后,了解实际应用中多是利用的专门的数码管显示驱动芯片,例如MAX7219多功能串行LED显示驱动芯片。MAX7219是一款串行共阴极数码管动态显示驱动芯片,其峰值段电流可达40mA,最高串行扫描频率为10MHz,典型扫描频率为1.3kHz,仅使用3线串行接口传送数据,可直接与单片机接口,可以方便的修改内部参数以实现多位LED显示。内部含硬件动态扫描显示控制电路,每片芯片可同时驱动8位共阴极LED或64个独立的LED,多片MAX7219级联时,可控制更多的LED。

 

主要器件为AT89C52、LED显示驱动芯片MAX7219、8个7段共阴极数码管等。

 

试验电路图:

 

 


 

试验c程序代码:

//8DigitShow.h程序

#ifndef    _8DIGITSHOW_H                // 防止8DigitShow.h被重复引用

 

#define    _8DIGITSHOW_H

 

#include                    // 引用标准库的头文件

#include

 

#define uchar unsigned char

#define uint unsigned int

 

sbit DIN = P1^0;                    // 串行数据输入

sbit CLK = P1^1;                    // 串行时钟

sbit LOAD = P1^2;                   // 显示数据锁存控制

 

#define NoOp   0x00             // 空操作寄存器

#define Digit0 0x01             // 数码管1寄存器

#define Digit1 0x02             // 数码管2寄存器

#define Digit2 0x03              // 数码管3寄存器

#define Digit3 0x04             // 数码管4寄存器

#define Digit4 0x05             // 数码管5寄存器

#define Digit5 0x06             // 数码管6寄存器

#define Digit6 0x07             // 数码管7寄存器

#define Digit7 0x08             // 数码管8寄存器

#define DecodeMode 0x09            // 译码模式寄存器

#define Intensity 0x0a                 // 亮度寄存器

#define ScanLimit 0x0b              // 扫描位数寄存器

#define ShutDown 0x0c               // 低功耗模式寄存器

#define DisplayTest 0x0f            // 显示测试寄存器

 

#define ShutdownMode 0x00            // 低功耗方式

#define NormalOperation 0x01         // 正常操作方式

 

#define ScanDigit 0x07                 // 扫描位数设置,显示8位数码管

#define DecodeDigit 0xff           // 译码设置,8位均为BCD码

#define IntensityGrade 0x0a          // 亮度级别设置

 

#define TestMode 0x01                  // 显示测试模式

#define TextEnd 0x00                   // 显示测试结束,恢复正常工作模式

 

uchar DisBuffer[8]={0,0,0,0,0,0,0,0};    // 显示缓存区

 

 

#endif

//main.c程序

#include "8DigitShow.h"

 

/* 延时t毫秒 */

void delay(uint t)

{

       uint i;

       while(t--)

       {

              /* 对于12M时钟,约延时1ms */

              for (i=0;i<125;i++)

              {}

       }

}

 

/* 向MAX7219写入字节(8位)*/

void SendChar (uchar ch)

{

       uchar i,temp;

    _nop_();

    for (i=0;i<8;i++)

    {

              temp=ch&0x80;

           ch=ch<<1;

        if(temp)

        {

               DIN=1;

                  CLK=0;

               CLK=1;

        }

        else

        {

               DIN=0;

               CLK=0;

               CLK=1;

        }

    }

}

 

/* 向MAX7219写入字(16位)*/

void WriteWord (uchar addr,uchar num)

{

    LOAD=0;

    _nop_();

    SendChar(addr);

    _nop_();

    SendChar(num);

    _nop_();

    LOAD=1;                            // 锁存进相应寄存器

}

 

/* MAX7219初始化 */

void InitDisplay (void)

{

    WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限

    WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式

    WriteWord (Intensity,IntensityGrade);    // 设置亮度

    WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式

}

 

/* 主函数 */

void main(void)

{

     InitDisplay ();                                              // MAX7219初始化

 

          WriteWord(DisplayTest,TestMode);           // 开始显示测试,点亮所有LED

     delay(3000);                                                 // 延时约3s

     WriteWord (DisplayTest,TextEnd);            // 退出显示测试模式

 

     while(1)

     {

            uchar i,j;

              /* 8个数码管以相同间隔时间2s同时变化显示0~9的数字 */

        for (i=0;i<=9;i++)

        {

              delay(2000);                                   // 间隔约2s

            InitDisplay();

                     for (j=0;j<=7;j++)

                               DisBuffer[j]=i;

           

                     WriteWord (Digit0,DisBuffer[0]);

            WriteWord (Digit1,DisBuffer[1]);

            WriteWord (Digit2,DisBuffer[2]);

            WriteWord (Digit3,DisBuffer[3]);

            WriteWord (Digit4,DisBuffer[4]);

            WriteWord (Digit5,DisBuffer[5]);

            WriteWord (Digit6,DisBuffer[6]);

            WriteWord (Digit7,DisBuffer[7]);

        }

    }

}

关键字:MAX7219  数码管显示 引用地址:基于MAX7219的数码管显示

上一篇:单片机实现液晶显示
下一篇:点阵LED电子显示屏控制系统设计方案

推荐阅读最新更新时间:2024-03-16 15:08

时钟及温度用74hc164+74ls145数码管显示单片机程序
下面是实物图: 电路图 很简单我就不画了 数码管用74hc164串行转并行 芯片 +74ls145这2个芯片驱动一个负责段选一个负责位选,具体看程序顶部的引脚定义.完整的keil工程文件下载地址: http://www.51hei.com/f/164smg.rar 下面是程序源码. #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit iicclk=P1^0;////总线存储时钟引脚定义 sbit iicdat=P1^1;////总线存储数据引脚定义 sbit hc164dat
[单片机]
时钟及温度用74hc164+74ls145<font color='red'>数码管</font><font color='red'>显示</font>单片机程序
对单片机数码管显示段选位选的理解
在51单片机的数码管的应用开发中一些小的细节还是应该注意到的。 其中位选信号应该在段选之前打开,下面是一段示例代码(我用的是国信长天开发板): #include reg51.h // 包含51单片机寄存器定义的头文件 #include intrins.h #define uint unsigned int sbit buzz=P0^6; /************************************************** 函数功能:d延时函数,延时一段时间 ***************************************************/ void dela
[单片机]
51单片机+MAX7219数码管显示C程序
/************************************************** *程序名称: MAX7219 C语言控制程序 *程序功能: 3线串行控制8位共阴数码管 *3线定义:DIN 串行数据输入 * LOAD 数据锁存 * CLK 时钟输入 ***************************************************/ #
[单片机]
74HC164控制数码管显示
刚开始的时候把74HC164当成了74HC573使了,还看了原理图,半天摸不出个所以然,然后上网查了资料,才知道原来74HC164是串入并出的,此时才知道思考方向出错了。于是再看原理图再分析示例代码方有所获。 原来164只有一个输入端sda(P10),一个控制位clk(P11),还有四个位选:dig1~dig4分别与P13~P15相连,我们可以通过控制dig来达到选位的目的,然后再用sda来向164里传数。而164共有8个输出端,刚好对应了数码管的一个字节(a,b,c,d,,e,f,g,dp),从而显示出不同的数。 还有我写的一个例子程序发现了一个小问题,现在想不通,放到这以后再想:为164送数的时候不能用wh
[单片机]
51单片机动态数码管显示(新字符串思路)
新思路 对于数码管的动态显示,已经有了很多的基础教学,教学中多用数组的形式储存数据来进行动态显示,便于理解。对于纯数据来说,数组是一个很好的选择,但是如果有的特殊符号或者字母,数组似乎就没这么方便,总是需要记忆特殊字符所对应的数组下标。如果一定要用数组显示,也可以通过宏定义或枚举来减轻记忆的负担,但是总觉得没这么流畅。倘若能把所有需要显示的内容写成一个字符串,再对字符串进行处理,那么应该能够使程序更加可读,并可以简化操作。 字符串的处理 若想对字符串进行处理,那么第一步就是将字符串中的内容转化成数码管的段码。这里展示共阳极数码管的转化函数代码: #ifndef U8 #define U8 typedef unsigned
[单片机]
键盘扫描-数码管递增显示程序
/* 程序效果:51单片机按键扫描数码管显示输入,数码管为递增显示,即像     手机打电话时输入号码一样,程序简单紧凑     理解相对困难,但只要把上一程序弄懂,本程序     即可理解。 程序设计者:http://www.51hei.com转载请保留版权. 注意:如果无法在keil里编译,请删除每一行的所有前导空白, */ #include reg52.h //头文件 #include intrins.h #define uchar unsigned char //宏定义 #define uint unsigned int sbit jdq=P3^5; //位声明,驱动继电器管脚 sbit fmq=P3^4; //位声
[单片机]
AVR第6课:数码管显示
这一节我们将讲解数码管的使用,由于原理在学51单片机的时候已经学习过,在这里只需要利用前面学习的对AVR单片机的IO口操作方式就可以自己写练习题了。 下面的数码管是共阳极数码管。 代码:显示从0到9。 /* *author:ChenLu *date:2014.11.20 */ //input the head file so that the program can work normally //iom16v---know the register //macros---know the BIT(x) #include iom16v.h #include macros.h //use those can
[单片机]
基于AVR单片机的DS1302数码管时间显示C语言程序设计
#include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int #include DS1302_drive.h uchar K1_FLAG=0; //定义按键标志位,当按下K1键时,该位置1,K1键未按下时,该位为0。 uchar const bit_tab ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选表,用来选择哪一只数码管进行显示 uchar const seg_data ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved