/**********************************************
MCU: STC89C52
晶振:11.0592
网名:秋天里的落叶
日期:2014年5月11日21:56:00
功能:用1602显示 00:00:00 的简易时钟
**********************************************/
#include <reg52.h>
#define uchar8 unsigned char
#define uint16 unsigned int
uchar8 code tab[] = {'0','1','2','3','4','5','6','7','8','9'};
sbit RS = P3^5; //位定义 数据/命令选择端
sbit RW = P3^4; //位定义 读/写选择端
sbit EN = P3^3; //位定义 使能选择端
sbit Dula = P1^7; //段选
sbit Wela = P1^6; //位选
uint16 Stopwatch = 0;  //全局变量:用于秒表计时 f
uchar8 sec,min,hour;  //全局变量:秒钟,分钟,时钟
uchar8 a,b,c,d,e,f;    //全局变量:秒、分、时钟的个位和十位
void TimerInit(void);  //声明初始化函数
void delayms(uint16 t) //延时函数
{
   for(;t>0;t--);
}
void LCD_WrCom(uchar8 com) //写命令函数
{
   RS = 0;
  RW = 0;
   EN = 1;
  P0 = com;
   delayms(5);
   EN = 0;
}
void LCD_WrDat(uchar8 dat) //写数据函数
{
  RS = 1;
   RW = 0;
   EN = 1;
   P0 = dat;
   delayms(5);
  EN = 0;
}
void LCD_Init(void)
{
   EN = 0;
  Dula = 0;
   Wela = 0;
  LCD_WrCom(0x38); //功能设置:显示16位、两行、5*7点阵、8位数据接口
   LCD_WrCom(0x0c); //显示设置:打开显示,不显示光标且不闪烁
   LCD_WrCom(0x06); //输入设置:写入数据后,AC自动+1,屏幕不移动
  delayms(5);
   LCD_WrCom(0x01); //清屏
}
void main(void) //主函数
{
  TimerInit();  //定时器初始化
   LCD_Init();  //LCD初始化
   while(1)
   {
     sec = Stopwatch%60;        //秒钟分离
      min = (Stopwatch/60)%60;    //分钟分离
      hour = (Stopwatch/3600)%60;  //时钟分离
      a = sec%10;          //秒钟个位分离
      b = (sec/10)%10;      //秒钟十位分离
     c = min%10;          //分钟个位分离
      d = (min/10)%10;      //分钟十位分离
      e = hour%10;        //时钟个位分离
      f = (hour/10)%10;     //时钟十位分离
     LCD_WrCom(0x84);  //从第一行第四列显示 (写命令)
      LCD_WrDat(tab[f]);  //写数据
      LCD_WrCom(0x85);
      LCD_WrDat(tab[e]);
     LCD_WrCom(0x86);
      LCD_WrDat(':');
      LCD_WrCom(0x87);
      LCD_WrDat(tab[d]);
     LCD_WrCom(0x88);
      LCD_WrDat(tab[c]);
      LCD_WrCom(0x89);
     LCD_WrDat(':');
      LCD_WrCom(0x8A);
      LCD_WrDat(tab[b]);
     LCD_WrCom(0x8B);
      LCD_WrDat(tab[a]);
    }
}
void TimerInit(void) //定时器初始化函数
{
   TMOD = 0x02;  //设置定时器0为工作模式2
   TH0 = 0x47;   //定时器0赋初值
   TL0 = 0x00;   //时间设定为0.2ms
    EA = 1;     //打开总中断
   ET0 = 1;     //打开定时器0中断
    TR0 = 1;    //启动定时器0
}
void timer0(void) interrupt 1 //定时器0设置
{
    uint16 num;    //局部变量:定时器溢出位变量
    num++;
   if(num == 5000)  //num加5000次,说明1s时间到
    {
       Stopwatch++; //秒钟+1
       num = 0;
     }
}
如图片:
