单片机源程序如下:
//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秒信号 } } }
复制代码