用STC15F2K60S2单片机控制,带矩阵按键,大字显示倒计时,可实际用于比赛(为21日西门子逻辑控制比赛专做), 附所有项目代码,供参考
单片机源程序如下:
- //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秒信号
- }
- }
- }
复制代码
所有资料51hei提供下载:
64X128比赛用倒计时器.rar
(133.91 KB, 下载次数: 33)
|