前言
今年单片机试题比14届可以说是简单太多了(参加过14届,直接被创死555),题主提前两小时就交卷了,最后也是稳定拿下省一进入国赛(嘿嘿)。
一、问题重现
二、代码实现
下面给出main.c,而其他部分子函数由于较为基础,不再赘述。可前往stc15单片机进一步了解其他子函数的来源。
#include "main.h"
#include "key_smg.h"
#include "timer.h"
#include "ds1302.h"
#include "iic.h"
u8 smgflash=0;
u8 showpage=0,setpage=0,huixianpage=0;
u8 keyflash=0,keytemp=0,keynum=0;
u16 f=0,fflash=0,flimit=2000;
u8 fmaxtime[3]={0,0,0};
int fjiaozun=0;
long ftemp=0,fmax=0;
u8 led[]={1,1,1,1,1,1,1,1};u8 led1=0;
#define ledset outputp0(0x80,led[0]*1+led[1]*2+led[2]*4+led[3]*8+led[4]*16+led[5]*32+led[6]*64+led[7]*128)
void smgshowflash();
void keyfun();
void page0();
void page1();
void page2();
void page3();
void smgshowpage()
{
if(showpage==0)
{
page0();
}
else if(showpage==1)
{
page1();
}
else if(showpage==2)
{
page2();
}
else if(showpage==3)
{
page3();
}
}
void fun()
{
if(ftemp>fmax)
{
fmax=ftemp;
ds1302read();
fmaxtime[0]=ds1302dectime[0];
fmaxtime[1]=ds1302dectime[1];
fmaxtime[2]=ds1302dectime[2];
}
if(ftemp<0)
{
pcf_da(0);
}
else if(ftemp<=500&&ftemp>=0)
{
pcf_da(51);
}
else if(ftemp<=fmax&&ftemp>500)
{
pcf_da(256*4*(ftemp-500)/(fmax-500)/5+256/5);
}
if(led1>=200)
{
led1=0;
if(showpage==0)
{
if(ftemp>flimit)
{
led[0]=!led[0];
led[1]=!led[1];
ledset;
}
else if(ftemp<=flimit)
{
if(ftemp>=0)
{
led[1]=1;
led[0]=!led[0];
ledset;
}
else if(ftemp<0)
{
led[1]=0;
led[0]=!led[0];
ledset;
}
}
}
else if(showpage!=0)
{
led[0]=1;
if(ftemp>flimit)
{
led[1]=!led[1];
ledset;
}
else if(ftemp<=flimit)
{
if(ftemp>=0)
{
led[1]=1;
ledset;
}
else if(ftemp<0)
{
led[1]=0;
ledset;
}
}
}
}
}
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
outputp0(0x80,0xff);
outputp0(0xa0,0x00);
ds1302set();
Timer1_Init();
Timer0_Init();
Delay1000ms();
while(1)
{
keyfun();fun();smgshowpage();
}
}
void Timer0_Isr(void) interrupt 1
{
f++;
}
void Timer1_Isr(void) interrupt 3
{
smgflash++;smgshowflash();
keyflash++;
fflash++;
if(fflash>=1000)
{
fflash=0;
ftemp=f;
ftemp+=fjiaozun;
f=0;
}
led1++;
}
void keyfun()
{
if(keyflash>=25)
{
keyflash=0;
keytemp=keyvalue();
}
if(keytemp)
{
keynum=keytemp;
keytemp=0;
}
if(keynum==4)
{
showpage++;
showpage%=4;
smgoff();
if(showpage==1)
{
setpage=0;
}
else if(showpage==3)
{
huixianpage=0;
}
keynum=0;
}
else if(keynum==5)
{
if(showpage==1)
{
setpage++;
setpage%=2;
smgoff();
}
else if(showpage==3)
{
huixianpage++;
huixianpage%=2;
smgoff();
}
keynum=0;
}
else if(keynum==8)
{
if(showpage==1)
{
if(setpage==0)
{
flimit+=1000;
if(flimit>=10000)
flimit=1000;
}
if(setpage==1)
{
fjiaozun+=100;
if(fjiaozun>=1000)
fjiaozun=-900;
}
}
keynum=0;
}
else if(keynum==9)
{
if(showpage==1)
{
if(setpage==0)
{
flimit-=1000;
if(flimit<=0)
flimit=9000;
}
if(setpage==1)
{
fjiaozun-=100;
if(fjiaozun<=-1000)
fjiaozun=900;
}
}
keynum=0;
}
}
void smgshowflash()
{
if(smgflash>=2)
{
smgflash=0;
smgloop();
}
}
void page0()
{
segsy[0]=15;
if(ftemp>=10000)
{
segsy[3]=ftemp/10000%10;
segsy[4]=ftemp/1000%10;
segsy[5]=ftemp/100%10;
segsy[6]=ftemp/10%10;
segsy[7]=ftemp%10;
}
else if(ftemp>=1000)
{
segsy[3]=16;
segsy[4]=ftemp/1000%10;
segsy[5]=ftemp/100%10;
segsy[6]=ftemp/10%10;
segsy[7]=ftemp%10;
}
else if(ftemp>=100)
{
segsy[3]=16;
segsy[4]=16;
segsy[5]=ftemp/100%10;
segsy[6]=ftemp/10%10;
segsy[7]=ftemp%10;
}
else if(ftemp>=10)
{
segsy[3]=16;
segsy[4]=16;
segsy[5]=16;
segsy[6]=ftemp/10%10;
segsy[7]=ftemp%10;
}
else if(ftemp>=0)
{
segsy[3]=16;
segsy[4]=16;
segsy[5]=16;
segsy[6]=16;
segsy[7]=ftemp%10;
}
else if(ftemp<0)
{
segsy[3]=16;
segsy[4]=16;
segsy[5]=16;
segsy[6]=20;
segsy[7]=20;
}
}
void page1()
{
if(setpage==0)
{
segsy[0]=18;
segsy[1]=1;
segsy[4]=flimit/1000%10;
segsy[5]=flimit/100%10;
segsy[6]=flimit/10%10;
segsy[7]=flimit%10;
}
else if(setpage==1)
{
segsy[0]=18;
segsy[1]=2;
if(fjiaozun<0)
{
segsy[4]=17;
segsy[5]=-1*fjiaozun/100%10;
segsy[6]=-1*fjiaozun/10%10;
segsy[7]=-1*fjiaozun%10;
}
else if(fjiaozun>0)
{
segsy[4]=16;
segsy[5]=fjiaozun/100%10;
segsy[6]=fjiaozun/10%10;
segsy[7]=fjiaozun%10;
}
else if(fjiaozun==0)
{
segsy[4]=16;
segsy[5]=16;
segsy[6]=16;
segsy[7]=0;
}
}
}
void page2()
{
ds1302read();
segsy[0]=ds1302dectime[0]/10;
segsy[1]=ds1302dectime[0]%10;
segsy[2]=17;
segsy[3]=ds1302dectime[1]/10;
segsy[4]=ds1302dectime[1]%10;
segsy[5]=17;
segsy[6]=ds1302dectime[2]/10;
segsy[7]=ds1302dectime[2]%10;
}
void page3()
{
if(huixianpage==0)
{
segsy[0]=19;
segsy[1]=15;
if(fmax>=10000)
{
segsy[3]=fmax/10000%10;
segsy[4]=fmax/1000%10;
segsy[5]=fmax/100%10;
segsy[6]=fmax/10%10;
segsy[7]=fmax%10;
}
else if(fmax>=1000)
{
segsy[3]=16;
segsy[4]=fmax/1000%10;
segsy[5]=fmax/100%10;
segsy[6]=fmax/10%10;
segsy[7]=fmax%10;
}
else if(fmax>=100)
{
segsy[3]=16;
segsy[4]=16;
segsy[5]=fmax/100%10;
segsy[6]=fmax/10%10;
segsy[7]=fmax%10;
}
else if(fmax>=10)
{
segsy[3]=16;
segsy[4]=16;
segsy[5]=16;
segsy[6]=fmax/10%10;
segsy[7]=fmax%10;
}
else if(fmax>=0)
{
segsy[3]=16;
segsy[4]=16;
segsy[5]=16;
segsy[6]=16;
segsy[7]=fmax%10;
}
}
else if(huixianpage==1)
{
segsy[0]=19;
segsy[1]=10;
segsy[2]=fmaxtime[0]/10;
segsy[3]=fmaxtime[0]%10;
segsy[4]=fmaxtime[1]/10;
segsy[5]=fmaxtime[1]%10;
segsy[6]=fmaxtime[2]/10;
segsy[7]=fmaxtime[2]%10;
}
}
总结
国赛冲冲冲!!!