您现在的位置是:首页 > 单片机

max7219显示程序-C程序—汇编

2020-01-25 02:15:08

max7219显示程序(汇编)

#include "msp430x41x.h"
DIN EQU 001H ;P1.0
CLK EQU 002H ;P1.1
LOAD EQU 004H ;P1.2

ORG 0F000H
RESET MOV #300H,SP ;初始化
MOV #WDTPW+WDTHOLD,&WDTCTL
BIS.B #CLK,&P1DIR
BIS.B #DIN,&P1DIR
BIS.B #LOAD,&P1DIR
PUSH #00C01H ;设置工作模式
BIC.B #LOAD,&P1OUT
CALL #MOVE
BIS.B #LOAD,&P1OUT

PUSH #00B05H ;设置扫描位数
BIC.B #LOAD,&P1OUT
CALL #MOVE
BIS.B #LOAD,&P1OUT

PUSH #009FFH ;设置编码方式
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00A07H ;设置亮度
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

XIAN PUSH #00107H ;显示第一位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00206H ;显示第二位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00305H ;显示第三位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00404H ;显示第四位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00503H ;显示第五位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00602H ;显示第六位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT
JMP $
MOVE MOV.B #16,R6
MOV 2(SP),R13
MOV #1,R10
SENDLOOP BIC.B #CLK,&P1OUT
BIT R10,R13
JNZ SEND1
SEND0 BIC.B #DIN,&P1OUT
JMP GOON
SEND1 BIS.B #DIN,&P1OUT
GOON BIS.B #CLK,&P1OUT
RLA R10
BIC.B #CLK,&P1OUT
DEC R6
JNZ SENDLOOP
RET
ORG 0FFFEH
DW RESET
END#include "msp430x41x.h"
DIN EQU 001H ;P1.0
CLK EQU 002H ;P1.1
LOAD EQU 004H ;P1.2

ORG 0F000H
MOV #300H,SP ;初始化
MOV #WDTPW+WDTHOLD,&WDTCTL
BIS.B #CLK,&P1DIR
BIS.B #DIN,&P1DIR
BIS.B #LOAD,&P1DIR

PUSH #00C01H ;设置工作模式
BIC.B #LOAD,&P1OUT
CALL #MOVE
BIS.B #LOAD,&P1OUT

PUSH #00B05H ;设置扫描位数
BIC.B #LOAD,&P1OUT
CALL #MOVE
BIS.B #LOAD,&P1OUT

PUSH #009FFH ;设置编码方式
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00A07H ;设置亮度
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

XIAN PUSH #00107H ;显示第一位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00206H ;显示第二位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00305H ;显示第三位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00404H ;显示第四位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00503H ;显示第五位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT

PUSH #00602H ;显示第六位
BIC.B #LOAD,&P1OUT
CALL MOVE
BIS.B #LOAD,&P1OUT
JMP $
MOVE MOV.B #16,R6
POP R13
MOV #1,R10
SENDLOOP BIC.B #CLK,&P1OUT
BIT R10,R13
JNZ SEND1
SEND0 BIC.B #DIN,&P1OUT
JMP GOON
SEND1 BIS.B #DIN,&P1OUT
GOON BIS.B #CLK,&P1OUT
RLA R10
BIC.B #CLK,&P1OUT
DEC R6
JNZ SENDLOOP
RET
END

MAX7219的c程序

/*---------------------------------------------------------
 *                     程序说明                           *
 * 1、本程序已经通过测试,非常好用;                      *
 * 2、在非译码方式下编码和一般书上写的不一样,请注意;    *
 * 3、每次送显示的时候先初始化一次;                      *
 * 4、在设计电路或制作试验板时注意添加Vcc到GND之间的电容,*
 *    一个10vF的电解电容和0.1vF的陶瓷电容。并在DIN、LOAD、*
 *    CLK到GND之间接入30pF的瓷片电容。                    *
 *                                                        *
 *                程序提供人:苏建宇                      *
 *                                                        *
 *                                                        *
----------------------------------------------------------*/

#include <AT89X51.H>
#include <intrins.h>
//#include <absacc.h>
/*--------------------------------------------------*/
sbit dis_DIN=P1^0;           /*显示串行数据输入端*/
sbit dis_LOAD=P1^1;          /*显示数据锁存端*/
sbit dis_CLK=P1^2;           /*显示时钟输入端*/

#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 0x0a    /*显示亮度级别设置*/

#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]);
              }

          }


   }

  • 我正好有个7219,一直想学一下,51节就搭个电路看看,谢谢。 [电烙铁] 2005-4-22 18:00:21


  • 我有更简单的 [rq88] 2005-4-22 18:38:00

    我有更简单的

  • 那就发上来大家都看看嘛  [bush636] 2005-4-22 21:19:13


  • 我有AVR C++的 AT90S2313通过(有图)(附图) [Sunnyyonkers] 2005-4-23 14:27:58

    要注意到时序正确就行了,另外电压一定要够,否则一定会出现乱
    码。

    我先给出一个我做的一个通用驱动。
    //------------------------------------------------------------------------------
    //Author:SunnyYonkers
    //Date: 2005y-03m-18d 13:00
    //------------------------------------------------------------------------------
    #include <avr/io.h>
    #include <avr/io2313.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <inttypes.h>
    #include <avr/eeprom.h>
    #include <avr/pgmspace.h>
    //------------------------------------------------------------------------------
    //Hardware Define
    //引脚定义
    #define SOFT_SERIAL_PORT  PORTB
    #define SOFT_SERIAL_DDR   DDRB
    #define SOFT_SERIAL_PIN   PINB
    //------------------------------------------------------------------------------
    #define LOAD_PIN          0b00000100
    #define DIN_PIN           0b00001000
    #define CLK_PIN           0b00010000
    //------------------------------------------------------------------------------
    //定义引脚操作
    #define SET_DIN           SOFT_SERIAL_PORT |= DIN_PIN
    #define CLR_DIN           SOFT_SERIAL_PORT &= ~DIN_PIN  
    #define SET_CLK           SOFT_SERIAL_PORT |= CLK_PIN
    #define CLR_CLK           SOFT_SERIAL_PORT &= ~CLK_PIN  
    #define SET_LOAD          SOFT_SERIAL_PORT |= LOAD_PIN
    #define CLR_LOAD          SOFT_SERIAL_PORT &= ~LOAD_PIN  
    //------------------------------------------------------------------------------
    #define TRUE              0x01
    #define FALSE             0x00
    //------------------------------------------------------------------------------
    #define DISPLAY_ADD_0     0x01
    #define DISPLAY_ADD_1     0x02
    #define DISPLAY_ADD_2     0x03
    #define DISPLAY_ADD_3     0x04
    #define DISPLAY_ADD_4     0x05
    #define DISPLAY_ADD_5     0x06
    #define DISPLAY_ADD_6     0x07
    #define DISPLAY_ADD_7     0x08
    //------------------------------------------------------------------------------
    #define DECODE_ADDRESS    0x09
    #define LIGHT_ADDRESS     0x0a
    #define SCAN_WIDE         0x0b
    #define SLEEP_ADDRESS     0x0c
    #define TEST_ADDRESS      0x0d  
    //------------------------------------------------------------------------------
    #define SLEEP_MODE        0x00
    #define UN_SLEEP_MODE     0x01
    //------------------------------------------------------------------------------
    #define NO_DECODE         0x00
    #define DECODE_0_         0x01
    #define HALF_DECODE       0x0f
    #define DECODE_ALL        0xff 
    //------------------------------------------------------------------------------
    #define _CHAR_0            0b00000000
    #define _CHAR_1            0b00000001
    #define _CHAR_2            0b00000010
    #define _CHAR_3            0b00000011
    #define _CHAR_4            0b00000100
    #define _CHAR_5            0b00000101
    #define _CHAR_6            0b00000110
    #define _CHAR_7            0b00000111
    #define _CHAR_8            0b00001000
    #define _CHAR_9            0b00001001
    #define _CHAR_-            0b00001010
    #define _CHAR_E            0b00001011
    #define _CHAR_H            0b00001100
    #define _CHAR_L            0b00001101
    #define _CHAR_P            0b00001110
    #define _NO_CHAR           0b00001111
    #define _DOT               0b10000000
    //------------------------------------------------------------------------------
    class max7219drv 
    {
        public:
            max7219drv();
        private:        
            void write(unsigned char cData);
        public:
            void send(unsigned char address,unsigned char ndata);
    };
    //------------------------------------------------------------------------------
    //构造函数
    max7219drv::max7219drv()
    {
        SOFT_SERIAL_PORT |= 0b11111111;//初始状态高电平    
        SOFT_SERIAL_DDR  |= 0b11111111;//状态
        ///////////////////////////////////////////////
    }
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    //写数据微程序:私有
    void max7219drv::write(unsigned char cData)
    {
        unsigned char nloop=0x07;
        /////////////////////////////////////////////    
        do{
            (0x80 & cData) ? (SET_DIN) : (CLR_DIN);cData<<=1;//数据移

            CLR_CLK;
            SET_CLK;//产生一个时钟信号
        }while(nloop--);
    }
    //------------------------------------------------------------------------------
    //写数据子程序:公有
    void max7219drv::send(unsigned char address,unsigned char ndata)
    {
        write(address);
        write(ndata);        
        CLR_LOAD;    
        SET_LOAD;
    }
    //------------------------------------------------------------------------------
    int main(void)
    {
        max7219drv drv;
        /////////////////////////////////////////////////////////////////
        for(;;)
        {
        
        /////////////////////////////////////////////////////////////
            //Init MAX7219
            drv.send(SLEEP_ADDRESS,UN_SLEEP_MODE);    
            drv.send(SCAN_WIDE,0x07);
            drv.send(LIGHT_ADDRESS,0xf9);
            drv.send(DECODE_ADDRESS,DECODE_ALL);
        
        /////////////////////////////////////////////////////////////
            drv.send(DISPLAY_ADD_0,_CHAR_1 | _DOT);
            drv.send(DISPLAY_ADD_1,_CHAR_2 | _DOT);
            drv.send(DISPLAY_ADD_2,_CHAR_3 | _DOT);
            drv.send(DISPLAY_ADD_3,_CHAR_4 | _DOT);
            drv.send(DISPLAY_ADD_4,_CHAR_5 | _DOT);
            drv.send(DISPLAY_ADD_5,_CHAR_6 | _DOT);
            drv.send(DISPLAY_ADD_6,_CHAR_7 | _DOT);
            drv.send(DISPLAY_ADD_7,_CHAR_8 | _DOT);
        
        /////////////////////////////////////////////////////////////
            //去掉小数点使用     drv.send(DISPLAY_ADD_7,_CHAR_8 &~ 
    _DOT);
            //添加小数点使用     drv.send(DISPLAY_ADD_7,_CHAR_8 |  
    _DOT);
        
        /////////////////////////////////////////////////////////////    
        
        }
        return 0;
    }
    //------------------------------------------------------------------------------