找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1978|回复: 0
打印 上一主题 下一主题
收起左侧

STC12C5A60S2单片机+MAX7219程序与详细文本资料

[复制链接]
跳转到指定楼层
楼主
ID:553399 发表于 2020-4-29 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

单片机的学习可以分为几个阶段:单片机的I/O口的学习、单片机内部的资源(定时器、中断、串口驱动等等)的学习和常用外围器件的驱动程序等等几个步骤。之后你就可以用所学过的东西作些项目了。这里作者主要介绍单片机常用外围器件的驱动以及简单应用,并陆续介绍了几种通用串行总线的驱动方法。

总结

1 MAX7219 简介

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显示。

5 MAX7219的扫描界限控制寄存器

(3)        亮度控制寄存器(XAH)

共有16级可选择,用于设置LED的显示亮度,从0xX0~0xXF

(4)        关断模式寄存器(XCH)

共有两种模式选择,一是关断状态,(最低位 D0=0)一是正常工作状态(D0=1)。

(5)        显示测试寄存器(XFH)

用于设置LED是测试状态还是正常工作状态,当测试状态时(最低位 D0=1)各位显示全亮,正常工作状态(D0=0)。

各寄存器具体操作见驱动程序详解。

2 读写时序说明

MAX7129是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

       要想与MAX7129通信,首先要先了解MAX7129的控制字。MAX7129的控制字格式如6

6 控制字(即地址及命令字节)

如图,工作时,MAX7219规定一次接收16位数据,在接收的16位数据中:D15~D12可以与操作无关,可以任意写入,D11~D8决定所选通的内部寄存器地址,D7~D0为待显示数据或是初始化控制字。在CLK脉冲作用下,DIN的数据以串行方式依次移入内部16位寄存器,然后在一个LOAD上升沿作用下,锁存到内部的寄存器中。注意在接收时,先接收最高位D16,最后是D0,因此,在程序发送时必须先送高位数据,在循环移位。工作时序图见7

由于51是8位单片机故需要分两次来送数据。具体操作见驱动程序详解。

图7  数据读写时序

驱动程序
//管脚定义
sbit LOAD=P2^1;          //MAX7219片选           12脚
sbit DIN=P2^0;           //MAX7219串行数据       1脚
sbit CLK=P2^2;           //MAX7219串行时钟        13脚
//寄存器宏定义
#define DECODE_MODE  0x09   //译码控制寄存器
#define INTENSITY    0x0A   //亮度控制寄存器
#define SCAN_LIMIT   0x0B   //扫描界限寄存器
#define SHUT_DOWN    0x0C   //关断模式寄存器
#define DISPLAY_TEST 0x0F   //测试控制寄存器        
//函数声明
void Write7219(unsigned char address,unsigned char dat);
void Initial(void);




//地址、数据发送子程序
void Write7219(unsigned char address,unsigned char dat)
{  
unsigned char i;
ACC=address;
    LOAD=0;    //拉低片选线,选中器件
    //发送地址
    for (i=0;i<8;i++)        //移位循环8次            
    {  
       CLK=0;        //清零时钟总线
       DIN=A7;   //每次取最高位 送max7219  
CLK=1;        //时钟上升沿,发送地址  
       address<<=1;             //左移一位
      
    }
//发送数据
ACC=dat;
    for (i=0;i<8;i++)              
    {  
       CLK=0;
       DIN=A7;
       dat<<=1;
       CLK=1;        //时钟上升沿,发送数据
    }
    LOAD=1;    //发送结束,上升沿锁存数据                     
}

//MAX7219初始化,设置MAX7219内部的控制寄存器
void Initial(void)               
{
    Write7219(SHUT_DOWN,0x01);         //开启正常工作模式(0xX1)
    Write7219(DISPLAY_TEST,0x00);      //选择工作模式(0xX0)
    Write7219(DECODE_MODE,0x00);       //选用不译码模式
    Write7219(SCAN_LIMIT,0x07);         //8只LED全用
    Write7219(INTENSITY,0x04);          //设置初始亮度     
}


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<max7219.h>


  3. /*-------------------------------------------------
  4.         此函数是向MAX7219写数据(操作字或者显示数据)
  5.                 address是内部寄存器的地址;
  6.                 dat是操作字或者显示的数据
  7. -------------------------------------------------*/
  8. void Write_7219(uchar address,uchar dat)
  9. {    uchar i;
  10.         ACC=address;
  11.     LOAD=0;                                    //拉低片选线,选中器件
  12.                                                     //发送地址
  13.     for (i=0;i<8;i++)           //移位循环8次              
  14.             {   
  15.               CLK=0;                        //清零时钟总线
  16.                DIN=A7;                           //每次取最高位 送max7219  
  17.                     CLK=1;                        //时钟上升沿,发送地址   
  18.                address<<=1;             //左移一位      
  19.             }
  20.                                                         //发送数据
  21.         ACC=dat;
  22.     for (i=0;i<8;i++)               
  23.             {   
  24.                CLK=0;
  25.                DIN=A7;  
  26.                CLK=1;                        //时钟上升沿,发送数据
  27.                    dat<<=1;
  28.                     }
  29.     LOAD=1;                                    //发送结束,上升沿锁存数据                       
  30. }
  31. /*-------------------------------------------------
  32.         这个是MAX7219的初始化程序
  33.         DECODE_MODE  0x09   //译码控制寄存器
  34.         INTENSITY    0x0A   //亮度控制寄存器
  35.         SCAN_LIMIT   0x0B   //扫描界限寄存器
  36.         SHUT_DOWN    0x0C   //关断模式寄存器
  37.         DISPLAY_TEST 0x0F   //测试控制寄存器
  38. -------------------------------------------------*/
  39. void Init_7219(void)                 
  40. {
  41.     Write_7219(SHUT_DOWN,0x01);                 //开启正常工作模式(0xX1)
  42.     Write_7219(DISPLAY_TEST,0x00);              //选择工作模式(0xX0)
  43.     Write_7219(DECODE_MODE,0x00);               //选用不译码模式
  44.     Write_7219(SCAN_LIMIT,0x07);                //8只LED全用
  45.     Write_7219(INTENSITY,0x04);                 //设置初始亮度      
  46. }

  47. /*
  48. void mul_write_7219( uchar *point)                        //写多个数据
  49. {
  50. uchar i;


  51. for (i=0;i<8;i++)
  52. {
  53.   Write_7219(i+1,*point);
  54.   point++;                  
  55.   }
  56.   
  57.   }
  58. */
复制代码

全部资料51hei下载地址:
MAX7219、STC12C5A60S2 资料.7z (165.28 KB, 下载次数: 30)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表