撿了一個單片機電路板,雙倒計時可設置的,帶存儲,一看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;
}
}
}
} |