这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 电源与模拟 » 新手请教max7219显示问题!!!

共5条 1/1 1 跳转至

新手请教max7219显示问题!!!

菜鸟
2009-09-23 14:41:35     打赏
我是电子爱好者,近日有个MAX7219的片子,用89C2051 想编个程序显示看看,结果不可以,我感觉没有问题,但我要显示的8个led一上电就全亮,再就没有熄灭过,怎么回事呢,软件问题还是硬件问题,百思不得其解,请问哪位大虾给各指点,不胜感激!!!
下面是我们显示程序:
;max7219汇编测试程序

 

;**********************************************************
L0AD7219 BIT  P1.0    ;MAX7219片选线引脚
CLK7219  BIT  P1.1    ;MAX7219时钟线引脚
DIN7219  BIT  P1.2    ;MAX7219数据线引脚
POWLED   BIT  P1.7    ;监视灯
;**********************************************************

DIG0    EQU  01H      ;数据寄存器地址
DIG1    EQU  02H
DIG2    EQU  03H
DIG3    EQU  04H
DIG4    EQU  05H
DIG5    EQU  06H
DIG6    EQU  07H
DIG7    EQU  08H

DECMODE EQU  09H      ;控制寄存器地址
INTENTY EQU  0AH      
SCANLIM EQU  0BH
SHUTDOW EQU  0CH
DISTEST EQU  0FH


      ORG 0000H
      AJMP MAIN
      ORG 0040H

MAIN:
      MOV SP,#30H
      CLR POWLED
      LCALL INI7219
      LCALL DELAY1S
      CPL POWLED
LLLL: 
      LCALL SHOW7219
      LJMP LLLL      

      RET
;//////////////////////////////////////////////////////      
SHOW7219:
       MOV A,#DIG0
       MOV B,#00H
       LCALL WRITE7219

       MOV A,#DIG1
       MOV B,#01H    
       LCALL WRITE7219

       MOV A,#DIG2
       MOV B,#02H    
       LCALL WRITE7219
       
       MOV A,#DIG3
       MOV B,#03H    
       LCALL WRITE7219

       MOV A,#DIG4
       MOV B,#04H    
       LCALL WRITE7219

       MOV A,#DIG5
       MOV B,#05H    
       LCALL WRITE7219
       
       MOV A,#DIG6
       MOV B,#06H    
       LCALL WRITE7219
       
       MOV A,#DIG7
       MOV B,#07H    
       LCALL WRITE7219 


       RET

;//////////////////////////////////////////////////////
INI7219:
       MOV A,#SHUTDOW  ;关机方式
       MOV B,#00H
       LCALL WRITE7219
       
       MOV A,#DECMODE  ;译码方式
       MOV B,#0FFH
       LCALL WRITE7219  
       
       MOV A,#INTENTY  ;亮度15/32方式
       MOV B,#07H
       LCALL WRITE7219
   
       MOV A,#SCANLIM  ;显示8位LED
       MOV B,#07H
       LCALL WRITE7219

       MOV A,#DISTEST  ;正常显示
       MOV B,#00H
       LCALL WRITE7219
       
       MOV A,#SHUTDOW  ;开机方式
       MOV B,#01H
       LCALL WRITE7219
      
       RET       
;/////////////////////////////////////////////////////      
WRITE7219:
     NOP
     CLR L0AD7219
     LCALL SEND7219  ;先送控制寄存器的地址
     MOV A,B         ;B中为传送的命令字或待显的数据    
     LCALL SEND7219
     NOP
     SETB L0AD7219
     RET
;////////////////////////////////////////////////////
SEND7219:
     MOV R1,#08H
LOOPS:
     NOP
     CLR CLK7219
     RLC A            ;左移位送MSB
     MOV DIN7219,C
     NOP
     SETB CLK7219
     DJNZ R1,LOOPS
     RET           
;///////////////////////////////////////////////////

DELAY1S: MOV R7,#0AH   ;延时1秒子程序(12M晶振)
LOOP6:   MOV R5,#64H   ;100ms循环
LOOP7:   MOV R6,#64H  
LOOP8:   NOP           ;1US
         NOP
         NOP
  NOP
  NOP
  NOP
  NOP
         NOP
         DJNZ R6,LOOP8 ;10US
         DJNZ R5,LOOP7
         DJNZ R7,LOOP6
         RET        

         END




关键词: 新手     请教     max7219     显示     问题     LCALL    

菜鸟
2009-09-24 09:00:02     打赏
2楼

没有人吗?


