用STC15F2K60S2单片机控制,带矩阵按键,大字显示倒计时,可实际用于比赛(为21日西门子逻辑控制比赛专做), 附所有项目代码,供参考
1.png

2.png

3.jpg

单片机源程序如下:
//LED屏控制程序   本程序驱动32*64LED彩色屏
  • //每一个单元屏传送2路数据
  • #include <stc15f2k60s2.H>
  • #include "common.h"
  • #include "delay.h"
  • #include "arkey.h"      //行列按键
  • #include "ledping.h"    //LED屏
  • #include "zk.h"
  • bit djs_F=0;              //倒计时标志
  • bit sec_F=0;              //秒标志
  • bit shun_F=0;             //闪烁标志
  • u8 timecount=0;           //时间计数
  • u8 data min,sec;
  • u8 data djs[4];                //倒计时数组
  • void Timer0Init(void)                //2ms@22.1184MHz晶振
  • {
  •         AUXR |= 0x80;                //?????1T??
  •         TMOD &= 0xF0;                //???????
  •         TL0 = 0x33;                //??????
  •         TH0 = 0x53;                //??????
  •         TF0 = 0;                //??TF0??
  •         TR0 = 1;                //???0????
  • }
  • void main()
  • {
  •         u8 data key,status;
  •   u16 m;
  •   Timer0Init();        //2ms定时初始始化
  •         SP=0xf0;
  •   while(1)
  •    {
  •                 if (status==0)
  •                 {         
  •                  key=KeyScan();
  •                  if (key!=0)                   //判断是否有按键
  •                  {
  • //                                 T_keyF=0;
  •                                  switch(key)
  •                {
  •                       case 0x01: status=5;   break;
  •                 case 0x02: status=6;   break;
  •                 case 0x03: status=7;   break;
  •                 case 0x04: status=8;   break;       //查询温度 DS18B20
  •                 case 0x05: status=9;   break;
  •                 case 0x06: status=10;   break;
  •                 case 0x07: status=11;  break;
  •                 case 0x08: status=12;  break;
  •                 case 0x09: status=13;  break;       //90分钟倒计时
  •                 case 0x0a: status=14;  break;       //倒计时开始
  • //                case 0x0b: status=15;  break;
  • //                case 0x0c: status=16;  break;
  • //                case 0x0d: status=17;  break;
  • //                case 0x0e: status=18;  break;
  • //                case 0x0f: status=19;  break;
  • //                case 0x10: status=20;  break;
  •                                  default: status=0;
  •                }
  •                                  key=0;                        //清空按键值
  •                          }
  •                  if (djs_F)
  •                  {
  •                          djsrun();                      //显示总时间
  •                          min=90;                        //分钟  (倒计时总时长)
  •                          sec=0;                         //秒
  •                  }
  •          }
  •                 else
  •                         if (status==5)
  •                         {
  •                                 dzdisp32(dz11,dz12,0);          //显示8个汉字
  •                                 m++;
  •                                 if (m>=500)
  •                                 {
  •                                         m=0;
  •                                         status=6;
  •                                 }
  •                         }
  •                 else
  •                         if (status==6)
  •                         {
  •                                 dzdisp32(dz21,dz22,0);
  •                                 m++;
  •                                 if (m>=500)
  •                                 {
  •                                         m=0;
  •                                         status=7;
  •                                 }
  •                         }        
  •                 else
  •                         if (status==7)
  •                         {
  •                                 dzdisp32(dz31,dz32,1);
  •                                 m++;
  •                                 if (m>=200)
  •                                 {
  •                                         m=0;
  •                                         status=8;
  •                                 }
  •                         }
  •                 else
  •                         if (status==8)
  •                         {
  •                                 dzdisp32(dz41,dz42,2);
  •                                 m++;
  •                                 if (m>=200)
  •                                 {
  •                                         m=0;
  •                                         status=9;
  •                                 }
  •                         }
  •                 else
  •                         if (status==9)
  •                         {
  •                                 dzdisp32(dz51,dz52,1);
  •                                 m++;
  •                                 if (m>=200)
  •                                 {
  •                                         m=0;
  •                                         status=5;
  •                                 }
  •                         }        
  •                         
  •                 else
  •                         if (status==13)               //90分钟倒计时
  •                         {
  •                                   djs_F=1;                  //倒计时功能设置
  •                                   xsinit();                 //显示内容初始化
  •                                         status=0;
  •                         }
  •                 else
  •                         if (status==14)               //90分钟倒计时开始
  •                         {
  •                                  ET0=1;
  •                                  EA=1;
  •                                  status=15;
  •                         }
  •                 else
  •                         if (status==15)               //倒计时
  •                         {
  •                                  if (sec_F)                 //秒标志
  •                                  {
  •                                          sec_F=0;                 //清除秒标志
  •                                          if (sec==0)
  •                                          {
  •                                                  if(min!=0)
  •                                                  {
  •                                                   sec=59;
  •                                                   min--;
  •                                                  }
  •                                                  if ((min==0)&&(sec==0))            //分钟和秒钟均走完
  •                                                  {EA=0;ET0=0;}
  •                                          }
  •                                          else
  •                                     sec--;
  •                                          djs[0]=min/10;
  •                                          djs[1]=min%10;
  •                                          djs[2]=sec/10;
  •                                          djs[3]=sec%10;
  • //                                         xsgx1();                  //更新显示缓冲区  1个缓冲区
  •                                          xsgx2();                    //更新显示缓冲区  2个缓冲区
  •                                  }
  •        djsrun();                     //倒计时运行        
  •      }                                 
  •          }
  • }
  • void time0() interrupt 1
  • {
  •         timecount++;
  •         if (timecount==250)               //500ms
  •         {
  •                 timecount=0;
  •                 shun_F=~shun_F;                 //闪烁标志求反
  •                 if (!shun_F)
  •                 {
  •                         sec_F=1;                      //产生1秒信号
  •                 }
  •         }
  • }
  • 复制代码