/**************************************************
*程序名称: MAX7219 C语言控制程序
*程序功能: 3线串行控制8位共阴数码管
***************************************************/
#include
#include
sbit DIN_7219=P0^5; //7219串行数据输入端
sbit LOAD_7219=P0^6; //7219数据锁存端
sbit CLK_7219=P0^7; //7219时钟输入端
#define uchar unsigned char
uchar code LEDcode[]=
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全灭*/
/*0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,*/ }; /*A,B,C,D,E,F,P,U,全亮*/
/**************************************************
* 向MAX7219写入1字节(8位)函数 *
***************************************************/
void write_7219_byte (uchar dat)
{
uchar i,temp;
for (i=0;i<8;i++)
{
temp=dat&0x80;
dat=dat<<1;
if(temp)
DIN_7219=1;
else
DIN_7219=0;
CLK_7219=0;
_nop_();
CLK_7219=1; //时钟上升沿把数据送入寄存器锁定
}
}
/**************************************************
* 向MAX7219写入地址和控制字(16位) *
***************************************************/
void write_7219 (uchar addr,uchar dat)
{
LOAD_7219=0; //寄存器打开,等待数据的送入
_nop_();
write_7219_byte (addr); //选择寄存器地址
_nop_();
write_7219_byte (dat); //选择让芯片执行什么命令
_nop_();
LOAD_7219=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失
}
/**************************************************
* MAX7219初始化 *
***************************************************/
void init_7219 (void)
{
write_7219 (0x0c,0x01); /* 设置电源工作模式 */
write_7219 (0x0a,0x02); /* 设置亮度(19/32,根据需要增减)*/
write_7219 (0x0b,0x03); /* 设置扫描界限(根据需要增减) */
write_7219 (0x09,0x00); /* 设置译码模式(00不译,FF译) */
write_7219 (0x0f,0x00); /* 显示测试(00为正常工作状态) */
}
/**************************************************
* MAX7219清除显示 *
***************************************************/
void clear_7219(void)
{
uchar i; //变量i,用来选择数码管位选
for(i=8;i>0;i--) //i自减,选择完所有的8位
{
write_7219(i,0x00); //对应位选的段全部清除显示
}
}
/**************************************************
* MAX7219主函数 *
***************************************************/
void main(void)
{
init_7219 (); //MAX7219初始化
clear_7219(); //MAX7219清除显示,免去干扰
while(1)
{
write_7219(0x01,LEDcode[5]); //扫描第一位(LSB),并送段码显示
write_7219(0x02,LEDcode[5]|0x80); //扫描第二位,并送段码显示,同时加显小数点2| 0x80 如果不加小数点就去掉|0x80
write_7219(0x03,LEDcode[5]); //扫描第三位,并送段码显示
write_7219(0x04,LEDcode[5]); //扫描第四位,并送段码显示
// write_7219(0x05,LEDcode[5]); //扫描第五位,并送段码显示
// write_7219(0x06,LEDcode[6]); //扫描第六位,并送段码显示
// write_7219(0x07,LEDcode[7]); //扫描第七位,并送段码显示
// write_7219(0x08,LEDcode[8]); //扫描第八位(MSB),并送段码显示
}
}