找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4241|回复: 2
打印 上一主题 下一主题
收起左侧

定时器电子钟,按键功能没有作用,大虾帮看一下

[复制链接]
跳转到指定楼层
楼主
ID:4302 发表于 2012-2-21 08:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***************************************************************************
名称:用定时器定时做时钟
内容,自动从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;       //定义中断时间次数
uchar second;      //定义秒
uchar minute;      //定义分
uchar hour;       //定义时
//===========延时函数============//
void delay()
{
 uchar j;
  for(j=0;j<200;j++);
}
//=========显示秒函数=======//
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;
  }
 }
}
//========显示分函数=============//
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;
}
//========显示时函数==============//
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;
}

//=============主函数============//
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();
 }
}
//=======定时器中断子函数=================//
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; 
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:34181 发表于 2012-2-21 20:33 | 只看该作者

//=========显示秒函数=======//
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;
  }
 }
}
你把上面程序的两部分交换下试试. 不过整个程序布局不是很好,显得有些冗乱.

回复

使用道具 举报

板凳
ID:34658 发表于 2012-2-21 21:19 | 只看该作者
不错 很好 经常来看看很好的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表