MAX7219驱动数码管无法正常显示
用max7219驱动六个七端数码管,上电全显示8,接上单片机的数据线或者不接都显示为8;手在附近晃动会引起数码管显示乱码,。程序在Proteus中仿真时正常,求各位高手帮...
用max7219驱动六个七端数码管,上电全显示8,接上单片机的数据线或者不接都显示为8;手在附近晃动会引起数码管显示乱码,。程序在Proteus中仿真时正常,求各位高手帮忙解决问题。程序如下:
#include<reg52.h>
#include<intrins.h>
/****************************************************************/
//引脚连接,
sbit DIN = P1^0 ;
sbit CLK = P1^2 ;
sbit LOAD= P1^1 ;
/***************************************************************/
typedef unsigned char uchar;
typedef unsigned int uint;
//BCD decode for 0~9,blank
code uchar Seg[]={0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xff};
//code uchar Seg[]={0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
//延时约1m秒,晶振是11.592
void delay(uint n)
{
uchar j;
while(n--)
for(j=0;j<120;j++);
}
//向7219发送一char型数据
void SendChar(uchar CharData)
{
uchar ii;
for (ii=0;ii<8;ii++){//8个时钟
CLK = 0;
if(((CharData<<ii)&0x80)==0x80)
DIN=1;
else
DIN=0;
CLK=1;
}
}
//向7219中发送多个串数据
void SendAddrDataMulti(uchar Addr,uchar Data)
{
LOAD=0;
_nop_();
SendChar(Addr);
_nop_();
SendChar(Data);
_nop_();
LOAD=1;
_nop_();
}
//向7219发送一十六位的数据
void SendAddrDataSingle(uchar Addr,uchar Data)
{
SendChar(Addr);
_nop_();
SendChar(Data);
_nop_();
}
//初始化所有的器件
void InitAllComponents(void)
{
SendAddrDataMulti(0xf9,0xff); //set decode mode ,Code B Decode for digits 0~7
SendAddrDataMulti(0xfa,0x0f); //set intensity to the max
SendAddrDataMulti(0xfb,0xf1); //set scan limit register format for display 0~7
SendAddrDataMulti(0xfc,0xf1); //set the 7219 to Normal Operation .1--normal operation,0-hutdown
SendAddrDataMulti(0xff,0x00); //set to display; 1-test mode,0-normal mode
}
//向7219中写入数据
void WriteData2Comp()
{
uchar i=0;
for (i=0;i<9;i++)
{
LOAD=0;
delay(10);
SendAddrDataSingle(i,Seg[i+1]);
delay(10);
LOAD=1;
}
}
void main()
{
uchar DataTemp=0;
uchar i=8;
delay(500);//延时让电源稳定
InitAllComponents();
WriteData2Comp();
while(1);
} 展开
#include<reg52.h>
#include<intrins.h>
/****************************************************************/
//引脚连接,
sbit DIN = P1^0 ;
sbit CLK = P1^2 ;
sbit LOAD= P1^1 ;
/***************************************************************/
typedef unsigned char uchar;
typedef unsigned int uint;
//BCD decode for 0~9,blank
code uchar Seg[]={0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xff};
//code uchar Seg[]={0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
//延时约1m秒,晶振是11.592
void delay(uint n)
{
uchar j;
while(n--)
for(j=0;j<120;j++);
}
//向7219发送一char型数据
void SendChar(uchar CharData)
{
uchar ii;
for (ii=0;ii<8;ii++){//8个时钟
CLK = 0;
if(((CharData<<ii)&0x80)==0x80)
DIN=1;
else
DIN=0;
CLK=1;
}
}
//向7219中发送多个串数据
void SendAddrDataMulti(uchar Addr,uchar Data)
{
LOAD=0;
_nop_();
SendChar(Addr);
_nop_();
SendChar(Data);
_nop_();
LOAD=1;
_nop_();
}
//向7219发送一十六位的数据
void SendAddrDataSingle(uchar Addr,uchar Data)
{
SendChar(Addr);
_nop_();
SendChar(Data);
_nop_();
}
//初始化所有的器件
void InitAllComponents(void)
{
SendAddrDataMulti(0xf9,0xff); //set decode mode ,Code B Decode for digits 0~7
SendAddrDataMulti(0xfa,0x0f); //set intensity to the max
SendAddrDataMulti(0xfb,0xf1); //set scan limit register format for display 0~7
SendAddrDataMulti(0xfc,0xf1); //set the 7219 to Normal Operation .1--normal operation,0-hutdown
SendAddrDataMulti(0xff,0x00); //set to display; 1-test mode,0-normal mode
}
//向7219中写入数据
void WriteData2Comp()
{
uchar i=0;
for (i=0;i<9;i++)
{
LOAD=0;
delay(10);
SendAddrDataSingle(i,Seg[i+1]);
delay(10);
LOAD=1;
}
}
void main()
{
uchar DataTemp=0;
uchar i=8;
delay(500);//延时让电源稳定
InitAllComponents();
WriteData2Comp();
while(1);
} 展开
3个回答
展开全部
下载我的看看好使不
#define <reg51.h>
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
/*******************************/
sbit LOAD=P1^1;
sbit DIN=P1^0;
sbit CLK=P1^2;
/*******************************/
void Write_Max7219_byte(uchar temp)
{
uchar i;
for (i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(temp&0x80);
temp<<=1;
CLK=1;
}
}
/*******************************/
void Write_Max7219(uchar address,uchar dat)
{
LOAD=0;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
LOAD=1;
}
/*******************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN, 0x01); //设置掉电模式
Write_Max7219(DISPLAY_TEST, 0x00); //设置不工作寄存器
Write_Max7219(DECODE_MODE, 0x09); //设置编码模式
Write_Max7219(SCAN_LIMIT, 0x06); //扫描控制寄存器
Write_Max7219(INTENSITY, 0x04); //设置亮度调节 0xX0~0xXf
}
/*******************************/
void main()
{
unsigned char ii;
Init_Max7219();
for(ii=1;ii<8;ii++)
{
Write_Max7219(ii,ii);
}
while(1);
}
#define <reg51.h>
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
/*******************************/
sbit LOAD=P1^1;
sbit DIN=P1^0;
sbit CLK=P1^2;
/*******************************/
void Write_Max7219_byte(uchar temp)
{
uchar i;
for (i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(temp&0x80);
temp<<=1;
CLK=1;
}
}
/*******************************/
void Write_Max7219(uchar address,uchar dat)
{
LOAD=0;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
LOAD=1;
}
/*******************************/
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN, 0x01); //设置掉电模式
Write_Max7219(DISPLAY_TEST, 0x00); //设置不工作寄存器
Write_Max7219(DECODE_MODE, 0x09); //设置编码模式
Write_Max7219(SCAN_LIMIT, 0x06); //扫描控制寄存器
Write_Max7219(INTENSITY, 0x04); //设置亮度调节 0xX0~0xXf
}
/*******************************/
void main()
{
unsigned char ii;
Init_Max7219();
for(ii=1;ii<8;ii++)
{
Write_Max7219(ii,ii);
}
while(1);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-04-10
展开全部
7219因为是串行的很容易受干扰
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-04-07
展开全部
这个可能是你硬件的问题。
你在CLK和DATA线上加103的电容试试
你在CLK和DATA线上加103的电容试试
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询