標題: 定時器電子鐘,按鍵功能沒有作用,大蝦幫看一下 [打印本頁]

作者: szwsu    時間: 2012-2-21 08:48
標題: 定時器電子鐘,按鍵功能沒有作用,大蝦幫看一下
/***************************************************************************
名稱:用定時器定時做時鐘
內(nèi)容,自動從00-00-00開始,有按鍵功能
芯片型號:STC89C52RC
功能腳說明:P0為段選腳,P3為位選腳,所有引腳低電平有效.
程序員:玄溪
日期:2012.2.6
/***************************************************************************/
#include <reg52.h>
#define uchar unsigned char 
#define uint  unsigned int

uchar code du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit K1=P1^0;     //分+
sbit K2=P1^1;     //分-
sbit K3=P1^2;     //時+
sbit K4=P1^3;     //時-

uchar time;       //定義中斷時間次數(shù)
uchar second;      //定義秒
uchar minute;      //定義分
uchar hour;       //定義時
//===========延時函數(shù)============//
void delay()
{
 uchar j;
  for(j=0;j<200;j++);
}
//=========顯示秒函數(shù)=======//
void displaysecond(uchar s)    //帶返回值
{
 P3=0xbf;
 P0=du[s/10];
 delay();
 P3=0x7f;
 P0=du[s%10];
 delay();
 P3=0xff;
 if(K2==0)
 {
  s++;
  if(s==60)
  {
   s=0;
  }
 }
}
//========顯示分函數(shù)=============//
void displayminute(uchar m)
{
 P3=0xf7;
 P0=du[m/10];
 delay();
 P3=0xef;
 P0=du[m%10];
 delay();
 P3=0xdf;
 P0=0xbf;
 delay();
 P3=0xff;
 if(!K1)
 {
  delay();
  if(!K1)
  {
   TR0=0;
   m++;
   if(m==60)
   m=0;
  }
 }
 if(!K2)
 {
  delay();
  if(!K2)
  {
   TR0=0;
   m--;
   if(m==0)
   m=59;
  }
 }
 TR0=1;
}
//========顯示時函數(shù)==============//
void displayhour(uchar h)
{
 P3=0xfe;
 P0=du[h/10];
 delay();
 P3=0xfd;
 P0=du[h%10];
 delay();
 P3=0xfb;
 P0=0xbf;
 delay();
 P3=0xff;
 if(!K3)
 {
  delay();
  if(!K3)
  {
   TR0=0;
   h++;
   if(h==24)
   h=0;
  }
 }
 if(!K4)
 {
  TR0=0;
  delay();
  if(!K4)
  {
   h--;
   if(h==0)
   h=23;
  }
 }
 TR0=1;
}

//=============主函數(shù)============//
void main(void)
{
 TMOD=0x01;
 EA=1;
 ET0=1;
 TH0=(65536-46083)/256;     //賦初值
 TL0=(65536-46083)%256; 
 TR0=1;
 while(1)
 {
  displaysecond(second);
  delay();
  displayminute(minute);
  delay();
  displayhour(hour);
  delay();
 }
}
//=======定時器中斷子函數(shù)=================//
void inter0()interrupt 1
{
 time++;
 if(time==20)
 {
  time=0;
  second++;
 }
 if(second==60)
 {
  second =0;
  minute++;
 }
 if(minute==60)
 {
  minute=0;
  hour++;
 }
 if(hour==24)
 {
  hour=0;
 }
 TH0=(65536-46083)/256;     //賦初值
 TL0=(65536-46083)%256; 
}

作者: fancommand    時間: 2012-2-21 20:33

//=========顯示秒函數(shù)=======//
void displaysecond(uchar s)    //帶返回值
{
 P3=0xbf;
 P0=du[s/10];
 delay();
 P3=0x7f;
 P0=du[s%10];
 delay();
 P3=0xff;
 if(K2==0)
 {
  s++;
  if(s==60)
  {
   s=0;
  }
 }
}
你把上面程序的兩部分交換下試試. 不過整個程序布局不是很好,顯得有些冗亂.


作者: wtyycao    時間: 2012-2-21 21:19
不錯 很好 經(jīng)常來看看很好的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1