打印
[PIC®/AVR®/dsPIC®产品]

max7219驱动问题

[复制链接]
1205|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinwe|  楼主 | 2019-10-24 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用877a驱动时,好像有时初始化不成功,出现全亮或随机亮的情况。多次开关电源后又正常了,相同的代码用Arduino测试就没这个问题?请问是初始化没成功吗?谢谢了!

微信图片_201910242043431.jpg (479.29 KB )

正常

正常

微信图片_20191024204343.jpg (483.1 KB )

不正常

不正常

使用特权

评论回复
沙发
lcczg| | 2019-10-25 11:17 | 只看该作者
看看SPI的初始化,看看SPI的波形,看看发送的命令串。。。

使用特权

评论回复
板凳
antusheng| | 2019-10-25 11:28 | 只看该作者
代码质量问题。跟单片机 无关

使用特权

评论回复
地板
antusheng| | 2019-10-25 11:49 | 只看该作者
应该是你初始化的代码不科学

使用特权

评论回复
5
antusheng| | 2019-10-25 11:50 | 只看该作者
比如检测忙,检测完了吗
你用Arduino操作,那是调用的库函数,人家那是经过千锤百炼的代码,肯定靠谱多了

使用特权

评论回复
6
jinwe|  楼主 | 2019-10-25 13:33 | 只看该作者
antusheng 发表于 2019-10-25 11:50
比如检测忙,检测完了吗
你用Arduino操作,那是调用的库函数,人家那是经过千锤百炼的代码,肯定靠谱多了 ...

用arduino也是用的相同的代码,没有用库。

使用特权

评论回复
7
jinwe|  楼主 | 2019-10-25 13:34 | 只看该作者
antusheng 发表于 2019-10-25 11:49
应该是你初始化的代码不科学

//---------------------------------------------------------------------
//初始化芯片
//---------------------------------------------------------------------
void Init_MAX7219(void)
{
  for(int i=0;i<LED_Count;i++)
  {
    Write_Max7219(0x09, 0x00); // 译码方式:不译码      
    Write_Max7219(0x0a, 0x00); // 亮度:0-F   
    Write_Max7219(0x0b, 0x07); // 扫描界限;8个数码管显示  
    Write_Max7219(0x0c, 0x01); // 掉电模式:0,普通模式:1         
    Write_Max7219(0x0f, 0x00); // 显示测试:1;测试结束,正常显示:0
  }
}

使用特权

评论回复
8
CoolSilicon| | 2019-10-25 14:06 | 只看该作者
你用到的RAM是不是没有赋初值?

使用特权

评论回复
9
jinwe|  楼主 | 2019-10-25 19:30 | 只看该作者
CoolSilicon 发表于 2019-10-25 14:06
你用到的RAM是不是没有赋初值?

是端口吗?赋值了。有时多开关几次就好了,有时一次开就正常,就是不稳定,应该脉冲时间是满足了的,手册上的时间都是ns记的,pic的时间周期应该有us吧,4M的晶振。

使用特权

评论回复
10
jinwe|  楼主 | 2019-10-25 19:32 | 只看该作者
用的是877A的RB口,要上拉吗?我用10K的上拉了也好像也是一样的

使用特权

评论回复
11
CoolSilicon| | 2019-10-28 09:53 | 只看该作者
jinwe 发表于 2019-10-25 19:30
是端口吗?赋值了。有时多开关几次就好了,有时一次开就正常,就是不稳定,应该脉冲时间是满足了的,手册 ...

1是数据可能没有初始化
2是可能写入的数据时候被打断了..

这个屏看起来是8块数据的, 前5块一直都是正常的?
写入整个数据区前关一下中断, 写完了再开中断试试?

使用特权

评论回复
12
jinwe|  楼主 | 2019-10-28 22:25 | 只看该作者
CoolSilicon 发表于 2019-10-28 09:53
1是数据可能没有初始化
2是可能写入的数据时候被打断了..

出问题的时候是不定是哪几块不行,随机的。

使用特权

评论回复
13
zhuotuzi| | 2019-10-31 20:22 | 只看该作者
跟屏有关还是跟7219有关

使用特权

评论回复
14
gaoyang9992006| | 2019-10-31 20:58 | 只看该作者
#include"reg51.h"
sbit LOAD=P2^1; //MAX7219片选   12脚
sbit DIN=P2^0; //MAX7219串行数据 1脚
sbit CLK=P2^2;//MAX7219串行时钟 13脚
sbit k1=P2^5;
sbit k2=P2^6;
sbit k3=P2^7;
//寄存器宏定义
#define DECODE_MODE 0x09       //译码控制寄存器
#define INTENSITY 0x0A        //亮度控制寄存器
#define SCAN_LIMIT 0x0B      //扫描界限寄存器
#define SHUT_DOWN 0x0C      //关断模式寄存器
#define DISPLAY_TEST 0x0F  //测试控制寄存器

//定义全局变量
unsigned char hour=0,minute=0,second=0,time=0,delaytime=0;
unsigned char code value[]={0,1,2,3,4,5,6,7,8,9};


//函数声明
void Write7219(unsigned char address,unsigned char dat);
void Initial(void);
void Key(void);

void delay(void);

//下面开始使用定时器进行延时。

void delay()
  {
    delaytime=0;    // 初始化延时变量。
while(delaytime<5);

  }

//地址、数据发送子程序
void Write7219(unsigned char address,unsigned char dat)
{
unsigned char i;
LOAD=0;            //拉低片选线,选中器件
                  //发送地址
for (i=0;i<8;i++)//移位循环8次
{
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;//发送结束,上升沿锁存数据
}


//MAX7219初始化,设置MAX7219内部的控制寄存器
void Initial(void)
{
Write7219(SHUT_DOWN,0x01);     //开启正常工作模式(0xX1)
Write7219(DISPLAY_TEST,0x00); //选择工作模式(0xX0)
Write7219(DECODE_MODE,0xff); //选用全译码模式
Write7219(SCAN_LIMIT,0x07); //8只LED全用
Write7219(INTENSITY,0x04); //设置初始亮度
}
//按键程序
void Key(void)
{
if(P2&0xE0==0xE0)  continue;//如果没有按下任何按键就跳出去,否者执行下面的按键操作,这么写就是为了消除抖动
   {
   if(k1==0)  second=0;            //秒针清零
   if(k2==0)  minute++;delay();
   if(k3==0)  hour++;  delay();
   }
}


void main(void)
{
TMOD=0x01;
EA=1;ET0=1;
TH0=(65536-46086)/256;
TL0=(65536-46086)%256;
TR0=1;
Initial(); //MAX7219初始化
while(1)
{
Key();
Write7219(1,  value[hour/10] );
Write7219(2,  value[hour%10] );
Write7219(3,10 );
Write7219(4,value[minute/10] );
Write7219(5,value[minute%10] );
Write7219(6,10);
Write7219(7,value[second/10] );
Write7219(8,value[second%10] );
}
}

void TimeInterrupt (void) interrupt 1 using 1
{
TH0=(65536-46086)/256;
TL0=(65536-46086)%256;
time++;

delaytime++; //此处开始延时,当调用延时时候会初始化,其他时间跑空
if(time==20)
   {time=0;  second++;}
if(second==60)
   {second=0;minute++;}
if(minute==60)
   {minute=0;  hour++;}
if(hour==24)  hour=0;  
}

使用特权

评论回复
15
gaoyang9992006| | 2019-10-31 20:59 | 只看该作者
参考一下我的代码,当年上学时候写的。

使用特权

评论回复
16
jinwe|  楼主 | 2019-10-31 22:50 | 只看该作者
gaoyang9992006 发表于 2019-10-31 20:59
参考一下我的代码,当年上学时候写的。

谢谢,我再来试试

使用特权

评论回复
17
guitianxia| | 2019-11-1 14:56 | 只看该作者
MAX7219 没有设置好

使用特权

评论回复
18
guitianxia| | 2019-11-1 15:01 | 只看该作者
这是 MAX7219 这个是电路给你参考,一个是原厂的典型图  一个是我帮客户设计的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

115

帖子

0

粉丝