?? 數字時鐘最終顯示程序.c
字號:
//P3口控制按鍵,P0口控制哪個數碼管亮,P1口控制數碼管亮的數字
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
//sbit P0_7=P0^7;//控制冒號閃爍,可不用
//--------字表----------
uchar code dispcode[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
//-------顯示位置-------
uchar dispbitcode[]={0xa0,0x90,0x88,0x84,0x82,0x81};
uchar second=0; //秒
uchar minite=0; //分
uchar hour=12; //小時
uchar ms=0; //時間累加數
uchar keynum=0; //按鍵次數
//-----延遲------
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//-------時間顯示---------
void display()
{
uchar m;
for(m=0;m<6;m++)
{
delay(2);
P0=dispbitcode[m]; //控制顯示位
switch(m) // 設置顯示數
{
case 0: P1=dispcode[second%10]; break;
case 1: P1=dispcode[second/10]; break;
case 2: P1=dispcode[minite%10]; break;
case 3: P1=dispcode[minite/10]; break;
case 4: P1=dispcode[hour%10]; break;
case 5: P1=dispcode[hour/10]; break;
}
}
}
//---buzhidao -----
void sdisplay(uchar dw)
{
uchar cc,i;
cc=0x03; //buzhidao
cc=~(cc<<dw);
for(i=0;i<6;i++)
{
delay(2);
P0=dispbitcode[i]&cc;
switch(i)
{
case 0: P1=dispcode[second%10]; break;
case 1: P1=dispcode[second/10]; break;
case 2: P1=dispcode[minite%10]; break;
case 3: P1=dispcode[minite/10]; break;
case 4: P1=dispcode[hour%10]; break;
case 5: P1=dispcode[hour/10]; break;
}
}
}
//--------分秒時調節時的閃爍--------
void shan()
{
uchar i;
if(keynum==1)
{
for(i=0;i<4;i++)
{
display();
}
for(i=0;i<4;i++)
{
sdisplay(4);
}
}
if(keynum==2)
{
for(i=0;i<4;i++)
{
display();
}
for(i=0;i<4;i++)
{
sdisplay(2);
}
}
if(keynum==3)
{
for(i=0;i<4;i++)
{
display();
}
for(i=0;i<4;i++)
{
sdisplay(0);
}
}
}
//--------鍵盤掃描-----------
void skycon()
{
if(key0==0)
{
delay(5);
if(key0==0)
{
TR0=0;//接受終端位復位,不允許中斷,也就是按鍵按下時,開始調時,秒鐘不動
while(!key0)//按鍵按下時依然顯示時間
{
display();
}
keynum++;
if(keynum==4) //退出時間調試
{
keynum=0;
TR0=1; //接受中斷位打開,秒鐘開始動
}
}
}
shan(); //被選位閃爍
if(keynum!=0)
{
if(key1==0 ) //加1
{
delay(5);
if(key1==0 )
{
if(keynum==1)
{
second++;
if(second==60)
{
second=0;
}
}
if(keynum==2)
{
minite++;
if(minite==60)
{
minite=0;
}
}
if(keynum==3)
{
hour++;
if(hour==24)
{
hour=0;
}
}
while(!key1) //去抖動,且一直顯示時間
{
display();
}
}
}
if(key2==0 ) //減1
{
delay(5);
if(key2==0 )
{
if(keynum==1)
{
second--;
shan();
if(second==-1)
{
second=59;
}
}
if(keynum==2)
{
minite--;
shan();
if(minite==-1)
{
minite=59;
}
}
if(keynum==3)
{
hour--;
shan();
if(hour==-1)
{
hour=23;
}
}
while(!key2)
{
display();
}
}
}
}
if(key3==0) //退出時間調試
{
delay(5);
if(key3==0)
{
keynum=0;
TR0=1;
}
while(!key3)
{display();}
}
}
void main()
{
TMOD=0x01; // 中斷始終以方式1打開
TH0=(65535-50000)/256; //每50ms 一次中斷
TL0=(65535-50000)%256;
TR0=1; //啟動定時器0
ET0=1;
EA=1;
while(1)
{
skycon();
display();
shan();
}
}
void time0() interrupt 1
{
TH0=(65535-50000)/256; //除中斷2可以自動分配時間外,其余中斷都得從新聲明
TL0=(65535-50000)%256;
ms++;
if(ms==20) //50x20=1000ms=1s
{
ms=0;
// P0_7=!P0_7;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -