max7219显示问题

2019-03-24 19:05发布

我的电路板采用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程序,但是电路没什么反应。
请高人指点!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
dige
2019-03-24 23:46

看了你的问题,想你是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位
}

一周热门 更多>