/*******************************************************************************
* 文件名: 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字節(jié)區(qū)域存儲數據,code區(qū)域只能存放常量,data區(qū)域存儲空間太小
{0x00,0x3C,0x42,0x04,0x08,0x10,0x20,0x7E};
/********************函數聲明********************/
void Send_LED(uint); //向MAX7219發(fā)送數據
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發(fā)送函數
**函數功能:向MAX7219串行發(fā)送命令或數據,先發(fā)送高位,再發(fā)送低位
**輸 入:待發(fā)送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); //段碼數組循環(huán)右移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++);
}
|