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

📄 max7219.lst

📁 MAX7219,8位数字LED显示模块的C51程序
💻 LST
字号:
C51 COMPILER V7.50   MAX7219                                                               12/02/2008 20:51:11 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAX7219
OBJECT MODULE PLACED IN Max7219.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Max7219.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /* *********************************************************************
   2                数字钟 
   3               串行8位显示Max7219模块。
   4               晶振 22.1184,   通讯BAUD 19200 
   5              2008年10月
   6          *************************************************************************/
   7          #include <reg51.h>
   8          #include <absacc.h>
   9          #include <intrins.h>
  10          #define uchar unsigned char
  11          #define uint unsigned int
  12          #define _NOP()  _nop_();_nop_()
  13          # define MCA XBYTE[0x800a]       /*寄存器A*/
  14          # define MCB XBYTE[0x800b]       /*寄存器B*/
  15          # define MCC XBYTE[0x800c]       /*寄存器C*/
  16          # define MCD XBYTE[0x800d]       /*寄存器D*/
  17          # define SEC_ADDR XBYTE[0x8000]
  18          # define SEC_ALARM_ADDR XBYTE[0x8001]       /*秒报警*/
  19          # define MINU_ADDR XBYTE[0X8002]
  20          # define MINU_ALARM_ADDR XBYTE[0x8003]      /*分报警*/
  21          # define HOUR_ADDR XBYTE[0X8004]
  22          # define HOUR_ALARM_ADDR XBYTE[0x8005]     /*时报警*/
  23          # define WEEK_ADDR XBYTE[0x8006]           /**/
  24          # define DAY_ADDR XBYTE[0x8007]
  25          # define MONTH_ADDR XBYTE[0x8008]
  26          # define YEAR_ADDR XBYTE[0x8009]
  27          
  28          # define U24_T0_ADDR XBYTE[0x8500]     /* U24 74LS574 口地址定义  电机驱动*/
  29          
  30          sbit Beep=P1^0;
  31          
  32          sbit LOAD=P3^4;  // P1^0
  33          sbit DIN=P1^4;   // P1^1
  34          sbit CLK=P1^5;   // P1^2
  35          sbit uip_bit=ACC^7;
  36          sbit DOG=P1^7;
  37          uchar xdata *addr ;
  38          uchar idata max=0;
  39          uchar  idata nm[13]={0,0,0,0,0,0,0,0,0,0,0,0,0}; /*定义显示日期时钟字符的ASC码一维数组*/
  40          uchar  idata dt[7]={04,10,11,16,56,0,0};                 /*时标缓冲区及初值*/
  41          uchar  code et[7]={9,8,7,4,2,0,0};                    /*年、月、日、时、分、秒时标寄存器地址*/ 
  42          
  43          uchar code  da_str[9]={4,3,2,1,8,7,6,5,0};
  44          uchar idata RECEIVE_BUF[12];                          /*通讯接收缓冲区*/
  45          uchar idata ANS_TEMP[16];                            /*通讯发送缓冲区*/
  46          uchar data  COMM_NUM;
  47          uchar data SHEAD;
  48          
  49          void PROCESS_COM(void);
  50          
  51          /*软件延时*/
  52          void msec( uint x)
  53             { uchar j;
  54   1           while(x--)
  55   1             {  for(j=0;j<250;j++)
C51 COMPILER V7.50   MAX7219                                                               12/02/2008 20:51:11 PAGE 2   

  56   2                {   DOG=!DOG;
  57   3                    if(SHEAD==1){
  58   4                                    PROCESS_COM();
  59   4                                        SHEAD=0;
  60   4                                        return;
  61   4                                }
  62   3                     }/*一次延时0.5毫秒。*/
  63   2             }
  64   1         }
  65           
  66          
  67          /* 发送一字节到MAX7219,高位在前 */
  68          void send(uchar c)
  69          { uchar bit_cnt;
  70   1        CLK=0;
  71   1        _NOP(); 
  72   1        for(bit_cnt=0;bit_cnt<8;bit_cnt++)
  73   1           { if((c<<bit_cnt)&0x80)DIN=1;
  74   2              else DIN=0;
  75   2              _NOP();
  76   2              CLK=1;
  77   2              _NOP();
  78   2              _NOP(); 
  79   2              CLK=0;
  80   2              _NOP();
  81   2              _NOP();
  82   2              }
  83   1        
  84   1      }
  85          /*向显示器某位送命令或数字*/
  86          void input(uchar addr,uchar dat)
  87          {
  88   1        send(addr);/*传送寄存器地址字节(位选)*/
  89   1        send(dat);/*传送寄存器数据字节*/
  90   1        LOAD=1;
  91   1        _NOP();
  92   1        _NOP();
  93   1        LOAD=0;       
  94   1      }
  95           /*初始化显示器*/
  96          void dip_int(void)
  97          { uchar i;
  98   1        CLK=0;
  99   1        LOAD=0;
 100   1        input(0x0c,0x00);/*关闭显示*/
 101   1        input(0x09,0xff);/*全译码模式*/
 102   1        input(0x0b,0x07);/*显示 8*LED */
 103   1        input(0x0a,0x02);/*亮度占空比31/32 */
 104   1        input(0x0f,0x00);/*显示测试寄存器为正常显示方式 */
 105   1        input(0x0c,0x01);/*开显示 */
 106   1        for(i=8;i>0;i--)input(i,0);
 107   1              
 108   1      }
 109          /*关闭显示*/
 110          void cls(void)
 111          { uchar i;
 112   1              CLK=0;
 113   1              LOAD=0;
 114   1              for(i=1;i<9;i++)input(i,0x0f);/*每个字符‘黑’*/
 115   1          LOAD=1;
 116   1          CLK=1;
 117   1      }
