搜索
bottom↓
回复: 11

求助求助啊~~~~51单片机接max7219接数码管无论怎么搞都不亮!

[复制链接]

出0入0汤圆

发表于 2013-3-13 16:50:58 | 显示全部楼层 |阅读模式
跪求大神了................................搞了好几天都不知道问题出在哪,现在开始怀疑是芯片坏了...............
单片机是c8051f020,用p3.5,,p3.6,p3.7端口,设置为漏极开路,外面接5v上拉电阻后输入到max7219(单片机3.3v供电,7219要求>=3.5v),7219的D0-D3接了4个数码管,段选也都接对了,电阻RSET=12K。
程序如下:
#define sysclk 8000000
#define sar_rate 2000000

#define DECODE_MODE 0x09
#define        INTENSITY 0x0A
#define        SCAN_LIMIT 0x0B
#define        SHUTDOWN 0x0C
#define        DISPLAY_TEST 0x0F
#define Digit0 0x01
#define Digit1 0x02
#define Digit2 0x03
#define Digit3 0x04
#define Digit4 0x05
#define Digit5 0x06
#define Digit6 0x07
#define Digit7 0x08

#define uchar unsigned char


#include <c8051f020.h>


sbit LOAD=P3^5;
sbit DIN=P3^6;
sbit CLK=P3^7;

sfr16 RCAP2    = 0xca;
sfr16 TMR2     = 0xcc;
sfr16 ADC0     = 0xbe;
sfr16 TMR3RL   = 0x92;
sfr16 TMR3     = 0x94;

void Osc_init(void);
void Port_init(void);
void ADC0_init(void);
void Wait_ms(int ms);
void Tmr3_init(void);
void Write_7219(uchar address,uchar dat);
void Init_7219(void);
void Display(uchar left);
void ADC0_ISR(void);


头文件直接都弄上来了,本来还要用到其他资源,但是显示模块都没出来,蛋疼了....

下面是7219的测试程序:

#include <process.h>


void main(void)
{
        WDTCN=0xde;
        WDTCN=0xad;
       
        Osc_init();
        Port_init();
        Init_7219();
        Display(90);
}


void Osc_init(void)
{
/*        int i;
        OSCXCN=0x67;
        for(i=0;i<8000;i++);
        while(!(OSCXCN&0x80));
        OSCICN=0x88;  */
        OSCICN=0x96;
}

void Port_init(void)
{
//        P1MDIN=0x00;
//        P3MDOUT=0x07;
        XBR2=0xC0;
}

void Write_7219 (uchar address,uchar dat)
{
        uchar i;
        LOAD=0;

        for (i=0;i<8;i++)
        {
                CLK=0;
                DIN=(bit)(address&0x80);
                address<<=1;
                CLK=1;
        }

        for (i=0;i<8;i++)
        {
                CLK=0;
                DIN=(bit)(dat&0x80);
                dat<<=1;
                CLK=1;
        }
       
        LOAD=1;
}


void Init_7219(void)
{
       
        Write_7219(SHUTDOWN,0x01);
        Write_7219(SCAN_LIMIT,0x03);   //<4需要改变RSET值。         RSET>=9.53K
        Write_7219(INTENSITY,0x07);
        Write_7219(DECODE_MODE,0x0f);
        Write_7219(DISPLAY_TEST,0x00);
}



void Display(uchar left)
{
        uchar bai=0,shi=0,ge=0;
        if(left<10)
        {
                Write_7219(SCAN_LIMIT,0x00);
                while(1)
                {
                       
                        Write_7219(0x01,left);
               
                }
        }

        else if(left<100&&left>=10)
        {
                shi=left/10;
                ge=left-10*shi;

                Write_7219(SCAN_LIMIT,0x01);
                while(1)
                {
               
                        Write_7219(Digit1,shi);
                        Write_7219(Digit0,ge);
               
                }
        }

        else if(left<=180&&left>=100)
        {
                bai=left/100;
                shi=(left-100*bai)/10;
                ge=left%10;
               
                Write_7219(SCAN_LIMIT,0x02);
                while(1)
                {
               
                        Write_7219(Digit2,bai);
                        Write_7219(Digit1,shi);
                        Write_7219(Digit0,ge);
               
                }
        }

        else
        {
                Write_7219(SCAN_LIMIT,0x03);
                while(1)
                {
               
                        Write_7219(Digit7,0x0A);
                        Write_7219(Digit6,0x0A);
                        Write_7219(Digit5,0x0A);
                        Write_7219(Digit4,0x0A);
                        Write_7219(Digit3,0x0A);
                        Write_7219(Digit2,0x0A);
                        Write_7219(Digit1,0x0A);
                        Write_7219(Digit0,0x0A);
                       
                }
        }
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-3-13 22:45:08 | 显示全部楼层
你的C代码我看不大懂
不过可以给你一个思路:
你先熟悉一下7219的时序

出0入0汤圆

 楼主| 发表于 2013-3-13 22:54:11 | 显示全部楼层
lxa0 发表于 2013-3-13 22:45
你的C代码我看不大懂
不过可以给你一个思路:
你先熟悉一下7219的时序

在write_7219那个函数里,我先把load拉低,然后在第一个送地址的循环里,先把clk拉低,然后送地址最高位给din,然后clk拉高,循环8次,之后是送数据,也是循环8次,最后把load拉高,这个时序应该没错吧???

出0入0汤圆

发表于 2013-3-13 23:05:53 | 显示全部楼层
杜邦线接7219的话容易显示出错

出0入0汤圆

 楼主| 发表于 2013-3-13 23:13:50 | 显示全部楼层
tbkmcjl 发表于 2013-3-13 23:05
杜邦线接7219的话容易显示出错

是杜邦线....不过我在线调试的时候,用万用表测din,clk,load引脚,单步执行,确实是按照这个时序的,最后还是什么也不显示,怀疑是不是没有写进去啊,如果写进去,起码测试模式能全亮的啊.....

出0入0汤圆

发表于 2013-3-14 20:45:32 | 显示全部楼层
yfx199096 发表于 2013-3-13 22:54
在write_7219那个函数里,我先把load拉低,然后在第一个送地址的循环里,先把clk拉低,然后送地址最高位 ...

时序没错的话
那多半就是7219复位的问题了

出0入0汤圆

 楼主| 发表于 2013-3-15 07:26:18 | 显示全部楼层
复位问题?不太懂啊,昨天已经用最简单的直接动态扫描重新做了一个......

出0入0汤圆

 楼主| 发表于 2013-3-15 07:26:42 | 显示全部楼层
lxa0 发表于 2013-3-14 20:45
时序没错的话
那多半就是7219复位的问题了

复位问题?不太懂啊,昨天已经用最简单的直接动态扫描重新做了一个......

出0入0汤圆

发表于 2013-3-15 19:51:19 | 显示全部楼层
yfx199096 发表于 2013-3-15 07:26
复位问题?不太懂啊,昨天已经用最简单的直接动态扫描重新做了一个...... ...

用单片机去复位7219
类似的还有8155/8255
也有这样的问题

出0入0汤圆

发表于 2014-2-19 13:02:02 | 显示全部楼层
芯片正负之间必须加个0.1的小电容

出0入0汤圆

发表于 2014-2-25 17:59:02 | 显示全部楼层
单片机IO设置为漏极开路的话需要加外部上拉电阻.

出0入0汤圆

发表于 2014-3-17 00:02:14 | 显示全部楼层
严重同意10楼!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表