捡了一个单片机电路板,双倒计时可设置的,带存储,一看stc的单片机,没事仿一个,不是很专业,具体功能是有了,按键这一块处理感觉有点难,感觉挺复杂的,挂上给初学者看看。高手可以略过了。或者指点一下也行
#include "STC8fxx.H" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.H"
#include "delay.H"
#include "DigDisplay.H"
#include "EEPROM.H"
#include "key.H"
#include "Timer0.H"
#define uint unsigned int //对数据类型进行声明定义
#define uchar unsigned char //对数据类型进行声明定义
/*****************************************
* 定义全局变量
**************************************/
uchar code smgduan[12]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f,0x77,0x7c};
uchar temp1,temp2,temp3,temp4;
uchar DisplayData[4];
uchar a,b;
uint hs;
bit s=0,k=0;
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
uchar q;
out=1;
Delay_ms(500);
temp1=IapRead(0x0400);//读取eeprom数据
Delay_ms(5);
temp2=IapRead(0x0401);
Delay_ms(5);
temp3=IapRead(0x0500);
Delay_ms(5);
temp4=IapRead(0x0501);
Delay_ms(5);
while(k5==0&&k==0) //模式1
{
a=temp1; //将读取的数据赋值
b=temp2;
s=1;
Timer0();
while(s)
{
DigDisplay();
datapros();
if(k1==0)
{
DigDisplay();
DigDisplay();
if(k1==0)
{
k=1;
TR0=0;
break;
}
}
if(k5==1)break;
}
}
while(k5==1&&k==0)
{
a=temp3;
b=temp4;
s=1;
Timer0();
while(s)
{
DigDisplay();
datapros();
if(k1==0)
{
Delay_ms(2000);
if(k1==0)
{
k=1;
TR0=0;
break;
}
}
if(k5==0)break;
}
}
while(k==1)
{
uchar keya=KeyScan();
out=1;
DigDisplay();
if(k1==0)
{
Delay_ms(20);
if(k1==0)
{
while(!k1)DigDisplay();
q=q+1;
if(q>4)q=0;
}
}
switch(q)
{
case 0: break;
case 1:
DisplayData[0]=0x77;
DisplayData[1]=smgduan[1];
DisplayData[2]=smgduan[temp1/10];
DisplayData[3]=smgduan[temp1%10];
switch(keya)
{
//case 1: keynum++;if(keynum==100)keynum=0; break;
case 2: if(temp1>0)temp1--; break;
case 3: if(temp1<99)temp1++;else if(temp1>=99)temp1=99; break;
// case 0: break;
}
break;
case 2:
DisplayData[0]=0x77;
DisplayData[1]=smgduan[2];
DisplayData[2]=smgduan[temp2/10];
DisplayData[3]=smgduan[temp2%10];
switch(keya)
{
//case 1: keynum++;if(keynum==100)keynum=0; break;
case 2: if(temp2>0)temp2--; break;
case 3: if(temp2<99)temp2++;else if(temp2>=99)temp2=99; break;
//case 4: break;
}
break;
case 3:
DisplayData[0]=0x7c;
DisplayData[1]=smgduan[1];
DisplayData[2]=smgduan[temp3/10];
DisplayData[3]=smgduan[temp3%10];
switch(keya)
{
//case 1: keynum++;if(keynum==100)keynum=0; break;
case 2: if(temp3>0)temp3--; break;
case 3: if(temp3<99)temp3++;else if(temp3>=99)temp3=99; break;
//case 4: break;
}
break;
case 4:
DisplayData[0]=0x7c;
DisplayData[1]=smgduan[2];
DisplayData[2]=smgduan[temp4/10];
DisplayData[3]=smgduan[temp4%10];
switch(keya)
{
//case 1: keynum++;if(keynum==100)keynum=0; break;
case 2: if(temp4>0)temp4--; break;
case 3: if(temp4<99)temp4++;else if(temp4>=99)temp4=99; break;
//case 4: break;
}
break;
}
if(k4==0)
{
Delay_ms(20);
if(k4==0)
{
while(!k4);
IapErase(0x400);
Delay_ms(50);
IapErase(0x500);
Delay_ms(50);
IapProgram(0x400, temp1);
Delay_ms(50);
IapProgram(0x401, temp2);
Delay_ms(50);
IapProgram(0x500, temp3);
Delay_ms(50);
IapProgram(0x501, temp4);
Delay_ms(50);
k=0;
}
}
}
}
/*******************************************************************************
* 函 数 名 : 定时器0中断函数
* 函数功能 :
***********************************************************************************************************
* 函 数 名 : 定时器0中断函数
* 函数功能 :
*******************************************************************************/
void Timer0Init() interrupt 1
{
TH0=0X0FE; //给定时器赋初值,定时1ms
TL0=0X0C;
hs++;
if(hs==1000)
{
if(out==1)
{
a--;
hs=0;
if(a==0)out=0;
}
else if(out==0)
{
b--;
hs=0;
if(b==0)
{
out=1;
s=0;
TR0=0;
}
}
}
} |