菜鸟
2009-09-26 09:06:55     打赏
3楼
:((((((((((((((((((((((((((

菜鸟
2009-10-22 12:02:33     打赏
4楼

#include <includes.h>

/*----------------------------------------------------------*/


#include <intrins.h>

/*--------------------------------------------------*/
sbit dis_DIN=P3^0;           /*显示串行数据输入端*/
sbit dis_LOAD=P1^0;          /*显示数据锁存端*/
sbit dis_CLK=P3^1;           /*显示时钟输入端*/

#define NoOp   0x00         /*空操作*/
#define Digit0 0x01         /*数码管1*/
#define Digit1 0x02         /*数码管2*/
#define Digit2 0x03         /*数码管3*/
#define Digit3 0x04         /*数码管4*/
#define Digit4 0x05         /*数码管5*/
#define Digit5 0x06         /*数码管6*/
#define Digit6 0x07         /*数码管7*/
#define Digit7 0x08         /*数码管8*/
#define DecodeMode 0x09     /*译码模式*/
#define Intensity 0x0a     /*亮度*/
#define ScanLimit 0x0b      /*扫描界限*/
#define ShutDown 0x0c       /*掉电模式*/
#define DisplayTest 0x0f    /*显示测试*/

#define ShutdownMode 0x00      /*掉电方式工作*/
#define NormalOperation 0x01   /*正常操作方式*/

#define DecodeDigit 0xff       /*译码位数设置*/

#define IntensityGrade 0x0f7    /*显示亮度级别设置*/

#define ScanDigit 0x07         /*扫描位数设置*/

#define TestMode 0x01          /*显示测试方式*/
#define TextEnd 0x00           /*显示测试结束,正常工作*/


unsigned char data DisBuffer[8]={0,0,0,0,0,0,0,0};    /*显示缓存区*/

 
unsigned char code dispaly_list[]=
    {
0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,    /*0,1,2,3,4,5,6,7,8,9*/
      0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,0x00};   /*A,B,C,D,E,F,P,U,全
亮,全灭*/

 

/*--------------------------------------------------------
                   10ms延时子程序
---------------------------------------------------------*/

void delayX10ms(unsigned char count)
     {
      unsigned char j,k;
      while(count--!=0)
        {
         for(j=0;j<43;j++)
           for(k=0;k<73;k++)
           ;
        }
     }

/*-------------------------------------------------
                向MAX7219写入字节(8位)
--------------------------------------------------*/
void SendChar (unsigned char ch)
   {
    unsigned char i,temp;
    _nop_();
    for (i=0;i<8;i++)
       {
           temp=ch&0x80;
           ch=ch<<1;
           if(temp)
          {
           dis_DIN=1;
           dis_CLK=0;
           dis_CLK=1;
          }
        else
          {
           dis_DIN=0;
           dis_CLK=0;
           dis_CLK=1;
          }
       }
   }

/*-------------------------------------------------
               向MAX7219写入字(16位)
-------------------------------------------------*/
void WriteWord (unsigned char addr,unsigned char num)
   {
    dis_LOAD=0;
    _nop_();
    SendChar (addr);
    _nop_();
    SendChar (num);
    _nop_();
    dis_LOAD=1;
   }

/*-------------------------------------------------
                 MAX7219初始化
-------------------------------------------------*/
void InitDis (void)
   {
    WriteWord (ScanLimit,ScanDigit);         /*设置扫描界限*/
    WriteWord (DecodeMode,DecodeDigit);      /*设置译码模式*/
    WriteWord (Intensity,IntensityGrade);    /*设置亮度*/
    WriteWord (ShutDown,NormalOperation);    /*设置电源工作模式*/
   }

/*-------------------------------------------------
                    系统上电初始化
-------------------------------------------------*/
void InitMain (void)
   {
    IE=0x00;    /*设置中断允许寄存器*/
    IP=0x00;    /*设置中断优先级管理寄存器*/
    TH0=0xd8;   /*设定时器初值,10ms*/
    TL0=0xf0;
    TMOD=0x01;  /*T1 定时器模式2,波特率发生器,T0 定时器模式1*/
    TCON=0x11;  /*设置定时器控制寄存器,INT0设置为边沿触发方式*/
    PSW=0x00;
   }

/*-------------------------------------------------
                    显示函数
-------------------------------------------------*/
 void main(void)
 {
 InitMain ();
   InitDis ();
  
 WriteWord (DisplayTest,TestMode);
      delayX10ms(0x64);
       delayX10ms(0x64);
   WriteWord (DisplayTest,TextEnd);

  
  while(1)
            {
             unsigned char i;
             for (i=0;i<=9;i++)
                {
               delayX10ms(0x64);
               delayX10ms(0x64);
                 InitDis ();
               DisBuffer[0]=i;
               DisBuffer[1]=i;
               DisBuffer[2]=i;
               DisBuffer[3]=i;
               DisBuffer[4]=i;
               DisBuffer[5]=i;
               DisBuffer[6]=i;
               DisBuffer[7]=i;
              
               WriteWord (Digit0,DisBuffer[0]);
               WriteWord (Digit1,DisBuffer[1]);
               WriteWord (Digit2,DisBuffer[2]);
               WriteWord (Digit3,DisBuffer[3]);
               WriteWord (Digit4,DisBuffer[4]);
               WriteWord (Digit5,DisBuffer[5]);
               WriteWord (Digit6,DisBuffer[6]);
               WriteWord (Digit7,DisBuffer[7]);
              }

          }

 

  }


专家
2010-01-16 17:27:27     打赏
5楼

再看看max719的文档!


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]