C51 COMPILER V7.50   MAX7219                                                               12/02/2008 20:51:11 PAGE 3   

 118          /*显示字符串(8 位)*/
 119          void str(uchar *s)
 120          {  uchar i;
 121   1              input(0x0c,0x01);
 122   1              for(i=8;i>0;i--)
 123   1                 input(i,s[i-1]);
 124   1      } 
 125          /* 时钟工作状态初始化函数*/
 126          void initstat (void)
 127          { // uchar   i;
 128   1        // uint   g;
 129   1         MCB=0xaa;                     /*中断允许,时标值为BCD码,24小时制,芯片工作*/
 130   1         HOUR_ALARM_ADDR=0xff;         /*每小时闹钟中断*/
 131   1         MINU_ALARM_ADDR=0xff;
 132   1         SEC_ALARM_ADDR=0xff;
 133   1         MCA=0x2f;                     /*选时钟32.268 kh,中断周期500ms*/
 134   1         ACC=MCC;                      /*清中断请求标志*/
 135   1         ACC=MCD;                      /*VRT=1,数据有效*/
 136   1         MCB=0x2a;
 137   1      }
 138          /*读时标函数*/
 139          void rMC(void)
 140            {  uchar   i,q=0;
 141   1               uchar date;
 142   1           do {ACC=MCA;} while (uip_bit==1);      /*判UIP位*/
 143   1           for (i=0;i<6;i++)
 144   1            {  date=*(addr+et[i]);          /* 读时标寄存器值到缓冲区*/
 145   2               msec(50);
 146   2               nm[q]=(date/16);/*将读来的二制进制数的高四位转换为一位可显示的ASC码*/
 147   2               if (nm[q]>9)nm[q]=9; 
 148   2               q++;
 149   2               nm[q]=(date%16);     /*将低四位也转换为一位待显示的ASC码*/
 150   2               if (nm[q]>9)nm[q]=9;
 151   2               q++;
 152   2               
 153   2             }
 154   1        }
 155          /*写时标函数*/
 156          void wMC(void)
 157             { uchar i;
 158   1           for (i=0;i<=5;i++)
 159   1               dt[i]=(dt[i]/10*16+dt[i]%10);/*将十进制的日期、时间转换为二进制*/
 160   1           for (i=0;i<6;i++) *(addr+et[i])=dt[i];
 161   1      }
 162          
 163          /*串口通讯结束判断*/
 164          uchar  WAIT_BUF(void) using 3
 165          {   uint idata M_WBW;
 166   1          for (M_WBW=0;M_WBW<=10000;M_WBW++) /*10ms*/
 167   1              {if (RI==1){return 1;}
 168   2                DOG=!DOG;}
 169   1          return 0;
 170   1       }
 171          
 172           /*通讯中断子程序,为查询接收方式,发生中断后进入中断,关CPU中断*/
 173           void SBINTER(void) interrupt 4 using 3
 174           { uchar idata M_COMMB,M_COMMB2,j;
 175   1              if (TI==1){TI=0;}
 176   1              if (RI==1)
 177   1              {
 178   2                      M_COMMB=SBUF;
 179   2                      RI=0;
C51 COMPILER V7.50   MAX7219                                                               12/02/2008 20:51:11 PAGE 4   

 180   2                      if (M_COMMB==0x7e)                      /*收到包头*/
 181   2                        {     IE=(IE & 0xef);                     /*关CPU中断*/
 182   3                              for(M_COMMB=0;M_COMMB<4;M_COMMB++)  /*接收命令4个字节*/
 183   3                                 { j=WAIT_BUF();
 184   4                                       if (j==1){                    /*通讯结束调用,如果返回值为1则通讯结束*/
 185   5                                           RECEIVE_BUF[M_COMMB]=SBUF;/*将接收到的数据送入接收缓冲区 RECEIVE_BUF */
 186   5                                       RI=0;}
 187   4                                   else
 188   4                                      { IE=IE|0x10;              /*如果接收有误,开CPU中断*/
 189   5                                        return;}
 190   4                                  }
 191   3                              M_COMMB2=RECEIVE_BUF[3];
 192   3                              if ((M_COMMB2==0)||(M_COMMB2==6))  /*根据接收到的长度信息接收数据*/
 193   3                                 { for (M_COMMB=0;M_COMMB<M_COMMB2+1;M_COMMB++)/*循环接收数据*/
 194   4                                          {  j=WAIT_BUF();
 195   5                                              if (j==1)
 196   5                                                  { RECEIVE_BUF[4+M_COMMB]=SBUF;
 197   6                                                     RI=0;}
 198   5                                              else {  IE=IE|0x10;    /*接收有误,开CPU中断*/
 199   6                                                      return;}
 200   5                                      }
 201   4                              }
 202   3                         else {IE=IE|0x10;                  /*接收长度信息有误,开CPU中断,跳走*/
 203   4                                   return;}
 204   3      
 205   3                  SHEAD=1;
 206   3                  }
 207   2         }
 208   1      }
 209          
 210          
 211                  /*通讯发送字符串子程序*/
 212          void SEND_STRING(uint M_SBW)
 213          {  uint idata M_SBW2 ;
 214   1         for (M_SBW2=0;M_SBW2<M_SBW+1;M_SBW2++)
 215   1             { SBUF=ANS_TEMP[M_SBW2];
 216   2                   while (TI==0){DOG=!DOG;}
 217   2                   TI=0;}
 218   1      }
 219          
 220          /*计算回送校验和*/
 221          uint  GET_BACK_CHKSUM(void)
 222          { uint idata M_GSCW1,M_GSCW2;
 223   1        M_GSCW1=0;M_GSCW2=1;
 224   1        do  { M_GSCW1=M_GSCW1+ANS_TEMP[M_GSCW2];M_GSCW2++;}
 225   1        while (M_GSCW2<ANS_TEMP[3]*256+ANS_TEMP[4]+5);
 226   1        return (M_GSCW1 & 0x0ff);
 227   1      }
 228          /*时间校正*/
 229          void PROCES_TIME_SET(void)
 230           {   uchar idata tt[6];
 231   1           uchar  i;
 232   1           tt[0]=RECEIVE_BUF[4];  tt[1]=RECEIVE_BUF[5];   tt[2]=RECEIVE_BUF[6];     /*接收日期*/
 233   1           tt[3]=RECEIVE_BUF[7]; tt[4]=RECEIVE_BUF[8];    tt[5]=RECEIVE_BUF[9];     /*接收时间*/
 234   1           for (i=0;i<6;i++){dt[i]=tt[i];}                                          /*送入时标数组。*/
 235   1           for (i=0;i<=5;i++)                                                       /**/
 236   1                    {dt[i]=(dt[i]/10*16+dt[i]-dt[i]/10*10);}                            /*将十进制的日期、时间转换为二

⌨️ 快捷键说明

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