5701|2

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

max7219显示问题 [复制链接]

我的电路板采用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程序,但是电路没什么反应。
请高人指点!!
此帖出自51单片机论坛

最新回复

看了你的问题,想你是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位}  详情 回复 发表于 2012-7-15 19:40
点赞 关注
 

回复
举报

96

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

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

此帖出自51单片机论坛

点评

感谢高人指点!我回去试一试!  详情 回复 发表于 2012-7-15 21:21
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 dige 的帖子

感谢高人指点!我回去试一试!
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表