/**********************************************
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;
}
}
如图片: