⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 max7219.c

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

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

          }

   } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -