先說下,妳的程序格式寫的太占用空間了,而且看著也不夠整潔
已經幫妳都註釋了,格式也做了調整,部分沒有調整,方便添加註釋
/***************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P26=P2^6; sbit P27=P2^7;//數碼管片選控制用端口定義
sbit P20 =P2^0; sbit P21 =P2^1; sbit P22 =P2^2;//按鍵端口定義
uchar tt,a,b,c,d,e,f,second,minite, hour;//定義時分秒變量
uchar code smg[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//數碼管控制位
uchar code shuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xbf};//數字0-9
void display(uchar a,uchar b,uchar c,uchar d ,uchar e,uchar f);//數碼管顯示函數定義
void delay(uint z);//延時函數定義
/***************************************************************************/
void keyscan()
{
TR1=0;//關閉定時器
P2 |=0x07;//初始化 P2 端口狀態
if(P20==0)//如果按鍵被按下
{
delay(10);//延時去抖動
{
if(P20==0)//再次判斷按鍵是否被按下
{
hour++;//小時 加壹
if(hour==24){hour=0;}//如果達到24小時,則從0在開始
while(P20==0);//等待該按鍵松開
}
}
}//以下類推
if(P21==0){delay(10);if(P21==0){minite++;if(minite==60)minite=0;while(P21==0);}}
if(P22==0){delay(10);if(P22==0){second++;if(second==60)second=0;while(P22==0);}}
TR1=1;//打開定時器
}
/***************************************************************************/
void main()
{
hour=12; //初始化小時 變量
TMOD=0x10; ? //設置定時器1和計數器0
TH1=(65536-50000)/256; //定時器裝初值,高四位
TL1=(65536-50000)%256; //定時器裝初值,低四位
TR1=1; //啟動定時器1
ET1=1; //啟動定時器1中斷
EA=1; //開總中斷
P2 |=0x07; //初始化 P2 端口狀態
while(1) //主循環
{
keyscan(); //調用按鍵處理函數
if(tt==60){tt=0;second++;} //如果達到60毫,秒加壹
if(second==60){second=0;minite++;} //如果達到60秒,分加壹
if(minite==60){minite=0;hour++;} //如果達到60分,小時加壹
if(hour==24){hour=0;} //如果達到24小時,則從0在開始
f=second%10; e=second/10; //分離秒個位與十位的數值
d=minite%10; c=minite/10; //分離分個位與十位的數值
b=hour%10; ? a=hour/10; //分離小時個位與十位的數值
}
}
/***************************************************************************/
void display(uchar a,uchar b,uchar c,uchar d ,uchar e,uchar f)//數碼管顯示函數
{
P27=1; P1=smg[7]; P27=0; P26=1; P1=shuzi[f]; ?P26=0; P1=0; delay(1);//秒個位
P27=1; P1=smg[6]; P27=0; P26=1; P1=shuzi[e]; P26=0; P1=0; delay(1);//秒十位
P27=1; P1=smg[5]; P27=0; P26=1; P1=0xbf; ?P26=0; P1=0; delay(1);//分隔符
P27=1; P1=smg[4]; P27=0; P26=1; P1=shuzi[d]; P26=0; P1=0; delay(1);//分個位
P27=1; P1=smg[3]; P27=0; P26=1; P1=shuzi[c]; P26=0; P1=0; delay(1);//分十位
P27=1; P1=smg[2]; P27=0; P26=1; P1=0xbf; ?P26=0; P1=0; delay(1);//分隔符
P27=1; P1=smg[1]; P27=0; P26=1; P1=shuzi[b]; P26=0; P1=0; delay(1);//時個位
P27=1; P1=smg[0]; P27=0; P26=1; P1=shuzi[a]; P26=0; P1=0; delay(1);//時十位
}
/***************************************************************************/
void timer1() interrupt 3 //定時器中斷函數
{
TH1=(65536-10000)/256; TL1=(65536-10000)%256;//重裝定時器初值
tt++; display(a,b,c,d,e,f);//計數器 tt 累加,以及調用數碼管顯示函數
}
/***************************************************************************/
void delay(uint z) //延時函數
{uint t1,y; for(t1=z;t1>0;t1--){for(y=125;y>0;y--);}}//標準的 for 嵌套循環
/***************************************************************************/