7.5.2 Scan Limit 扫描限制寄存器 该寄存器所在地址为0xB(D15~D12设置为0)
该寄存器的主要功能是设置扫描数码管的个数(范围)。
当我们向该地址写数据0x00,则MAX7219只扫描第0个数码管,其他数码管将呈灰色,即不工作,这样达到降低功耗的作用。
7.5.3 Shutdown 关断模式寄存器 该寄存器所在地址为0xC(D15~D12设置为0),主要功能是为了在不需要数码管显示的时候方便进入省电模式。
当向该地址写0x00,则MAX7219进去shutdown模式;
当向该地址写0x01,则MAX7219进去正常操作模式;
7.6 MAX7219驱动4个数码管源代码
/*******************************************************************************
*文件名:digit_led.c
*功能:数码管显示程序
*作者:parson
*创建日期:2010-05-01
*版本:Ver10.05
*版权:ShangHai Somy Technology LTD.
*********************************************************************************/
#include "config.h"
#define CS 1 << 5 //选择P0.5作为CS
#define DI 0x1 << 6 //选择P0.6作为数据输入
#define CLK 0x1 << 7 //选择P0.7作为时钟
#define DECODE_MODE 0x09 //译码控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN_LIMIT 0x0B //扫描界限寄存器
#define SHUT_DOWN 0x0C //关断模式寄存器
#define DISPLAY_TEST 0x0F //测试控制寄存器
void Write7219(uint8 address,uint8 dat);
/*******************************************************************************
*函数名Init_Max7219
*功能:MAX7219 初始化,设置MAX7219 内部的控制寄存器
*参数:无
*返回值:无
********************************************************************************/
void Init_Max7219(void)
{
Write7219(SHUT_DOWN,0x01);// 开启正常工作模式(0xX1)
Write7219(DISPLAY_TEST,0x00);// 选择测试模式(0xff)
Write7219(DECODE_MODE,0xf);//选用CODEB 0-3
Write7219(SCAN_LIMIT,0x03);//选择0-3
Write7219(INTENSITY,0x04);//设置初始亮度
//Write7219(DISPLAY_TEST,0x00);// 选择工作模式(0xX0)
}
/*******************************************************************************
*函数名delay
*功能:延时
*参数 time:要延时的时间
*返回值:无
********************************************************************************/
void delay(uint32 time)
{
int i;
for(i=0;i<time;i++);
}
/*******************************************************************************
*函数名Write7219
*功能:地址、数据发送子程序
*参数 :无
*返回值:无
********************************************************************************/
void Write7219(uint8 address,uint8 dat)
{
uint8 i;
IO0CLR = CS; // 拉低片选线, 选中器件
for (i=0;i<8;i++) // 移位循环8 次
{
IO0CLR = CLK; // 清零时钟总线
if( (address &0x80))// 每次取高字节
IO0SET = DI;
else
IO0CLR = DI;
address <<=1; // 左移一位
IO0SET = CLK; // 时钟上升沿,发送地址
}
for (i=0;i<8;i++)
{
IO0CLR = CLK;
if( (dat&0x80))
IO0SET = DI;
else
IO0CLR = DI;
dat <<=1;
IO0SET = CLK;
}
IO0SET = CS; // 发送结束,上升沿锁存数据
}
/*******************************************************************************
*函数名init_system
*功能:初始化CS | DI | CLK,并使CS | DI | CLK初始状态为高
*参数 :无
*返回值:无
********************************************************************************/
void init_system()
{
//PINSEL0 = PINSEL0 & ;
IO0DIR = CS | DI | CLK;
IO0SET = CS | DI | CLK;
}
/*********************************************************************************
*函数名main
*功能:4个数码管同时显示"0","1","2","3","4","5","6","7","8","9","-","E","H","L","P","不显示",
*参数:无
*返回值:0(int类型)
*********************************************************************************/
int main (void)
{
uint8 i;
init_system();
Init_Max7219();
while(1)
{
for(i=0;i<0xf;i++){
Write7219(1,i); // 第一个数码管(从右到左)
delay(0x800000);
Write7219(2,i); //
delay(0x800000);
Write7219(3,i); //
delay(0x800000);
Write7219(4,i); //
delay(0x800000);
}
}
return 0;
}
7.7独立完成No decode程序设计 如果,MAX7219的控制原理理解了,上面的例程也运行成功了。还剩下No code解码模式的代码还没有实现,这部分留给各位自己完成。 |