//******** 文 件 名: lcd_time ************
//******** 功能概要: LCD液晶显示时间 ***********
//******** 说明: 调时、报时、闹钟 ***********
//**********头文件区************
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<intrins.h>
//*********宏定义方便使用*******
#define uchar unsigned char
#define uint unsigned int
//*********定义变量区***********
sbit dula=P2^6; //数码管段选
sbit wela=P2^7; //数码管位选
sbit lcden=P3^4; //LCD使能信号
sbit lcdrs=P3^5; //LCD数据/命令选择信号
uchar code tab_index[]="www.wch16621.cn";
uchar tab_time[]={0,0,10,0,0,10,0,0}; //装时间转换数据
uchar code tab_char[]="0123456789:"; //
uchar code tab_chartime[]="Time ";
uchar count,hour=22,minu=58,sec=26;
//*********函数声明区*****************
void lcd_dis(); //lcd显示函数
void lcd_init(); //LCD初始化函数
void write_com(uchar); //写命令函数
void write_data(uchar); //写数据函数
void delay(uint); //延时函数
void trans(); //时间转换函数
void write_char(); //写字符串函数
void int_time0(); //定时器0中断函数
void time(); //计时函数
//*********主函数开始***********
void main()
{
TMOD=0x01; //定时器0方式1
EA=1;
ET0=1;
TH0=0xb8; //20ms初值,11.0592MHZ
TL0=0X00;
TR0=1;
write_com(1);
lcd_init();
while(1)
{
time();
trans();
lcd_dis();
}
}
void int_time0() interrupt 1
{
TMOD=0x01; //定时器0方式1
EA=1;
ET0=1;
TH0=0xb8;
TL0=0X00; ////20ms初值,11.0592MHZ
TR0=1;
count++;
}
void time()
{
if(count>=50) //20ms*50=1s
{
count=0;
sec++;
if(sec>=60)
{
sec=0;
minu++;
if(minu>=60)
{
minu=0;
hour++;
if(hour>=24)
{
hour=0;
}
}
}
}
}
//*********时间转换函数开始*****
void trans()
{
tab_time[0]=hour/10;
tab_time[1]=hour%10;
tab_time[3]=minu/10;
tab_time[4]=minu%10;
tab_time[6]=sec/10;
tab_time[7]=sec%10;
}
//*********lcd显示函数开始******
void lcd_dis()
{
uchar m;
write_com(0x80+1); //设置光标位置
for(m=0;m<5;m++) //显示"Time "
{
write_data(tab_chartime[m]);
delay(2);
}
write_char(); //显示时间
write_com(0x80+0x40); //设置光标位置为第二行
for(m=0;m<15;m++) //显示"www.wch16621.cn"
{
write_data(tab_index[m]);
delay(2);
}
}
//*********LCD初始化函数开始****
void lcd_init()
{
dula=0;
wela=0; // 关闭数码管显示
lcden=0;
write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口
write_com(0x0c); //开显示,显示光标,光标闪烁
write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动
write_com(0x80); //设置光标指针
}
//*********写字符串函数开始*****
void write_char()
{
uchar n,a;
for(n=0;n<8;n++)
{
a=tab_time[n]; //分别取时分秒十个位数字
write_data(tab_char[a]); //显示对应数字符号
}
}
//*********写命令函数开始*******
void write_com(uchar com)
{
lcdrs=0; //低电平写命令
P0=com; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********写数据函数开始*******
void write_data(uchar dat)
{
lcdrs=1; //低电平写数据
P0=dat; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********延时函数开始*********
void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
} |