[PIC®/AVR®/dsPIC®产品] max7219驱动问题

[复制链接]
1835|17
 楼主| jinwe 发表于 2019-10-24 20:49 | 显示全部楼层 |阅读模式
用877a驱动时,好像有时初始化不成功,出现全亮或随机亮的情况。多次开关电源后又正常了,相同的代码用Arduino测试就没这个问题?请问是初始化没成功吗?谢谢了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lcczg 发表于 2019-10-25 11:17 | 显示全部楼层
看看SPI的初始化,看看SPI的波形,看看发送的命令串。。。
antusheng 发表于 2019-10-25 11:28 | 显示全部楼层
代码质量问题。跟单片机 无关
antusheng 发表于 2019-10-25 11:49 | 显示全部楼层
应该是你初始化的代码不科学
antusheng 发表于 2019-10-25 11:50 | 显示全部楼层
比如检测忙,检测完了吗
你用Arduino操作,那是调用的库函数,人家那是经过千锤百炼的代码,肯定靠谱多了
 楼主| jinwe 发表于 2019-10-25 13:33 | 显示全部楼层
antusheng 发表于 2019-10-25 11:50
比如检测忙,检测完了吗
你用Arduino操作,那是调用的库函数,人家那是经过千锤百炼的代码,肯定靠谱多了 ...

用arduino也是用的相同的代码,没有用库。
 楼主| 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
  }
}
CoolSilicon 发表于 2019-10-25 14:06 | 显示全部楼层
你用到的RAM是不是没有赋初值?
 楼主| jinwe 发表于 2019-10-25 19:30 | 显示全部楼层
CoolSilicon 发表于 2019-10-25 14:06
你用到的RAM是不是没有赋初值?

是端口吗?赋值了。有时多开关几次就好了,有时一次开就正常,就是不稳定,应该脉冲时间是满足了的,手册上的时间都是ns记的,pic的时间周期应该有us吧,4M的晶振。
 楼主| jinwe 发表于 2019-10-25 19:32 | 显示全部楼层
用的是877A的RB口,要上拉吗?我用10K的上拉了也好像也是一样的
CoolSilicon 发表于 2019-10-28 09:53 | 显示全部楼层
jinwe 发表于 2019-10-25 19:30
是端口吗?赋值了。有时多开关几次就好了,有时一次开就正常,就是不稳定,应该脉冲时间是满足了的,手册 ...

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

这个屏看起来是8块数据的, 前5块一直都是正常的?
写入整个数据区前关一下中断, 写完了再开中断试试?
 楼主| jinwe 发表于 2019-10-28 22:25 | 显示全部楼层
CoolSilicon 发表于 2019-10-28 09:53
1是数据可能没有初始化
2是可能写入的数据时候被打断了..

出问题的时候是不定是哪几块不行,随机的。
zhuotuzi 发表于 2019-10-31 20:22 | 显示全部楼层
跟屏有关还是跟7219有关
gaoyang9992006 发表于 2019-10-31 20:58 | 显示全部楼层
  1. #include"reg51.h"
  2. sbit LOAD=P2^1; //MAX7219片选   12脚
  3. sbit DIN=P2^0; //MAX7219串行数据 1脚
  4. sbit CLK=P2^2;//MAX7219串行时钟 13脚
  5. sbit k1=P2^5;
  6. sbit k2=P2^6;
  7. sbit k3=P2^7;
  8. //寄存器宏定义
  9. #define DECODE_MODE 0x09       //译码控制寄存器
  10. #define INTENSITY 0x0A        //亮度控制寄存器
  11. #define SCAN_LIMIT 0x0B      //扫描界限寄存器
  12. #define SHUT_DOWN 0x0C      //关断模式寄存器
  13. #define DISPLAY_TEST 0x0F  //测试控制寄存器

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


  17. //函数声明
  18. void Write7219(unsigned char address,unsigned char dat);
  19. void Initial(void);
  20. void Key(void);

  21. void delay(void);

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

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

  27.   }

  28. //地址、数据发送子程序
  29. void Write7219(unsigned char address,unsigned char dat)
  30. {
  31. unsigned char i;
  32. LOAD=0;            //拉低片选线,选中器件
  33.                   //发送地址
  34. for (i=0;i<8;i++)//移位循环8次
  35. {
  36. CLK=0;         //清零时钟总线
  37. DIN=(bit)(address&0x80); //每次取高字节
  38. address<<=1;            //左移一位
  39. CLK=1;                 //时钟上升沿,发送地址
  40.   }
  41.             //发送数据
  42. for (i=0;i<8;i++)
  43. {
  44. CLK=0;
  45. DIN=(bit)(dat&0x80);
  46. dat<<=1;
  47. CLK=1;//时钟上升沿,发送数据
  48.   }
  49. LOAD=1;//发送结束,上升沿锁存数据
  50. }


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


  70. void main(void)
  71. {
  72. TMOD=0x01;
  73. EA=1;ET0=1;
  74. TH0=(65536-46086)/256;
  75. TL0=(65536-46086)%256;
  76. TR0=1;
  77. Initial(); //MAX7219初始化
  78. while(1)
  79. {
  80. Key();
  81. Write7219(1,  value[hour/10] );
  82. Write7219(2,  value[hour%10] );
  83. Write7219(3,10 );
  84. Write7219(4,value[minute/10] );
  85. Write7219(5,value[minute%10] );
  86. Write7219(6,10);
  87. Write7219(7,value[second/10] );
  88. Write7219(8,value[second%10] );
  89. }
  90. }

  91. void TimeInterrupt (void) interrupt 1 using 1
  92. {
  93. TH0=(65536-46086)/256;
  94. TL0=(65536-46086)%256;
  95. time++;

  96. delaytime++; //此处开始延时,当调用延时时候会初始化,其他时间跑空
  97. if(time==20)
  98.    {time=0;  second++;}
  99. if(second==60)
  100.    {second=0;minute++;}
  101. if(minute==60)
  102.    {minute=0;  hour++;}
  103. if(hour==24)  hour=0;  
  104. }

gaoyang9992006 发表于 2019-10-31 20:59 | 显示全部楼层
参考一下我的代码,当年上学时候写的。
 楼主| jinwe 发表于 2019-10-31 22:50 | 显示全部楼层
gaoyang9992006 发表于 2019-10-31 20:59
参考一下我的代码,当年上学时候写的。

谢谢,我再来试试
guitianxia 发表于 2019-11-1 14:56 | 显示全部楼层
MAX7219 没有设置好
guitianxia 发表于 2019-11-1 15:01 | 显示全部楼层
这是 MAX7219 这个是电路给你参考,一个是原厂的典型图  一个是我帮客户设计的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

115

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部