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

📄 led点阵显示屏源程序.c

📁 本点阵电子显示屏系统以STC89C52单片机作为控制核心
💻 C
📖 第 1 页 / 共 3 页
字号:
     for(m=0;m<num;m++)
         {
         if(showbuf_sign==0)  //正在显示显示缓冲区show_buffer1中的内容,
//则更新show_buffer2中的内容
             {
              for(i=0;i<=m;i++)   //上展开屏显示移动的第m次,需要移动m列数据
                         //需要移位的个数,如第一次仅需更新显示缓冲区的第一位
                  {
                    for(j=0;j<16;j++)
                        {
                         show_buffer2[i][j]=storep6[i][j];  //一行行的更新
                        }
                  }
              }
          else
               {
                for(i=0;i<=m;i++)  //上展开屏显示移动的第m次,需要移动m列数据
                         //需要移位的个数,如第一次仅需更新显示缓冲区的第一位
                  {
                    for(j=0;j<16;j++)
                        {
                          show_buffer1[i][j]=storep6[i][j];
                        }
                  }
          //数据完成一次移动
          showbuf_sign=~showbuf_sign;  //显示区标志位取反,
//显示另外一个显示缓冲区中的内容
               }
          for(i=0;i<50;i++)
             for(j=0;j<20;j++)
             {
               if(showbuf_sign==0)
                  {
                   show_static(show_buffer1);  //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
                   }
              else
                   {
                   show_static(show_buffer2);
                    }
             }
         }
     for(i=0;i<100;i++)   //全部数据已经移到显示缓冲区,需要全屏
//静态显示一段时间
         {
         if(showbuf_sign==0)
                  {
                   show_static(show_buffer1);  //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
                   }
              else
                   {
                   show_static(show_buffer2);
                    }
         }
    }


/*------------------------------下展开屏子程序------------------------*/
/*
*************************************************************************
**子程序入口:需要进行下展开屏显示的数据的首地址,不可以是显示缓冲区的地址,
**            数据必须是二维数组,字节数只能16*8字节
**子程序功能:字体从下到上逐渐展开显示,只可以显示4个汉字(或等量的字符),开**            完屏后进行一段时间的静态显示
**************************************************************************
*/
void show_downspread(storep7)
    uchar xdata **storep7;
    {
     uint num=16; //显示缓冲区更新的次数为16次 ,即:屏幕的宽度
     uint i,j,m;
     for(i=0;i<16;i++)      //对两个显示缓冲区清零
        {
        for(j=0;j<8;j++)
            {
            show_buffer1[i][j]=0x00;
            show_buffer2[i][j]=0x00;
            }
        }
     TMOD=TMOD&&0xf0;  //计数器0工作在方式1,计数器1,2工作方式保持不变
     TMOD=TMOD||0x01;  
     TH0=(65536-25000)/256;  //晶振12MHZ,计数20000次,1S中断50次
     TL0=(65536-25000)%256;
     EA=1 ;  //CPU开中断,定时器0开中断
     ET0=1;
     TR0=1;  //启动定时器0
     showbuf_sign=0;   //程序开始时使用show_buffer1显示缓冲区
     for(m=0;m<num;m++)
         {
         if(showbuf_sign==0)  //正在显示显示缓冲区show_buffer1中的内容,
//则更新show_buffer2中的内容
             {
              for(i=m-1;i>=0;i--)  //下展开屏显示移动的第m次,需要移动m列数据
                       //需要移位的个数,如第一次仅需更新显示缓冲区的最后一位
                  {
                    for(j=0;j<16;j++)
                        {
                         show_buffer2[i][j]=storep7[i][j];  
//一行行的更新,先更新最后一行,然后是倒第二行
                        }
                  }
              }
          else
               {
                for(i=m-1;i>=0;i--)   
//下展开屏显示移动的第m次,需要移动m列数据
                       //需要移位的个数,如第一次仅需更新显示缓冲区的最后一位
                  {
                    for(j=0;j<16;j++)
                        {
                          show_buffer1[i][j]=storep7[i][j];
                        }
                  }
          //数据完成一次移动
          showbuf_sign=~showbuf_sign;  //显示区标志位取反,显示另外一个
//显示缓冲区中的内容
               }
          for(i=0;i<50;i++)
             for(j=0;j<20;j++)
             {
               if(showbuf_sign==0)
                  {
                   show_static(show_buffer1);  //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
                   }
              else
                   {
                   show_static(show_buffer2);
                    }
             }
         }
     for(i=0;i<100;i++)//全部数据已经移到显示缓冲区,需要全屏静态显示一段时间
         {
         if(showbuf_sign==0)
                  {
                   show_static(show_buffer1);  //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
                   }
              else
                   {
                   show_static(show_buffer2);
                    }
         }
    }


