|
#include<reg51.h>
#include<intrins.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define key_group P1
uint time=0;
uint ss=00;
uint key_time;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽(yáng)極0-9的段碼
uchar key,key_temp,state_key;
int clock=0; //時(shí)鐘初值,默認(rèn)為0
int coundown=60; //倒計(jì)時(shí),默認(rèn)60s
int kaiji=0; //上電后進(jìn)行時(shí)鐘的設(shè)置
char num_show[4];
int show_num=0;
int up=0; //按鍵松開(kāi)
int choose_num=0;
int state=0;
int count_state=0;
int count=0;
int num1=0,num2=0;
int result=0,add_state=0;
int stopwatch_state=0;
int clock_time=0,clock_ss=0;
int mm=0;
void Display();
void Type();
void anjian4();
void anjian3();
void anjian2();
void anjian1();
void jiafa();
void shizhong();
void miaobiao();
void daojishi();
void keyscan();
void main()
{
num_show[0]=clock/60/10;
num_show[1]=clock/60%10;
num_show[2]=clock%60/10;
num_show[3]=clock%60%10;
TMOD=0x01;//計(jì)時(shí)器0以工作方式1計(jì)時(shí)
EA=1;//打開(kāi)全局中斷允許
ET0=1;//打開(kāi)定時(shí)器0中斷允許位
TR0=1;//啟動(dòng)定時(shí)器0
TH0=(65535-1000)/256; //定時(shí)器初值 1ms
TL0=(65535-1000)%256;
while(1)
{
Display();
}
}
void ET_T0() interrupt 1
{
TH0=(65535-1000)/256; //定時(shí)器初值 1ms
TL0=(65535-1000)%256;
show_num++;
if(show_num>7)
show_num=0;
key_time++;
keyscan();
if(kaiji==2) //兩個(gè)初值都設(shè)置完畢
{
anjian1();
}
anjian3();
anjian2();
anjian4();
if(count_state==1) //倒計(jì)時(shí)的狀態(tài)變量
{
daojishi();
}
if(stopwatch_state==1) //秒表的狀態(tài)變量
{
miaobiao();
}
if(kaiji==2)
{
shizhong();
}
}
void Display(void)
{
switch(show_num)
{
case 0:
P2=0XF0;
P0=table[num_show[0]];
break;
case 1:
P0=table[num_show[0]];
P2=0XF1;
break;
case 2:
P2=0XF0;
P0=table[num_show[1]];
break;
case 3:
P0=table[num_show[1]];
P2=0xF2;
break;
case 4:
P2=0XF0;
P0=table[num_show[2]];
break;
case 5:
P0=table[num_show[2]];
P2=0xF4;
break;
case 6:
P2=0XF0;
P0=table[num_show[3]];
break;
case 7:
P0=table[num_show[3]];
P2=0xF8;
break;
default:break;
}
}
void Type(void)
{
switch(state)
{
case 0: //時(shí)鐘模式
count_state=0;
stopwatch_state=0;
num_show[0]=clock/60/10;
num_show[1]=clock/60%10;
num_show[2]=clock%60/10;
num_show[3]=clock%60%10;
break;
case 1: //加法模式
count_state=0;
stopwatch_state=0;
choose_num=0;
num_show[0]=num1/1000;
num_show[1]=num1%1000/100;
num_show[2]=num1%100/10;
num_show[3]=num1%10;
break;
case 2: //倒計(jì)時(shí)模式
count_state=0;
stopwatch_state=0;
time=0;
ss=0;
num_show[0]=coundown/1000;
num_show[1]=coundown%1000/100;
num_show[2]=coundown%100/10;
num_show[3]=coundown%10;
break;
case 3: //秒表模式
count_state=0;
stopwatch_state=0;
time=0;
ss=0;
num_show[0]=ss/1000;
num_show[1]=ss%1000/100;
num_show[2]=ss%100/10;
num_show[3]=ss%10;
break;
default:break;
}
}
void keyscan(void)
{
switch(state_key)
{
case 0:
key_temp=(key_group&0x0f);
if(key_temp!=0x0f)
{
key_time=0;
state_key=1;
}
break;
case 1:if(key_time>=1000)
{
if(key_temp==0x0f)
{
state_key=0;
}
else
{
state_key=2;
break;
}
}
break;
case 2:if(key_temp==0x0e)
{key=1;}
else if(key_temp==0x0d)
{key=2;}
else if(key_temp==0x0b)
{key=3;}
else if(key_temp==0x07)
{key=4;}
else
{
key_temp=0x0f;
state_key=0;
key=0;
break;
}
state_key=3;
break;
case 3:if((key_group&0x0f)==0x0f)
{
key_temp=0x0f;
state_key=0;
}
break;
}
}
void anjian4(void)
{
if(key==4) //切換數(shù)字|等于按鍵/倒計(jì)時(shí),秒表開(kāi)始暫停按鍵
{
if(kaiji==0)
{
kaiji=1;
choose_num=0;
if((num_show[0]*10+num_show[1])<=23&&num_show[2]*10+num_show[3]<=59) //小于23:59
clock=(num_show[0]*10+num_show[1])*60+num_show[2]*10+num_show[3]; //不然還是默認(rèn)值
num_show[0]=coundown/1000;
num_show[1]=coundown%1000/100;
num_show[2]=coundown%100/10;
num_show[3]=coundown%10;
}
else if(kaiji==1)
{
kaiji=2;
choose_num=0;
coundown=num_show[0]*1000+num_show[1]*100+num_show[2]*10+num_show[3];
//開(kāi)始時(shí)鐘
num_show[0]=clock/60/10;
num_show[1]=clock/60%10;
num_show[2]=clock%60/10;
num_show[3]=clock%60%10;
}
if(state==2) //倒計(jì)時(shí)
{
if(count_state==0)
{
count_state=1; //開(kāi)始
}
else
{
count_state=0; //暫停
}
}
else if(state==3) //秒表
{
if(stopwatch_state==0)
{
stopwatch_state=1; //開(kāi)始
}
else
{
stopwatch_state=0; //暫停
}
}
else if(state==1) //加法
{
jiafa();
}
}
}
void anjian3()
{
if(key==3) //切換數(shù)碼管按鍵||秒表清零鍵||倒計(jì)時(shí)復(fù)位鍵
{
up=1;
if(kaiji<=1||state==1)
{
choose_num++;
if(choose_num>=4)
choose_num=0;
}
if(state==2)
{
if(count_state==0)
{
num_show[0]=coundown/1000;
num_show[1]=coundown%1000/100;
num_show[2]=coundown%100/10;
num_show[3]=coundown%10;
ss=0;
time=0;
}
}
if(state==3)
{
if(stopwatch_state==0)
{
ss=0;
num_show[0]=ss/1000;
num_show[1]=ss%1000/100;
num_show[2]=ss%100/10;
num_show[3]=ss%10;
time=0;
}
}
}
}
void anjian2(void)
{
if(key==2) //加1鍵
{
if(kaiji<=1||state==1)
{
if(num_show[choose_num]<9)
{
num_show[choose_num]++;
}
else
num_show[choose_num]=0;
}
}
}
void anjian1(void)
{
if(key==1) //模式切換按鍵
{
state++;
Type();
if(state>3)
state=0;
}
}
/**************加法模塊***************/
void jiafa()
{
add_state++;
if(add_state==1)
{
num1=num_show[0]*1000+num_show[1]*100+num_show[2]*10+num_show[3];
choose_num=0; //位選歸0
num_show[0]=num2/1000;
num_show[1]=num2%1000/100;
num_show[2]=num2%100/10;
num_show[3]=num2%10;
}
if(add_state==2) //計(jì)算結(jié)果
{
num2=num_show[0]*1000+num_show[1]*100+num_show[2]*10+num_show[3];
result=num1+num2;
if(result<=9999)
{
num_show[0]=result/1000;
num_show[1]=result%1000/100;
num_show[2]=result%100/10;
num_show[3]=result%10;
}
else
{
num_show[0]=9999/1000;
num_show[1]=9999%1000/100;
num_show[2]=9999%100/10;
num_show[3]=9999%10;
}
}
if(add_state>=3)
{
add_state=0;
num1=0;
num2=0;
result=0;
choose_num=0;
num_show[0]=num1/1000;
num_show[1]=num1%1000/100;
num_show[2]=num1%100/10;
num_show[3]=num1%10;
}
}
/*************時(shí)鐘模塊************/
void shizhong(void)
{
clock_time++;
if(clock_time>=1000) //1ms*1000=1s
{
clock_time=0;
clock_ss++;
if(clock_ss>=60)
{
clock++;
clock_ss=0;
if(clock==1440)
clock=0;
if(state==0)
{
num_show[0]=clock/60/10;
num_show[1]=clock/60%10;
num_show[2]=clock%60/10;
num_show[3]=clock%60%10;
}
}
}
}
/*************秒表模塊*************/
void miaobiao(void)
{
time++;
if(time==1000) //1ms*1000=1s
{
time=0;
if(ss!=9999)
ss++;
else
stopwatch_state=0;
num_show[0]=ss/1000;
num_show[1]=ss%1000/100;
num_show[2]=ss%100/10;
num_show[3]=ss%10;
}
}
/**********倒計(jì)時(shí)模塊**********/
void daojishi(void)
{
time++;
if(time==1000) //1s
{
if(ss!=coundown)
ss++;
else
count_state=0;
time=0;
num_show[0]=(coundown-ss)/1000;
num_show[1]=(coundown-ss)%1000/100;
num_show[2]=(coundown-ss)%100/10;
num_show[3]=(coundown-ss)%10;
}
}
|
-
捕獲.PNG
(24.06 KB, 下載次數(shù): 39)
下載附件
2019-6-9 10:13 上傳
這是我的電路圖
|