#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code shu[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //0~9
uchar code shu2[]={0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef}; //帶小數點0~9
uchar code wei[]={0xef,0xdf,0xbf,0x7f,0xf7,0xfb};//數碼管位選碼
uchar x[]={0,0,0,0};
uchar y[]={0,0,0,0,0,0};
uint hour=12,min,sec,h=22,m=0;
uint a,s1=1,s2=1,s3=0,i=0,status=0,num=0,class=0;
bit flag=0;
sbit P3_7=P3^7;
void delay(uint t);
void keyprint(unsigned char key);
void display();
void timer0();
void sint()interrupt 4 //串口中斷,實作PC上快速設定時間與鬧鐘
{
s3++;
s3=s3%4;
if(RI&&s3==1)
{
RI=0;
hour=SBUF;
}
if(RI&&s3==2)
{
RI=0;
min=SBUF;
}
if(RI&&s3==3)
{
RI=0;
h=SBUF;
}
if(RI&&s3==0)
{
RI=0;
m=SBUF;
}
if(!TI)
TI=0;
}
void delay(uint t)
{
uint i;
while(t--)
for(i=0;i<125;i++);
}
main()
{
uchar n;
uchar input;
n=0x0f;
TMOD=0x21;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
TR1=1;
IP=0x10;
TR0=1;
IE=0x92; //開定時器0,串口中斷
while(1) //鍵掃描程式
{
input=P2&0x0f;
if(input!=0x0f&&s1==1)
{
delay(10);
s1=0;
if(input!=0x0f&&s2==1)
{
s2=0; //按住不放
n = input; //n用來暫時存放鍵值
}
}
if(input==0x0f&&s1==0)
{
s1=1;
s2=1;
keyprint(n);
n=0x0f;
}
if((hour==h&&min==m)||(h!=0&&min==0))
{
if(sec==0)
P3_7=0;
if(sec==1)
P3_7=1;
if(sec==2)
P3_7=0;
if(sec==3)
P3_7=1;
if(sec==4)
P3_7=0;
if(sec==5)
P3_7=1;
}
else
P3_7=1;
if(h>=24)
h=0;
display();
}
}
void keyprint(unsigned char key) //各個按鍵功能
{
if(key==0x0e)
{
num++;
if(num==1) {class=1;}
if(num==2) {class=2;num=0;}
}
if(key==0x0d)
{
status++;
if(status>=5)
status=0;
}
if(key==0x0b)
{
if(status==1)
{
if(min<59) min++;
else {min=0;hour++;}
}
if(status==2)
{
if(hour<23) hour++;
else hour=0;
}
if(status==3)
{
if(m<59) m++;
else {m=0;h++;}
}
if(status==4)
{
if(h<23) h++;
else h=0;
}
}
}
void display() //數碼管數值顯示函式
{
uchar d=0;
if(class==1||class==0)
{
x[0]=hour/10; // 顯示時的十位
x[1]=hour%10; // 顯示時的個位
x[2]=min/10; // 顯示分的十位
x[3]=min%10; // 顯示分的個位
while(d<4)
{
P2=wei[d];
P0=shu[x[d]];
delay(1);
d++;
}
}
else if(class==2)
{
y[0]=h/10; // 顯示時的十位
y[1]=h%10; // 顯示時的個位
y[2]=m/10; // 顯示分的十位
y[3]=m%10; // 顯示分的個位
d=0;
if(flag==0) // 每過0.5s小數點閃爍一次
{
while(d<4)
{
P2=wei[d];
P0=shu2[y[d]];
delay(1);
d++;
}
}
else if(flag==1)
{
while(d<4)
{
P2=wei[d];
P0=shu[y[d]];
delay(1);
d++;
}
}
}
}
void timer0() interrupt 1 //定時器0方式1中斷函式
{
uint count;
TH0=(65536-5000)/256; // 定時器0設定初始值1ms中斷初始值
TL0=(65536-5000)%256;
TR0=1;
count++; //正常計時
if(count>=100)
{
flag=1;
if(count>=200) // 定時 1S 到,以下為時鐘的正常走鐘邏輯
{
flag=0;
count=0;
sec++;
if(sec>= 60)
{
sec=0;
min++; //秒到60分加一,秒清零
}
if(min>= 60)
{
min=0;
hour++; //分到60時加一,分清零
}
if(hour>= 24)
{
hour=0; //時到24立即變為0
}
}
}
}
uj5u.com熱心網友回復:
急用啊 大神們uj5u.com熱心網友回復:
too long; didn't readuj5u.com熱心網友回復:
不是很簡單,就是控制數位管的顯示,沒有高深的語法,就是一些條件判斷跟賦值而已,你耐心自己讀一遍就懂了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/75943.html
標籤:基礎類
