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

📄 led_8_8.lst

📁 该程序是双色点阵程序
💻 LST
字号:
C51 COMPILER V8.02   LED_8_8                                                               08/22/2008 11:51:52 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LED_8_8
OBJECT MODULE PLACED IN LED_8_8.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LED_8_8.c BROWSE DEBUG OBJECTEXTEND TABS(2)

line level    source

   1          #include "LED_8_8.H"
   2          
   3          #define LED1 0x00
   4          #define LED2 0x08
   5          #define LED3 0x10
   6          #define LED4 0x18
   7          
   8          sbit   SPI_DATA =  P1^4;  
   9          sbit   SPI_CS   =  P1^3;    
  10          sbit   SPI_CLK  =  P1^2;    
  11          void Delay_1ms(int z);
  12          
  13          unsigned char Show[32] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  14                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
             -};
  15          
  16          unsigned char Show_Temp[32] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
             -0x00,
  17                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
             -};
  18          
  19          unsigned char Pos_x = 0;      //坐标初始位置(0,0)对应第2个点阵最后一行的第一个点上
  20          unsigned char Pos_y = 0;
  21          unsigned char LED_Sel = 2;   //点阵块的选择,范围1--4
  22          unsigned char Dis_num = 30;  //坐标当前位置所对应显示数组位,范围0--31;
  23          //****************************************************************************
  24          //* 名称:LocateXY()
  25          //* 功能:使当前坐标位置亮,但移动后要使它灭
  26          //* 注意:(7 - Pos_y)<<1 + 16 左移的优先级比加减低,故要加括号:((7 - Pos_y)<<1) + 16
  27          //****************************************************************************
  28          void LocateXY(void)  //
  29          {
  30   1          if( (Pos_x>=0) && (Pos_x<8) )
  31   1            {
  32   2                if( (Pos_y>=0) && (Pos_y<8) )            //第二个点阵
  33   2                {
  34   3                   LED_Sel = 2;
  35   3                   Dis_num = ((7 - Pos_y)<<1) + 16;   //左移1位相当与乘以2!
  36   3                }
  37   2                else
  38   2                if( Pos_y>=8 && Pos_y<16)           //第一个点阵
  39   2                 {
  40   3                   LED_Sel = 1;
  41   3                   Dis_num = (15 - Pos_y)<<1;
  42   3                 }  
  43   2            
  44   2            }
  45   1            else
  46   1            if( Pos_x>=8 && Pos_x<16)
  47   1            {
  48   2                if( Pos_y>=0 && Pos_y<8)            //第四个点阵
  49   2                {
  50   3                   LED_Sel = 4;
  51   3                   Dis_num = ((7 - Pos_y)<<1) + 17;
  52   3                }
C51 COMPILER V8.02   LED_8_8                                                               08/22/2008 11:51:52 PAGE 2   

  53   2                else
  54   2                if( Pos_y>=8 && Pos_y<16)           //第三个点阵
  55   2                 {
  56   3                   LED_Sel = 3;
  57   3                   Dis_num = ((15 - Pos_y)<<1) + 1;
  58   3                 }  
  59   2            
  60   2            }
  61   1        //=========================坐标所在的位置要为亮,当移走时就灭=======================
  62   1          if(Pos_x < 8)
  63   1                    Show[Dis_num] |=  ( 0x80>>Pos_x );
  64   1          else
  65   1                    Show[Dis_num] |=  ( 0x80>>(Pos_x-8) );
  66   1      
  67   1      }
  68          
  69          //****************************************************************************
  70          //* 名称:Locate_Task()
  71          //* 功能:实现光标的移动和点阵的亮灭控制,相当于在点阵上画图
  72          //* 说明:可惜这点阵板没有地址锁存芯片74HC573,与键盘有冲突了
  73          //****************************************************************************
  74          void Locate_Task(void)
  75          {
  76   1       //************************************************************* 
  77   1         LocateXY();
  78   1       //************************************************************
  79   1         if(KeyValue)
  80   1         {
  81   2             if(KeyValue < 5)       //当执行光标移动工作时,要把原来的光标显示清除
  82   2             {
  83   3                Show[Dis_num] = Show_Temp[Dis_num];
  84   3             }  
  85   2            switch(KeyValue)
  86   2            {
  87   3              case 1: Pos_x++;
  88   3                      if(Pos_x >= 16)   
  89   3                       { Pos_x = 0; }
  90   3                      break; 
  91   3              
  92   3              case 2: if(Pos_x == 0)   
  93   3                       { Pos_x = 15; }
  94   3                      else
  95   3                         Pos_x--;
  96   3                      break;
  97   3              
  98   3              case 3:  Pos_y++;
  99   3                       if(Pos_y >= 16)   
 100   3                       { Pos_y = 0; }
 101   3                       break; 
 102   3                       
 103   3              case 4: if(Pos_y == 0)   
 104   3                       { Pos_y = 15; }
 105   3                      else
 106   3                         Pos_y--;
 107   3                      break; 
 108   3                  
 109   3              case 5:   if(Show[Dis_num] != Show_Temp[Dis_num])   //当坐标值不相等时(即原来没有置1)置1
 110   3                         {
 111   4                            if(Pos_x < 8)
 112   4                               Show[Dis_num] |=  (0x80>>Pos_x);
 113   4                            else
 114   4                               Show[Dis_num] |=  (0x80>>(Pos_x-8));          
C51 COMPILER V8.02   LED_8_8                                                               08/22/2008 11:51:52 PAGE 3   

 115   4                          }
 116   3                         else                                     //清0
 117   3                          {
 118   4                            if(Pos_x < 8)
 119   4                               Show[Dis_num] &=  (0x7F>>Pos_x);
 120   4                            else
 121   4                               Show[Dis_num] &=  (0x7F>>(Pos_x-8)); 
 122   4                          }
 123   3      
 124   3                          Show_Temp[Dis_num] = Show[Dis_num];    //一定要保存当前值
 125   3                          break;
 126   3            }
 127   2            
 128   2            KeyValue = 0;
 129   2         }
 130   1        
 131   1      
 132   1      }
 133          
 134          /*
 135          void LED_Dis_8(unsigned char LED_Num,unsigned char *Word)
 136          {  
 137             unsigned char row;
 138             LED_Num = LED_Num<<3;
 139             for(row=0; row<8; row++)
 140             {
 141                 P2 = LED_Num|row;
 142                 HC595_SendDat(Word[row]);
 143                 Delay_1ms(1);
 144          
 145             }
 146          }
 147          */
 148          /*
 149          void LED_Dis_16(unsigned char *Word)       //16*16点阵的显示,没用到定时中断,用延时
 150          {
 151             unsigned char  i = 0;
 152             unsigned char  row;
 153             row = 0 ;
 154               for(i=0; i<=7; i++)            //显示第1个点阵
 155               {
 156                   P2 = i;
 157                   HC595_SendDat(Word[row]);
 158                   row = row+2;
 159                   Delay_1ms(1);
 160               }
 161               row = 1;
 162               for(i=0; i<8; i++)              //显示第2个点阵
 163               {
 164                   P2 = (2<<3)|i;
 165                   HC595_SendDat(Word[row]);
 166                   row = row+2;
 167                   Delay_1ms(1);
 168          
 169               }
 170                row = 16;   
 171          
 172               for(i=0; i<8; i++)            //显示第3个点阵
 173               {
 174                   P2 = (1<<3)|i;
 175                   HC595_SendDat(Word[row]);
 176                   row = row+2;
C51 COMPILER V8.02   LED_8_8                                                               08/22/2008 11:51:52 PAGE 4   

 177                            Delay_1ms(1);
 178          
 179               }
 180               row = 17;
 181               for(i=0; i<8; i++)            //显示第4个点阵
 182               {
 183                   P2 = (3<<3)|i;
 184                   HC595_SendDat(Word[row]);
 185                   row = row+2;
 186                   Delay_1ms(1);
 187          
 188               }
 189              
 190          } 
 191          */
 192          /*
 193          
 194          void LED_Dis_16(unsigned char *Word)
 195          {
 196             unsigned char  i = 0;
 197             unsigned char  row;
 198             row = 0 ;
 199               for(i=0; i<8; i++)            //先显示上面2个点阵
 200               {
 201                   P2 = (0<<3)|i;
 202                   HC595_SendDat(Word[row]);
 203                   row++;
 204                   Delay_1ms(1);
 205                   P2 = (2<<3)|i;
 206                   HC595_SendDat(Word[row]);
 207                   row++;
 208                   Delay_1ms(1);
 209               }
 210               for(i=0; i<8; i++)            //再显示下面2个点阵
 211               {
 212                   P2 = (1<<3)|i;
 213                   HC595_SendDat(Word[row]);
 214                   row ++;
 215                   Delay_1ms(1);
 216                   P2 = (3<<3)|i;
 217                   HC595_SendDat(Word[row]);
 218                   row ++;
 219                   Delay_1ms(1);
 220               }
 221          } 
 222          */
 223          /****************************************************************************
 224          * 名称:LED_Display()
 225          * 功能:可实现4个8*8点阵构成的16*16点阵的显示
 226          * 入口参数:word    要显示的数组
 227          * 说明:在定时中断0中每隔0.75ms调用一次
 228          ****************************************************************************/
 229          unsigned char Couter_8 = 0;
 230          unsigned char LED_Number = 0;
 231          //=========================第二版本==============================================
 232          unsigned char Show_Number = 0;
 233          void LED_Display(unsigned char *Word)
 234          {
 235   1      
 236   1        Couter_8++;
 237   1        Show_Number = Show_Number + 2;        //加2是为了点阵间隔显示,由电路布局决定
 238   1        
C51 COMPILER V8.02   LED_8_8                                                               08/22/2008 11:51:52 PAGE 5   

 239   1        if(Couter_8 >= 8)
 240   1        {
 241   2             Couter_8 = 0;
 242   2             LED_Number++;
 243   2             if(LED_Number >= 4)
 244   2             {
 245   3               LED_Number = 0;
 246   3             }
 247   2             switch(LED_Number)                 //主要是初始化Show_Number,以减少乘除或移位指令的使用
 248   2              {
 249   3                case 0:
 250   3                       Show_Number = 0;
 251   3                       break;
 252   3                case 1:
 253   3                       Show_Number = 16;      
 254   3                       break;
 255   3                case 2:
 256   3                       Show_Number = 1;     
 257   3                       break;
 258   3                case 3:
 259   3                       Show_Number = 17;     
 260   3                       break;
 261   3            
 262   3              }
 263   2        }
 264   1        P2 = (LED_Number<<3)|Couter_8;
 265   1        HC595_SendDat( Word[Show_Number] );
 266   1      
 267   1      }
 268          
 269          /****************************************************************************
 270          * 名称:HC595_SendDat()
 271          * 功能:向74HC595发送一字节数据
 272          * 入口参数:dat   要发送的数据
 273          * 说明:发送数据时,高位先发送。
 274          ****************************************************************************/
 275          void  HC595_SendDat(unsigned char dat)
 276          {  char  i;
 277   1      
 278   1         SPI_CS = 0;          // SPI_CS = 0
 279   1         for(i=0; i<8; i++)     // 发送8位数据
 280   1         {  SPI_CLK = 0;      // SPI_CLK = 0
 281   2           
 282   2            /* 设置SPI的DATA输出值 */
 283   2            if( (dat&0x80)!=0 ) 
 284   2               SPI_DATA = 1;
 285   2            else 
 286   2               SPI_DATA = 0;
 287   2            dat <<= 1;
 288   2            SPI_CLK = 1;      // SPI_CLK = 1
 289   2           
 290   2         }
 291   1         
 292   1          SPI_CS = 1;         // SPI_CS = 1,输出显示数据
 293   1      }
 294          /*
 295          void Delay_1ms(int z)
 296          {
 297             int i,j;
 298             for(i=0;i<z;i++)
 299                for(j=0;j<80;j++);
 300          }
C51 COMPILER V8.02   LED_8_8                                                               08/22/2008 11:51:52 PAGE 6   

 301          */ 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    582    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     71    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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