#include <intrins.h>
#define uchar unsigned char
sbit pinDIN = P3^0//DIN 串行数据输入端口。在时钟上升沿时数据被载入内部的16位寄存器。
sbit pinLOAD = P3^1//LOAD (MAX7219) 载入数据。连续数据的后16位在LOAD端的上升沿时被锁定。
sbit pinCLK = P3^2//在时钟的上升沿, 数据移入内部移位寄存器。 下降沿时, 数据从DOUT端输出。
uchar code LEDcode[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x00 }
/*
void delay1000( void )
{
unsigned char a, b, c for ( c = 1 c > 0 c-- )
for ( b = 142 b > 0 b-- )
for ( a = 2 a > 0 a-- )
}
*/
//【增加】 延时1秒 函数
void delay1s(void) //@12MHz
{
unsigned char a,b,c
for(c=46c>0c--)
for(b=152b>0b--)
for(a=70a>0a--)
_nop_() //if Keil,require use intrins.h
}
void sendbyte( uchar dat )
{
uchar i, temp
_nop_()
for ( i = 0 i < 8 i++ )
{
temp = dat & 0x80
dat = dat << 1
if ( temp )
pinDIN = 1
else
pinDIN = 0
pinCLK = 0
_nop_()
pinCLK = 1
}
}
void sendword( uchar addr, uchar dat )
{
pinLOAD = 0
_nop_()
sendbyte( addr )
_nop_()
sendbyte( dat )
_nop_()
pinLOAD = 1
delay1000()
}
void init7219( void )
{
sendword( 0x0c, 0x01 )
sendword( 0x0a, 0x09 )
sendword( 0x0b, 0x03 )
sendword( 0x09, 0x00 )
sendword( 0x0f, 0x00 )
}
void clear7219( void )
{
uchar i for ( i = 8 i > 0 i-- )
{
sendword( i, 0x00 )
}
}
void main( void )
{
int n = 60
int s = 0
int g = 0
init7219()
while ( 1 )
{
//clear7219() //【屏蔽】不然不显示
if ( n > 0 )
{
n = n - 1
s = n / 10
g = n % 10
//LEDcode[s] //【屏蔽】
//LEDcode[g] //【屏蔽】
}
sendword( 0x01, LEDcode[s] )//【增加】显示十位数
sendword( 0x02, LEDcode[g] )//【增加】 显示个位数
delay1s()//【增加】 延时一下,不然变化太快,看不到效果
/* //【屏蔽以下语句】
sendword( 0x01, LEDcode[1] )
sendword( 0x02, LEDcode[2] | 0x80 )
sendword( 0x03, LEDcode[3] )
sendword( 0x04, LEDcode[4] )
sendword( 0x05, LEDcode[5] )
sendword( 0x06, LEDcode[6] )
sendword( 0x07, LEDcode[7] )
sendword( 0x08, LEDcode[8] )
//*/
}
}
已在protues中仿真通过。
我以前项目中用过4个max7219级联,用得比较稳定。你这个现象是因为CLK,LOAD引脚窜入了干扰信号,而7219是边沿触发,容易受到干扰。解决方法:1、可以在靠近7219芯片的地方,给CLK,DIN加101 - 104的滤波电容,效果比较明显。2、在程序中,加入抗干扰的驱动程序,定期重新配置72193、可以选用完全兼容的max7221代替亲,嗮出来的程序不够全哦,不过既然用MAX7219,那么对它的通信部分则都是一样的MAX7219 除了电源两根线之外,还需要三根信号线连接至单片机
1、使能,即用来控制MAX7219是否允许写入数据的
2、时钟、每更换一位字节数据则需要输出一个脉冲,作为时钟信号
3、数据、在脉冲有效状态下传送数据,此数据是二进制位传递,非0即1
只要对MAX7219的数据传输摆弄明白,那么久可以随意控制MAX7219驱动的电子元件了,数码管也好,LED点阵也罢,都在掌握之内
MAX7219在进行通信的时候,是需要先送地址再送数据的,就是说要传递一个数据,就要进行两次通信
打个比方,例如想把鞋子收起来,然而鞋柜却很多,那么收起鞋子的步骤只能是 先确定要放在哪里,然后再将鞋子放进去,所以MAX7219的通信原理就是这么简单
话不多说,贴出个经过硬件测试通过的程序出来,供大家参考!
这是一个利用一片MAX7219的八位数码管显示模块,程序中只是为了试验,所以只显示固定数字12-34-56,程序中的星号是各个函数之间区分用的,可以删除
#include <REG52.h>//通用89C52头文件
sbit DN=P3^7sbit CS=P3^6sbit CL=P3^5//MAX7219 端口定义
void MaxINT(void)void Max(char Xi,char Yi)void MaxR(char ch)// Max7219
void XSa(void)
/***************************************************************************/
void main(void)//主函数
{
MaxINT()// MAX7219初始化
while(1)
{
XSa() //数据显示
}
}
/***************************************************************************/
void XSa(void)//显示时钟数据
{
Max(1,6)Max(2,5)Max(3,0x0a)
Max(4,4)Max(5,3)Max(6,0x0a)
Max(7,2)Max(8,1)
}
/***************************************************************************/
void MaxINT(void)// MAX7219初始化
{
Max(0x0b,0x07)// 设置扫描界限
Max(0x09,0xff)// 设置译码模式
Max(0x0a,0x0a)// 设置亮度
Max(0x0c,0x01)// 设置工作模式
}
/***************************************************************************/
void Max(char Xi,char Yi)// Max7219 数据写入 主函数
{CS=0MaxR(Xi)MaxR(Yi)CS=1}
/***************************************************************************/
void MaxR(char ch)// Max7219 数据写入 子函数
{
char m,temp
for (m=0m<8m++)
{
temp=ch&0x80ch=ch<<1
if(temp){DN=1CL=0CL=1}
else{DN=0CL=0CL=1}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)