/*******************************************************************************
* 文件名: MAX7219_Drive_Matrix.c
* 作 者: Robbie
* 日 期: 13-September-2017
* 摘 要: 本程序实现MAX7219点亮点阵二极管功能
********************************************************************************/
#include <REG51.H>
#include <intrins.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int
//位变量定义
sbit DIN = P2^0;
sbit LOAD = P2^1;
sbit CLK = P2^2;
/*********************全局变量定义************************/
//定义位码数组,扫描位码寄存器:数字0~数字7
uint code DIG_Array[]=
{0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,0x0800};
//定义显示数字‘1’段码数组
uchar code Seg1_Array[]=
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08};
//定义显示数字‘2’段码数组
uchar idata Seg2_Array[]= //片内256字节区域存储数据,code区域只能存放常量,data区域存储空间太小
{0x00,0x3C,0x42,0x04,0x08,0x10,0x20,0x7E};
/********************函数声明********************/
void Send_LED(uint); //向MAX7219发送数据
void MAX7219_Init(void); //MAX7219初始化
void Clr(void); //MAX7219清空
void Matrix_Scroll(uint*,uchar*); //向右显示滚动字符
void DelayMS(uint); //延时以毫秒计
/********************函数定义********************/
void main()
{
MAX7219_Init(); //初始化
Clr(); //清空数字寄存器
//显示滚动文字
while(1)
{
Matrix_Scroll(DIG_Array,Seg2_Array);
}
}
/***************************************************************************
**函 数 名:MAX7219发送函数
**函数功能:向MAX7219串行发送命令或数据,先发送高位,再发送低位
**输 入:待发送16位数据
**输 出: 无
**硬件连接:P2.0->DIN,P2.1->LOAD,P2.2->CLK
****************************************************************************/
void Send_LED(uint n)
{
uint i;
LOAD = 0; //载入数据引脚复位
//向DIN引脚传送16位数据,传送数据先送高位
for(i=0x8000; i>=0x0001; i>>=1)
{
CLK = 0;
if((n&i)==0){DIN = 0;}
else{DIN = 1;}
CLK = 1;
}
LOAD = 1; //载入数据引脚上升沿,将16位数据锁存
}
/***************************************************************************
**函 数 名:MAX7219初始化函数
**函数功能:MAX7219进行初始化配置
**输 入:无
**输 出: 无
**硬件连接:P2.0->DIN,P2.1->LOAD,P2.2->CLK
****************************************************************************/
void MAX7219_Init()
{
Send_LED(0x0c01); //停机寄存器正常
Send_LED(0x0A0f); //设置亮度
Send_LED(0x0b07); //设置LED扫描范围,DIG0~7
Send_LED(0x0900); //设置为不译码方式
}
/***************************************************************************
**函 数 名:MAX7219清空函数
**函数功能:将MAX7219数字0~7寄存器的段码值清空
**输 入:无
**输 出: 无
**硬件连接:P2.0->DIN,P2.1->LOAD,P2.2->CLK
****************************************************************************/
void Clr()
{
uint i;
for(i=0x0800; i>=0x0100; i-=0x0100)
{
Send_LED(i);
}
}
/***************************************************************************
**函 数 名:点阵滚动函数
**函数功能:在点阵屏上向右滚动显示指定段码
**输 入:段码数组
**输 出: 无
**硬件连接:P2.0->DIN,P2.1->LOAD,P2.2->CLK
****************************************************************************/
void Matrix_Scroll(uint* dig_array,uchar* seg_array)
{
uchar i,j;
for(j=0; j<8; j++)
{
for(i=0; i<8; i++)
{
Send_LED(dig_array|seg_array);
seg_array=_cror_(seg_array,1); //段码数组循环右移1位
}
DelayMS(150); //延时200ms
}
}
/***************************************************************************
**函 数 名:延时函数
**函数功能:延时指定毫秒数
**输 入:待延时毫秒数
**输 出: 无
**硬件连接:无
****************************************************************************/
void DelayMS(uint ms) [url=]//@11.0592MHz[/url]
{
uint i=0,j=0;
for(i=0; i<ms; i++)
for(j=0;j<123;j++);
}
|