alanyuanjun

用1602做简易时钟

0
阅读(2346)
/**********************************************
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;
          }

}

如图片: