51单片机程序 MAX7219
- 格式:doc
- 大小:29.50 KB
- 文档页数:2
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图1所示及内部结构如图2所示。
图1 MAX7219的外部引脚分配图2 MAX7219的内部引脚分配各引脚的功能为:DIN:串行数据输入端DOUT:串行数据输出端,用于级连扩展LOAD:装载数据输入CLK:串行时钟输入DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流SEG A~SEG G DP 7段驱动和小数点驱动ISET:通过一个10k电阻和Vcc相连,设置段电流MAX7219有下列几组寄存器:(如图3)MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。
编程时只有正确操作这些寄存器,MAX7219才可工作。
图 3 MAX7219内部的相关寄存器分别介绍如下:(1)译码控制寄存器(X9H)如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。
当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。
实际应用中可以按位设置选择B译码或是不译码方式。
图4 MAX7219的译码控制寄存器(2)扫描界限寄存器(XBH)如图5所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED 0~5显示。
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图1所示及内部结构如图2所示。
图1 MAX7219的外部引脚分配
图2 MAX7219的内部引脚分配
各引脚的功能为:
DIN:串行数据输入端
DOUT:串行数据输出端,用于级连扩展
LOAD:装载数据输入
CLK:串行时钟输入
DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流SEG A~SEG G DP 7段驱动和小数点驱动ISET:通过一个10k电阻和Vcc相连,设置段电流MAX7219有下列几组寄存器:(如图3)。
MAX7219单片以及级联驱动程序2011-03-20 09:40说明一下:这个word版式是从百度上下载的,在原版中,作者只是写了驱动一片MAX7219的程序。
本人作为菜鸟,第一次使用MAX7219就用了两片级联来驱动15个数码管,按照原版程序驱动一片MAX7219是没有问题的,但是,驱动两片MAX7219就不行了。
自己先认真看了MAX7219的DataSsheet,因为英语是个二把刀,看的迷迷糊糊,似懂非懂(可见英语还是很重要的),又在网上搜索也没发现有正确的程序(都是有点儿问题,上网贴出来请教各位大虾的),没办法只能自力更生了,终于调出来了。
将原版增删修改,传上来共享,希望对以后某位菜鸟第一次使用MAX7219时有所帮助啦,嘿嘿!/**************************************************************** *常用符号定义******************************************************************/#define uchar unsigned char/**************************************************************** *定义MAX7219寄存器******************************************************************/#define REG_NO_OP 0x00 //定义空操作register#define DIG_1 0x01 // 定义数码管1 register#define DIG_2 0x02 // 定义数码管2 register#define DIG_3 0x03 // 定义数码管3 register#define DIG_4 0x04 // 定义数码管4 register#define DIG_5 0x05 // 定义数码管5 register#define DIG_6 0x06 // 定义数码管6 register#define DIG_7 0x07 // 定义数码管7 register#define DIG_8 0x08 // 定义数码管8 register#define REG_DECODE 0x09 // 定义解码控制register#define REG_INTENSITY 0x0a // 定义显示亮度register#define REG_SCAN_LIMIT 0x0b // 定义扫描限制register#define REG_SHUTDOWN 0x0c // 定义"shutdown"模式register#define REG_DISPLAY_TEST 0x0f // 定义"display test"模式register#define INTENSITY_MIN 0x00 // 定义最低显示亮度#define INTENSITY_MAX 0x0f // 定义最高显示亮度/****************************************************************** * 定义硬件引脚连接******************************************************************/#define DATA P2^3; //定义P3_5连接MAX7219 DATA引脚#define CLK P2^5; //定义P3_4连接MAX7219 CLK 引脚#define CS P2^4; //定义P3_3连接MAX7219 CS 引脚/***************************************************************** * 共阴极七段数码管显示对应段查询表(数字0-9分别对应code_table[0]-[9])***********************************************************/uchar code code_table[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; /*采用数组*//****************************************************************** * MAX7219_Send()描述: 向MAX7219传送一字节数据Arguments : dataout = data to sendReturns : none******************************************************************/ void send (uchar datain){char I,temp;for (i=8; i>0; i--){CLK=0; // CLK 置低temp=datain&0x80;if (temp==0x80) // 判断并输出一位DATA=1; // 输出"1"else // 或DATA=0; // 输出"0"datain<<=1; //datain左移位,以便再次与0x80按位与CLK=1; // CLK 置高}}/**************************************************************** * MAX7219_Write()/MAX7219_Write_1()描述: 向 MAX7219 写命令Arguments : reg_number = register to write todataout = data to write to MAX7219Returns : none************************************************************** */ void MAX7219_Write (uchar add1, uchar dat1) //向第一片MAX7219写数据{CS=0; // CS置低选通MAX7219send(add1); // 写register number 到MAX7219send(dat1); // 写data 到MAX7219CS=1; // 利用CS上升沿锁存以上移位进输入的16位数据}void MAX7219_Write_1(uchar add2,uchar dat2) //向第二片MAX7219写数据{CS=0;sent(add2);sent(dat2);CLK=1; // 第16.5个时钟周期,数据从第一片MAX7219的DOUT端开始输出sent(REG_NO_OP); //对第一片MAX7219进行空操作,sent(0x00);CS=1;}/******************************************************************** MAX7219_DisplayChar()描述: 使某一位显示一个数字Arguments : digit = digit number (0-7)character = character to display (0-9, A-Z)Returns : none****************************************************************/void MAX7219_DisplayChar (char digit, char character){MAX7219_Write(digit, character);}PS:这个函数可以不要,直接调用写数据函数就可以了(原版)/******************************************************************** MAX7219_Clear()/MAX7219_clear_1()描述: 清除所有位的显示Arguments : noneReturns : none*****************************************************************/ void MAX7219_Clear (){uchar i;for (i=0; i < 8; i++)MAX7219_Write(i, 0x00); // 清除第一片MAX7219所有位的显示}void MAX7219_Clear_1(){uchar i;for(i=1;i<=8;i++)MAX7219_Write_1(i,0x00); //清除第二片MAX7219所有位的显示}PS:可以两片一起清楚数据,但建议分开较好。
摘要:介绍8位串行LED显示驱动 ̄MAX7219的特性,并给出了单片机系统中MAX7219与MCS--51的硬件接口设计,以及相应的软件流程图和编程实现。
关键词:MAX721;单片机;显示电路单片机系统通常需要有LED对系统的状态进行观测,而很多工业控制用单片机FIMCS51系列本身并无显示接口部分,需要外接显示的译码驱动电路。
在MCS51单片机的控制系统中,采用MAxIM公司的MAX7219构成显示接口电路,仅需使用单片机3个引脚,即可实现对8位LED数码管的显示控制和驱动,线路简单,控制方便。
1MAx7219与单片机的连接MAX7219与MCS一51单片机连接时可根据具体的系统要求和系统资源占用情况选用2种驱动方式:串行口移位驱动MAX7219或I/0口模拟三线协议时序驱动MAX7219。
通常单片机系统的串口要用作其他用途,比如和上位机联机通信等。
故本系统利用单片机的I/O口来模拟MAX7219的时序,应用电路如图1所示。
其中,P2.0作串行数据输出,连接 ̄IDIN端,P2.1和P2.2连扫描电路选通某字时,相引脚DIG×为低电平。
显示接至CLK和LOAD,通过程序分别模拟MAX7219的时钟数据串行输入MAX7219,移位存入数字寄存器,片内多脉CLK及数据加载LOAD信号。
ISET管脚接l0kQ电阻路扫描电路顺序扫描,分时选通各字,被选通字的引脚用于限定峰值段电流。
置为低电平,LED发光显示数字,未选通的字引脚保持本系统的设计中,只需要5个LED,所以DIG5~DIG7高电平。
未用悬空。
显示电路中,所有LED显示器的同名段(a~f,系统设计中,应用MAX7219芯片时需要注意如下dp)连接在一起并与MAX7219的同名段引脚(SA~SG,几个关键问题:SDP)H连,各LED显示器的共阴极分别与MAX721的相(1)3根信号线。
应字引脚(DIG0一DIG4)相连,以实现位选,当MAX7219在强干扰环境中,如大功率电机的启停或高压发生过程中,干扰源可能通过供电电源或3根信号线串入显示电路,造成显示器的不稳定,从而出现段闪烁、显示不全、甚至全暗或全亮的现象。
单片机时钟设计MAX7219驱动数码管#include#define uchar unsigned char#define uint unsigned intsbit DIN=P0^1; //"显示串行数据输入端"sbit LOAD=P0^2; //"显示数据锁存端"sbit CLK=P0^3; //"显示时钟输入端"#define DecodeMode 0x09 //"译码模式"#define Intensity 0x0a //"亮度"#define ScanLimit 0x0b //"扫描界限"#define ShutDown 0x0c //"掉电模式"#define DisplayTest 0x0f //"显示测试"uchar code seg_data[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B}; //"0,1,2,3,4,5,6,7,8,9" uchar disp_buf[5];uchar code bit_tab[]={0x01,0x02,0x03,0x04};uchar hour=12,min=0,sec=0,count=0;bit flag;void delay (uint a) //" 毫秒延时函数"{uint i;while( --a != 0){for(i = 0; i < 110; i++);}}void write_max7219_byte(uchar temp){uchar i;for(i=0;i<8;i++){CLK=0;DIN=(bit)(temp&0x80);temp<<=1;CLK=1;}}void write_max7219(uchar address,uint dat){LOAD=0;write_max7219_byte(address);write_max7219_byte(dat);LOAD=1;}void Init_max7219 (void){write_max7219(ScanLimit,0x07); //*"设置扫描界限"*/write_max7219(DecodeMode,0xff); //*"设置译码模式"*/ write_max7219(Intensity,0x04); //*"设置亮度"*/write_max7219(ShutDown,0x01); //*"设置电源工作模式"*/ write_max7219(DisplayTest,0x01);delay(5);write_max7219(DisplayTest,0x00);}void conv(uchar in1,in2){disp_buf[0]=in1/10;disp_buf[1]=in1%10;disp_buf[2]=in2/10;if(flag==0)disp_buf[3]=(in2%10)|0x80;elsedisp_buf[3]=in2%10;}void display( ){write_max7219(bit_tab[0],disp_buf[0]); write_max7219(bit_tab[1],disp_buf[1]); write_max7219(bit_tab[2],disp_buf[2]); write_max7219(bit_tab[3],disp_buf[3]); }void init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20){count=0;flag=~flag;sec++;if(sec==60) {sec=0;min++;if(min==60) {min=0;hour++;if(hour==24) {hour=0;min=0;sec=0;}}}}}void main() {init();Init_max7219 ( ); while(1){conv(hour,min); display( );}}。
(一)、MAX7219 MAX7219是一种串入、并出的共阴极LED数码管显示驱动器,每片可驱动8位LED数码管显示,与单片机的接口只需3根线,内带BCD译码器,及显示测试、移位、锁存器等,输出电流达40mA,外围只需一只亮度调整电阻。
MAX7219引脚图1、引脚功能说明DIN:串行数据输入端,CLK的上升沿时数据被载入内部16位移位寄存器中CLK:串行时钟输入端,最高工作频率可达10MHz LOAD:片选端,低电平接收DIN端的数据,高电平时数据被所存DIG0~7:LED的位控制端A~DP:LED 的端控制端DOUT:串行数据输出端,用于芯片的级联ISET:硬件亮度调整端,在该引脚与VCC之间跨接一个电阻,LED的亮度即可通过该电阻来调节,流过LED的段驱动平均电流为流过此电阻电流的100倍,此电阻值范围为:10~80K之间。
2、内部寄存器说明A、译码方式选择寄存器地址:09H 赋值:FFH 表示使用MAX7219内部的BCD译码器00H 表示不使用MAX7219内部的BCD译码器B、亮度调节寄存器地址:0AH 赋值:00H~0FH 可改变MAX7219所驱动的LED的亮度,其变化范围在1/32~31/32之间C、扫描位数设定寄存器地址:0BH 赋值:00H 所有位不显示01H~07H 依次对应于1~8位及前面位全部显示(即需显示的位应为“1”)D、待机模式开关寄存器地址:0CH 赋值:00H LED全灭01H LED正常显示E、显示器测试寄存器地址:0FH 赋值:00H LED为正常显示状态01H LED测试状态,即LED全亮F、8位LED显示数据寄存器地址:01H~08H 对这些寄存器赋值(即需显示的内容),就会在对应的1~8位LED数码管上显示出来3、使用注意事项由于电源中杂波或附近的电磁等干扰信号,使MAX7219在上电后不显示或乱显示;为了消除这种现象应在MAX7219的VCC端与地之间接一只104pf的瓷片电容,在LOAD端于地之间接一只10K的电阻。
#include <reg51.h>#include "type.h"#include "max7219.h"/********************************************************************控制按键定义***********************************************************************/ sbit Key = P3^0;/********************************************************************变量定义***********************************************************************/uint16 Ms = 0;uint16 Sec = 0;uint8 k;uint8 Count = 0;/************************************************************************函数声明*************************************************************************/void Start_Stop();void Init_Timer0();void Delay();void Display();void Key_In();void Reset();/************************************************************************main()主函数*************************************************************************/void main(){Init_Max7219();Init_Timer0();while(1){Key_In();switch(k){case 0 : Reset();break;case 1 : Display();break;case 2 : TR0 = 0;break;}}}/************************************************************************定时器0中断函数*************************************************************************/void Interrupt_Timer0() interrupt 1{TH0 = 0xee;TL0 = 0x00;Count++;if(Count >= 2){Count = 0;Ms++;if(Ms >= 99) //100次为1s{Ms = 0; //秒数最大显示为99,之后从头开始计时Sec++;}if(Sec >= 99)Sec = 0; //秒加到99,重新计数}}/************************************************************************Reset()清零函数*************************************************************************/void Reset(){Init_Max7219();Init_Timer0();Ms = 0;Sec = 0;}/************************************************************************Display()函数*************************************************************************/void Display(){Write_Max7219(DIG_8,Ms%10);Write_Max7219(DIG_7,Ms/10);Write_Max7219(DIG_6,(Sec%10 | 0x80));Write_Max7219(DIG_5,Sec/10);}/***********************************************************************延时函数(约7毫秒)************************************************************************/void Delay(uint16 x){char i;while(x--){for(i=0;i<125;i++);}}/************************************************************************定时器0初始化*************************************************************************/void Init_Timer0(){TMOD |= 0x11; //初始化两个定时器TH0 = 0x33; //只用到定时器0,赋初值,中断一次5msTL0 = 0x00;TR0 = 1; //启用定时器0ET0 = 1; //允许定时器中断EA = 1; //将总中断打开}/************************************************************************按键控制*************************************************************************/ void Key_In(){if(!Key){Delay(19);if(!Key){k++;if(k>2){k = 0;}while(!Key);}}}max7219.h#ifndef _MAX7219_H_#define _MAX7219_H_/*********************************************************引脚位定义**********************************************************/sbit LOAD=P1^2; //MAX7219 Load-Data Input: rising edge pin 12 sbit DIN=P1^1; //MAX7219 Serial-Data Input: rising edge pin 1 sbit CLK=P1^0; //MAX7219/****************************************************MAX7219 宏定义*****************************************************/#define REG_NO_OP 0x00 // 定义空操作#define DIG_1 0x01 // 定义数码管1#define DIG_2 0x02 // 定义数码管2#define DIG_3 0x03 // 定义数码管3#define DIG_4 0x04 // 定义数码管4#define DIG_5 0x05 // 定义数码管5#define DIG_6 0x06 // 定义数码管6#define DIG_7 0x07 // 定义数码管7#define DIG_8 0x08 // 定义数码管8#define DECODE_MODE 0x09#define INTENSITY 0x0A#define SCAN_LIMIT 0x0B#define SHUT_DOWN 0x0C#define DISPLAY_TEST 0x0F/***********************************************************MAX7210函数声明************************************************************/void Write_Max7219_byte(uint8 temp);//write max7219 a bytevoid Write_Max7219(uint8 address,uint8 dat);//write max7219 command and data void Init_Max7219(void);//Initize max7219/************************************************************MAX7219地址、数据写入函数子程序*************************************************************/void Write_Max7219_byte(uint8 temp){uint8 i;for (i=0;i<8;i++){CLK = 0;DIN = (bit)(temp&0x80);temp <<= 1;CLK = 1;}}/*************************************************************MAX7219地址、数据写入**************************************************************/void Write_Max7219(uint8 address,uint8 dat){LOAD = 0;Write_Max7219_byte(address);Write_Max7219_byte(dat);LOAD = 1;}/**************************************************************MAX7219初始化***************************************************************/void Init_Max7219(void){Write_Max7219(SHUT_DOWN, 0x01);Write_Max7219(DISPLAY_TEST, 0x00);Write_Max7219(DECODE_MODE, 0xff);Write_Max7219(SCAN_LIMIT, 0x07); //SCAN LIMIT 0~7 0xX0~0xX7 Write_Max7219(INTENSITY, 0x04);Write_Max7219(DIG_7,0x00);Write_Max7219(DIG_5,0x00);Write_Max7219(DIG_6,0x80);Write_Max7219(DIG_8,0x00);}#endiftype.h#ifndef _TYPE_H_#define _TYPE_H_typedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;typedef char int8;typedef int int16;typedef long int32;#endif。
MAX7219共阴极 LED数码管显示驱动(一)、 MAX7219MAX7219是一种串入、并出的共阴极LED数码管显示驱动器,每片可驱动8 位 LED数码管显示,与单片机的接口只要 3 根线,内带BCD译码器,及显示测试、移位、锁存器等,输出电流达40mA,外头只要一只亮度调整电阻。
MAX7219引脚图1、引脚功能说明DIN:串行数据输入端,CLK的上涨沿时数据被载入内部16 位移位存放器中CLK:串行时钟输入端,最高工作频次可达10MHzLOAD:片选端,低电平接收DIN 端的数据,高电平常数据被所存DIG0~7: LED的位控制端A~DP:LED的端控制端DOUT:串行数据输出端,用于芯片的级联ISET:硬件亮度调整端,在该引脚与VCC之间跨接一个电阻,LED的亮度即可经过该电阻来调理,流过LED的段驱动均匀电流为流过此电阻电流的100 倍, 此电阻值范围为:10~80K 之间。
2、内部存放器说明A、译码方式选择存放器地点:09H赋值: FFH表示使用MAX7219内部的BCD译码器00H表示不使用MAX7219内部的 BCD译码器B、亮度调理存放器地点:0AH赋值:00H~0FH 可改变MAX7219所驱动的LED的亮度,其变化范围在1/32~31/32之间C、扫描位数设定存放器地点:0BH赋值: 00H所有位不显示01H~07H挨次对应于1~8 位及前方位所有显示(即需显示的位应为“1”)D、待机模式开关存放器地点:0CH赋值: 00H LED全灭01H LED正常显示E、显示器测试存放器地点: 0FH赋值: 00H LED为正常显示状态01H LED测试状态,即LED全亮F、8 位LED显示数据存放器地点: 01H~08H对这些存放器赋值(即需显示的内容),就会在对应的1~8 位LED数码管上显示出来3、使用注意事项因为电源中杂波或邻近的电磁等扰乱信号,使MAX7219在上电后不显示或乱显示;为了除去这类现象应在 MAX7219的 VCC端与地之间接一只104pf 的瓷片电容,在LOAD端于地之间接一只10K 的电阻。
点阵屏驱动程序(MAX7219)//自己做项目写的2*4点阵屏驱动,分享给大家,基于STC15单片机点阵屏如上图所示#include "stc15w4k32s4.h"#define uchar unsigned char#define uint unsigned int//定义Max7219端口sbit Max7219_pinCLK = P1^7;sbit Max7219_pinCS = P1^6;sbit Max7219_pinDIN = P1^5;void Write_Max7219_byte(uchar DATA); //向MAX7219(U3)写入字节void Write_Max7219(uchar address,uchar dat); //向MAX7219写入数据void Init_MAX7219(void); //初使化函数void Display_1(uchar dat); //1号屏显示数字void Display_2(uchar dat); //2号屏显示数字void Display_3(uchar dat); //3号屏显示数字void Display_4(uchar dat); //4号屏显示数字void Display_5(uchar dat); //5号屏显示数字void Display_6(uchar dat); //6号屏显示数字void Display_7(uchar dat); //7号屏显示数字void Display_8(uchar dat); //8号屏显示数字、/* 8个点阵驱动程序 */uchar code disp1[38][8] ={{0x00,0x30,0x48,0x48,0x48,0x48,0x48,0x30}, //0{0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38}, //1{0x00,0x78,0x08,0x08,0x78,0x40,0x40,0x78}, //2{0x00,0x78,0x08,0x08,0x78,0x08,0x08,0x78}, //3{0x00,0x10,0x30,0x50,0x78,0x10,0x10,0x10}, //4{0x00,0x78,0x40,0x40,0x78,0x08,0x08,0x78}, //5{0x00,0x78,0x40,0x40,0x78,0x48,0x48,0x78}, //6{0x00,0x7C,0x04,0x08,0x10,0x10,0x10,0x10}, //7{0x00,0x78,0x48,0x48,0x78,0x48,0x48,0x78}, //8{0x00,0x78,0x48,0x48,0x78,0x08,0x08,0x78}, //9{0}, //显示空白10 {0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00}, //显示负数符号11 {0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x7C}, //E 12 {0x00,0x78,0x44,0x44,0x7C,0x48,0x48,0x44}, //R 13 {0x10,0x28,0x44,0x44,0x44,0x7C,0x44,0x44}, //A 14 {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x78}, //L 15 {0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70}, //C 16 };//--------------------------------------------//功能:向MAX7219(U3)写入字节//入口参数:DATA//出口参数:无//说明:void Write_Max7219_byte(uchar DATA){uchar i;Max7219_pinCS=0;for(i=8;i>=1;i--){Max7219_pinCLK=0;Max7219_pinDIN=DATA&0x80;DATA=DATA<<1;Max7219_pinCLK=1;}}//-------------------------------------------//功能:向MAX7219写入数据//入口参数:address、dat//出口参数:无//说明:void Write_Max7219(uchar address,uchar dat){uchar i;Max7219_pinCS=0;for(i=1;i<9;i++){Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字}Max7219_pinCS=1;}void Init_MAX7219(void) //初使化7219{Write_Max7219(0x09, 0x00); //译码方式:1;BCD码,0;非BCD模式Write_Max7219(0x0a, 0x0a); //亮度0-f (0-16) Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0Write_Max7219(1,0); //清除缓冲区数据,消除显示误差Write_Max7219(2,0); //清除缓冲区数据,消除显示误差Write_Max7219(3,0); //清除缓冲区数据,消除显示误差Write_Max7219(4,0); //清除缓冲区数据,消除显示误差Write_Max7219(5,0); //清除缓冲区数据,消除显示误差Write_Max7219(6,0); //清除缓冲区数据,消除显示误差Write_Max7219(7,0); //清除缓冲区数据,消除显示误差Write_Max7219(8,0); //清除缓冲区数据,消除显示误差}/***************************************************/void Display_1(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_2(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_3(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_4(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_5(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}void Display_6(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_7(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}void Display_8(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void main(void){Init_MAX7219();Display_1(0); //1号屏显示数字0Display_2(1); //2号屏显示数字1Display_3(2); //3号屏显示数字2Display_4(3); //4号屏显示数字3Display_5(4); //5号屏显示数字4Display_6(5); //6号屏显示数字5Display_7(6); //7号屏显示数字6Display_8(7); //8号屏显示数字7while(1);}。
MAX7219与51单片机的驳接
MAX7219 是一种高集成化的串行输入/输出的共阴极LED 显示驱动器。
每片可驱动8 位7 段加小数点的共阴极数码管,可以数片级联,而与微处理器的连接只需3 根线。
MAX7219 内部设有扫描电路,除了更新显示数据时从单片
机接收数据外,平时独立工作,极大地节省了MCU 有限的运行时间和程序资源。
MAX7219 芯片上包括BCD 译码器、多位扫描电路、段驱动器、位驱动器和用于存放每个数据位的8 乘以8 静态RAM 以及数个工作寄存器。
通过指令设置这些工作寄存器,可以使MAX7219 进入不同的工作状态。
1管脚说明
图1 是MAX7219 的管脚分布图。
其中:
(1)DIN为串行数据输入端。
当CLK 为上升沿时,数据被载入16 b 内部移位寄存器。
(2)CLK为串行时钟输入端。
其最大工作频率可达10 MHz。
(3)LOAD为片选端,当LOAD 为低电平时,芯片接收来自DIN 的数据,
接收完毕,LOAD 回到高电平时,接收的数据将被锁定。
(4)DIG0~DIG7为吸收显示器共阴极电流的位驱动线。
其最大值可达500 mA,关闭状态时,输出+VCC。
(5)SEGA~SEGG,DP为驱动显示器7 段及小数点的输出电流,一般为40 mA 左右,可软件调整,关闭状态时,接入GND。
(6)DOUT为串行数据输出端,通常直接接入下一片MAX7219 的DIN 端。
Protues仿真51单片机+MAX7219循环显示0-9仿真电路代码:void delayms(unsigned int ms);//声明毫秒延时函数/********************************************************** **************I/O定义*********************************************************** **************/sbit DIN=P0^0;//MAX7219 DIN引脚sbit LOAD=P0^1;//MAX7219 Load引脚sbit CLK=P0^2; //MAX7219 CLK引脚/********************************************************** **************指令函数*********************************************************** **************/void Command(uchar add,uchar dat){uchar ADS,i,j;CLK=0;LOAD=0;DIN=0;i=4;while(i<16){if(i<8){ADS=add;}else{ADS=dat;}for(j=8;j>=1;j--){if((ADS&0x80)==0){DIN=0 ;}else{DIN=1;}ADS=ADS<<1;CLK=1;CLK=0;}i=i+8;}LOAD=1;}/********************************************************** **************主函数*********************************************************** **************/void main(void){uchar d=0;Command(0x0c,0x01);//工作模式--常规模式Command(0x0b,0x07);//扫苗模式--7个数码管Command(0x0a,0x05);//亮度模式--11/32Command(0x09,0xff);//译码模式--7段数码管while(1){for(d=0;d<10;d++){switch(d){case0:Command(0x01,0x00);Command(0x02,0x01);Command(0x03,0x02);Co mmand(0x04,0x03);Command(0x05,0x04);Command(0x06,0x05);Comm and(0x07,0x06);Command(0x08,0x07);break;case1:Command(0x01,0x01);Command(0x02,0x02);Command(0x03,0x03);Co mmand(0x04,0x04);Command(0x05,0x05);Command(0x06,0x06);Comm and(0x07,0x07);Command(0x08,0x08);break;case2:Command(0x01,0x02);Command(0x02,0x03);Command(0x03,0x04);Co mmand(0x04,0x05);Command(0x05,0x06);Command(0x06,0x07);Comm and(0x07,0x08);Command(0x08,0x09);break;case3:Command(0x01,0x03);Command(0x02,0x04);Command(0x03,0x05);Co mmand(0x04,0x06);Command(0x05,0x07);Command(0x06,0x08);Comm and(0x07,0x09);Command(0x08,0x00);break;case4:Command(0x01,0x04);Command(0x02,0x05);Command(0x03,0x06);Co mmand(0x04,0x07);Command(0x05,0x08);Command(0x06,0x09);Comm and(0x07,0x00);Command(0x08,0x01);break;case5:Command(0x01,0x05);Command(0x02,0x06);Command(0x03,0x07);Co mmand(0x04,0x08);Command(0x05,0x09);Command(0x06,0x00);Command(0x07,0x01);Command(0x08,0x02);break;case6:Command(0x01,0x06);Command(0x02,0x07);Command(0x03,0x08);Co mmand(0x04,0x09);Command(0x05,0x00);Command(0x06,0x01);Comm and(0x07,0x02);Command(0x08,0x03);break;case7:Command(0x01,0x07);Command(0x02,0x08);Command(0x03,0x09);Co mmand(0x04,0x00);Command(0x05,0x01);Command(0x06,0x02);Comm and(0x07,0x03);Command(0x08,0x04);break;case8:Command(0x01,0x08);Command(0x02,0x09);Command(0x03,0x00);Co mmand(0x04,0x01);Command(0x05,0x02);Command(0x06,0x03);Comm and(0x07,0x04);Command(0x08,0x05);break;case9:Command(0x01,0x09);Command(0x02,0x00);Command(0x03,0x01);Co mmand(0x04,0x02);Command(0x05,0x03);Command(0x06,0x04);Comm and(0x07,0x05);Command(0x08,0x06);break;default:Command(0x01,0x00);Command(0x02,0x00);Command(0x03 ,0x00);Command(0x04,0x00);Command(0x05,0x00);Command(0x06,0x0 0);Command(0x07,0x00);Command(0x08,0x00);break;}delayms(1000);}}}/********************************************************** **************毫秒延时函数*********************************************************** **************/void delayms(unsigned int ms){unsigned int i,j;for(j=0;j<ms;j++)for(i=0;i<115;i++);}。