我的电路板采用C8051f340,利用max7219驱动4位8段数码管,可是总是点不亮!
不知道是怎么回事,请高人指点。
附显示子程序:
sbit DIN_7219=P1^5;
sbit LOAD_7219=P1^6;
sbit CLK_7219=P1^7;
void init7219(void);
void write_7219(uchar addr,uchar dat);
void displayU(int data1);
void displayD(int data2);
void init7219(void)
{
write_7219(0x0f, 0x00); // display test or no, 0 for no test.
write_7219(0x0b, 0x07); // scan limit, 7 for using all 8 LED
write_7219(0x0a, 0x0f); // brightnes, 0--f old :04
write_7219(0x09, 0xff); // decode mode, B code
write_7219(0x0c, 0x01); // stop or work, 1 for normal work status
}
void write_7219(char addr,char dat)
{
char i, j;
LOAD_7219=0;
for(i=8; i>=1; i--){
CLK_7219=0;
if(addr & 0x80) DIN_7219=1; else DIN_7219=0;//&是按位与的意思!
for(j=0;j<5;j++);
addr = addr<<1;
CLK_7219=1;
for(j=0;j<5;j++);
}
for(i=8; i>=1; i--){
CLK_7219=0;
if(dat & 0x80) DIN_7219=1; else DIN_7219=0;
dat = dat <<1;
for(j=0;j<5;j++);
CLK_7219=1;
for(j=0;j<5;j++);
}
LOAD_7219=1;
for(j=0;j<5;j++);
CLK_7219=0;
}
void displayD(int data2)
{
uchar Nstr2[5];
/*if(data2 < 0){
Nstr2[3]=0x3A;
data2 = 0 - data2;
}
else*/
Nstr2[3]=(char)(data2/1000);
Nstr2[2]=(char)((data2%1000)/100);
Nstr2[1]=(char)(((data2%1000)%100)/10);
Nstr2[0]=(char)(((data2%1000)%100)%10);
write_7219(0x04, Nstr2[3]);
write_7219(0x03, Nstr2[2]);
//write_7219(0x05,0x3A); //显示'-'号 //中间一段为G是D0控制
write_7219(0x02, Nstr2[1]); // + 0x80是为了显示小数点,小数点是D7最高位,要求赋值1.
write_7219(0x01, Nstr2[0]);
}
void displayU(int data1)
{
uchar Nstr1[5];
Nstr1[3]=(char)(data1/1000);
Nstr1[2]=(char)((data1%1000)/100);
Nstr1[1]=(char)(((data1%1000)%100)/10);
Nstr1[0]=(char)(((data1%1000)%100)%10);
write_7219(0x08, Nstr1[3]);
write_7219(0x07, Nstr1[2]);
write_7219(0x06, Nstr1[1] + 0x80); //显示小数点
write_7219(0x05, Nstr1[0]);
}
我就在主程序while里面调用displayU程序,但是电路没什么反应。
请高人指点!!
此帖出自
小平头技术问答
看了你的问题,想你是IO口模拟的SPI通讯。当问到关于时序问题时,你得先说说你的MCU工作频率多少,别人才好跟你分析。首先你确定你的电路硬件有没有接错,确定无误再分析程序问题。一般逛坛子的人很少看你的源代码,天天看一堆程序都烦了,哪有心思还分析你的程序。所以你这种直接我什么搞不定,然后贴一段程序的很少将问题得到解决。如果你有示波器,可以抓个波形分析一下问题。解决问题的关键就在于仔细阅读数据手册。max7219我以前搞过,好像坛子里面也有问这个程序的。你可以找出来看看。如果你确实需要,给你一个我测试成功的代码。51单片机外接12M晶振。
#define _7219_CS P2_1
#define _7219_MOSI P2_0
#define _7219_CLK P2_2
#define SELECTED 0
#define UNSELECTED 1
/**********************************************
* Function: void write_7219(unsigned char a, unsigned char b)
* Input Variables: unsigned char a, unsigned char b
* Return Variables: None
* Usage: Write to 7219
**********************************************/
void write_7219( unsigned char addr, unsigned char dat )
{
unsigned char i;
_7219_CS = SELECTED;
//发送地址
for(i=0;i<8;i++)
{
_7219_CLK=0; //清零时钟总线
_7219_MOSI=(bit)(addr&0x80); //每次取高字节
addr<<=1; //左移一位
_7219_CLK=1; //时钟上升沿,发送地址
}
//发送数据
for(i=0;i<8;i++)
{
_7219_CLK=0;
_7219_MOSI=(bit)(dat&0x80);
dat<<=1;
_7219_CLK=1;
}
_7219_CS = UNSELECTED;
}
/**********************************************
* Function: Init7219()
* Input Variables:void
* Return Variables: None
* Usage: Init 7219
**********************************************/
void Init7219()
{
write_7219(0x0c,0x00); // 关闭MAX7219,对7219进行配置
_nop_(); // nop
_nop_(); // nop
_nop_(); // nop
write_7219(0x0a,0x05); // 调整亮度
write_7219(0x09,0xff); // 模式设置,全部解码操作
write_7219(1,0x0f); // blank
write_7219(2,0x0f); // blank
write_7219(3,0x0f); // blank
write_7219(4,0x0f); // 四位数码全部blank
write_7219(0x0c,0x01); // 启动7219
write_7219(0x0b,0x03); // 扫描位数 4位
}
一周热门 更多>