/*---------------------------中间开屏子程序---------------------------*/
/*
***************************************************************************
**子程序入口:需要进行中间开屏显示的数据的首地址,不可以是显示缓冲区的地址,
**            数据必须是二维数组,字节数只能16*8字节
**子程序功能:字体从中间向两边开屏,只可以显示4个汉字(或等量的字符),开完屏**            后进行一段时间的静态显示
***************************************************************************
*/
void show_middle(storep8)
    uchar xdata **storep8;

    {
     uint num=8; //显示缓冲区更新的次数为8次 ,即:屏幕的宽度的一半
                 //定义变量num是为了以后程序扩展的方便,若屏幕增长,则只需改变num值
     uint i,j,m;

     for(i=0;i<16;i++)      //对两个显示缓冲区清零
        {
        for(j=0;j<8;j++)
            {
            show_buffer1[i][j]=0x00;
            show_buffer2[i][j]=0x00;
            }
        }
        
     TMOD=TMOD&&0xf0;        //计数器0工作在方式1, 
     TMOD=TMOD||0x01;        
     TH0=(65536-25000)/256;  //晶振12MHZ,计数25000次,1S中断40次
     TL0=(65536-25000)%256;
     EA=1 ;                //CPU开中断,定时器0开中断
     ET0=1;
     PT0=0;               //定时器0为中断低优先级
     TR0=1;               //启动定时器0

     showbuf_sign=0;   //程序开始时使用show_buffer1显示缓冲区

     for(m=0;m<num;m++)
         {
         if(showbuf_sign==0)  //正在显示显示缓冲区show_buffer1中的内容,
//则更新show_buffer2中的内容
             {
              for(i=0;i<=m;i++)   //中间开屏显示移动的第m次,需要移动m列数据
                       //需要移位的个数,如第一次仅需更新显示缓冲区的中间两位
                  {
                    for(j=0;j<16;j++)
                        {
                         show_buffer2[j][num/2-i-1]=storep8[j][num/2-i-1];  //一列列的更新
                        }

                  }
              }
          else
               {
                for(i=0;i<=m;i++)  //中间开屏显示移动的第m次,需要移动m列数据
                         //需要移位的个数,如第一次仅需更新显示缓冲区的第一位
                  {
                    for(j=0;j<16;j++)
                        {
                          show_buffer1[j][num/2-i-1]=storep8[j][num/2-i-1];
                        }

                  }
          //数据完成一次移动
          showbuf_sign=~showbuf_sign;  //显示区标志位取反,
//显示另外一个显示缓冲区中的内容

               }

          for(i=0;i<50;i++)
             for(j=0;j<20;j++)
             {
               if(showbuf_sign==0)
                  {
                   show_static(show_buffer1);  //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
                   }
              else
                   {
                   show_static(show_buffer2);
                    }
             }

         }
     for(i=0;i<100;i++)//全部数据已经移到显示缓冲区,需要全屏静态显示一段时间
         {
         if(showbuf_sign==0)
                  {
                   show_static(show_buffer1);  //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
                   }
              else
                   {
                   show_static(show_buffer2);
                    }
         }

    }


/*----------------------定时器0中断子程序------------------------------*/
void timer0() interrupt 1 using 1  //定时器0中断子程序,使用第一组寄存器
     {
      TH0=(65536-25000)/256;
      TL0=(65536-25000)%256;
      if(showbuf_sign==0)
           {
           show_static(show_buffer1);  //显示缓冲区标志位等于0,
//显示show_buffer1中的内容
           }
      else
            {
            show_static(show_buffer2);
            }
     }

/*-------------------------------移位子程序-----------------------------*/
/**********************************************************************
** 子程序入口:8字节数据的首地址
**  子程序功能:子程序通过74HC165实现8字节数据信息并行输入串行输出                                    
***********************************************************************/
#define AD_138 XBYTE[0x7fff]
sbit RCLK=P0^5;
void shift_165(uchar *value)     // 编程时须注意cs_6116_138的值得更替
     {
      uint i,j;
      cs_6116_138=1 ;//选中138,G1=1
      cs_138=0 ;     //  G2B=0
   for(i=7;i<0;i++)  //共需要移动8字节,先移动数据的最后一个字节
       {
         AD_138=0x00;  //选中第二个165
         P0=value[i];  //送入并行数据
         AD_138=0x01;  //选中第三个165,第二个已锁定
         P0=0xaa; //将移位脉冲送入第三个165

         AD_138=0x10; //将第二个和第三个165锁定,然后就可以移位了  SH2=SH3=1
         for(j=0;j<8;j++)   //ALE信号产生8次 ,移位完成一次
             {
             P0=P0;
              }
        }

       AD_138=0x07; //选中74LS374
       RCLK=0;
       P0=P0;   //等待芯片反应时间
       RCLK=1;  //产生上升沿脉冲,数据由74LS595并行输出
     }


/*
*****************************************************************
** 子程序show_pcprocess入口参数:有效数据个数
** 子程序功能:处理有效的显示数据和显示模式,调用相应的显示函数
*****************************************************************
*/
void show_pcprocess(uint effectnum)
   {
    uint funs;
    *show_pcdata=&show_pc[0][12];         //指向有效显示数据首地址
    funs=*(&show_pc[0][12]+effectnum);    //提取显示模式控制字

    switch(funs)
          {
          case 0: show_left(show_pcdata,effectnum); break; 
//可以滚动显示所有内容
          case 1: show_right(show_pcdata); break; 
//只可以显示前面4汉字的容量数据
          case 2: show_up(show_pcdata); break; 
//只可以显示前面4汉字的容量数据,下同
          case 3: show_down(show_pcdata); break;
          case 4: show_upspread(show_pcdata); break;
          case 5: show_downspread(show_pcdata); break;
          case 6: show_middle(show_pcdata); break;
          }
   }

⌨️ 快捷键说明

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