📄 clock_show_time_data.c
字号:
//*******************************************************
//该程序实现用液晶显示器LCD显示年,月,日和时间
//程序启发:用查表法把数据送到LCD显示
//不足之处:没有考虑闰年,闰月等;年,月,日和时间不可调
//作者:李锡坚
//完成时间:2007.07.25.10:30
//*******************************************************
/********************************************************
控制说明:
sbit LCD_RS=P3^4; //定义LCD的RS控制位
sbit LCD_RW=P3^5; //定义LCD的RW控制位
sbit LCD_DISPLAY_START=P1^0; //LCD开始显示的指示灯
sbit LCD_E=P1^1; //定义LCD的E控制位
写操作时用:LCD_E=1;
_nop_();
LCD_E=0;
代替
*********************************************************/
//****************************************
#include<reg51.h> //包含常用头文件
#include<stdio.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char //定义常用数据类型
int cnt;
void LCD_INIT(void); //LCD的初始化函数
void LCD_DISPLAY_COLON(uchar *DATA);//在指定的位置显示字符串
void LCD_DISPLAY_DATE(uchar *DATA); //在指定的位置显示字符串
void LCD_DISPLAY_STR(void); //在指定的位置显示字符串
void LCD_CLR(uchar y); //清除LCD指定的行
void LCD_SEND_COMMAND(uchar COMMAND); //向LCD发送命令
void LCD_SEND_DATA(uchar DATA); //向LCD发送数据
void LCD_WAIT(void); //检查LCD空闲
uchar LCD_GET_FLAG(void); //检查LCD状态
void DELAY(void); //延时
/*定义所要显示的数据*/
char code DISPLAY[]="0123456789";//预先存放数字
char code DISPLAY_COLON[]="time: : :"; //显示冒号
char code DISPLAY_DATE[]="date: . ."; //显示日期
/*定义LCD控制字*/
#define LCD_MODE 0x3C /* 接口数据8位,显示2行,字体为1号 */
#define LCD_NO_FLASH 0x0C /* 屏幕显示开,无光标 */
#define LCD_HIDE 0x08 /* 屏幕显示关 */
#define LCD_FLASH 0x0D /* 屏幕显示开,并打开闪烁光标 */
#define LCD_SHIFT 0x07 /* 模块数据输入为增量方式,显示内容移动 */
#define LCD_NO_SHIFT 0x06 /* 模块数据输入为增量方式,显示光标移动 */
#define LCD_SH 0x14 /* 移动光标及整体显示 */
#define LCD_LINE1 0x80 /*第一行DDRAM起始地址*/
#define LCD_LINE2 0xc0 /*第二行DDRAM起始地址*/
#define SEND_IN P0 /*XBYTE[0xff00] /*定义LCD的实际地址*/
sbit LCD_RS=P3^4; //定义LCD的RS控制位
sbit LCD_RW=P3^5; //定义LCD的RW控制位
sbit LCD_DISPLAY_START=P1^0; //LCD开始显示的指示灯
sbit LCD_E=P1^1; //定义LCD的E控制位
int t=0; //中断计数
int hour_2=1,hour_1=0,minute_2=3,minute_1=0,second_2=0,second_1=0;
int year_4=2,year_3=0,year_2=0,year_1=7,month_2=0,month_1=7,date_2=2,date_1=5;
//*************************************************
//LCD显示字符串的主程序
//利用中断间隔循环显示
//
//*************************************************
main()
{
LCD_INIT(); //初始化LCD
LCD_CLR(1);
LCD_CLR(2);
LCD_DISPLAY_COLON(DISPLAY_COLON); //显示冒号
LCD_DISPLAY_DATE(DISPLAY_DATE); //显示日期
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
do
{
LCD_DISPLAY_STR();
}while(1);
}
//*************************************************
//函数功能:LCD初始化
//输入变量:无
//输出变量:无
//调用模块:LCD_SEND_COMMAND(),LCD_CLR()
//*************************************************
void LCD_INIT(void)
{
LCD_SEND_COMMAND(LCD_MODE); //设置工作方式
LCD_SEND_COMMAND(LCD_NO_FLASH); //设置显示方式
LCD_SEND_COMMAND(LCD_NO_SHIFT); //设置光标画面滚动方式
LCD_SEND_COMMAND(LCD_SH); //设置输入方式
LCD_CLR(1); //清除LCD第一行
LCD_CLR(2); //清除LCD第二行
}
//*************************************************
//函数功能:清除LCD指定行
//输入变量:y
//输出变量:无
//调用模块:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_CLR(uchar y)
{
uchar i;
i=0;
if(y==1)
{
LCD_SEND_COMMAND(LCD_LINE1); //发送命令使LCD指向第一行
i=16;
}
if(y==2)
{
LCD_SEND_COMMAND(LCD_LINE2); //发送命令使LCD指向第二行
i=16;
}
if(i!=0)
{
do
{
LCD_SEND_DATA(' '); //让LCD的相应位置显示空格
}while(--i!=0);
}
}
//*************************************************
//函数功能:向LCD发送命令
//输入变量:COMMAND
//输出变量:无
//调用模块:LCD_WAIT()
//*************************************************
void LCD_SEND_COMMAND(uchar COMMAND)
{
LCD_WAIT(); //等待空闲
LCD_RS=0; //命令方式
LCD_RW=0; //写方式
LCD_E=1;
SEND_IN=COMMAND;//写实际的命令到LCD
LCD_E=0;
}
//*************************************************
//函数功能:向LCD发送数据
//输入变量:DATA
//输出变量:无
//调用模块:LCD_WAIT()
//*************************************************
void LCD_SEND_DATA(uchar DATA)
{
LCD_WAIT(); //等待空闲
LCD_RS=1; //数据方式
LCD_RW=0; //写方式
LCD_E=1;
SEND_IN=DATA;//写实际的数据到LCD
LCD_E=0;
}
//*************************************************
//函数功能:等待LCD空闲
//输入变量:无
//输出变量:无
//调用模块:LCD_GET_FLAG()
//*************************************************
void LCD_WAIT(void)
{
uchar i;
i=1000; //定义等待时间,可以防止由于LCD损坏而使程序死循环
do
{
if((LCD_GET_FLAG()&0x80)==0) //判断BF是否为0
{
break;
}
}while(--i!=0);
}
//*************************************************
//函数功能:检查LCD状态
//输入变量:无
//输出变量:LCD显示的当前状态
//调用模块:无
//*************************************************
uchar LCD_GET_FLAG(void)
{
SEND_IN=0xff;
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
_nop_();
_nop_();
return(SEND_IN);
}
//*************************************************
//函数功能:在LCD第一行输出“time: : :”
//输入变量:*DATA
//输出变量:无
//调用模块:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_DISPLAY_COLON(uchar *DATA)
{
int x=1;
LCD_SEND_COMMAND(LCD_LINE1); //发送显示位置命令
for(;x<(17)&&*DATA!='\0';x++)
{
LCD_SEND_DATA(*DATA++); //发送数据
}
}
//*************************************************
//函数功能:在LCD第二行输出“date:”
//输入变量:*DATA
//输出变量:无
//调用模块:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_DISPLAY_DATE(uchar *DATA)
{
int x=1;
LCD_SEND_COMMAND(LCD_LINE2); //发送显示位置命令
for(;x<(17)&&*DATA!='\0';x++)
{
LCD_SEND_DATA(*DATA++); //发送数据
}
}
//*************************************************
//函数功能:显示时,分,秒
//输入变量:无
//输出变量:无
//调用模块:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//*************************************************
void LCD_DISPLAY_STR(void)
{
LCD_SEND_COMMAND(LCD_LINE1+5); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[hour_2]); //发送时十位数据
LCD_SEND_COMMAND(LCD_LINE1+6); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[hour_1]); //发送时个位数据
LCD_SEND_COMMAND(LCD_LINE1+8); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[minute_2]); //发送分十位数据
LCD_SEND_COMMAND(LCD_LINE1+9); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[minute_1]); //发送分个位数据
LCD_SEND_COMMAND(LCD_LINE1+11); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[second_2]); //发送秒十位数据
LCD_SEND_COMMAND(LCD_LINE1+12); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[second_1]); //发送秒个位数据
LCD_SEND_COMMAND(LCD_LINE2+5); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[year_4]); //发送年千位数据
LCD_SEND_COMMAND(LCD_LINE2+6); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[year_3]); //发送年百位数据
LCD_SEND_COMMAND(LCD_LINE2+7); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[year_2]); //发送年十位数据
LCD_SEND_COMMAND(LCD_LINE2+8); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[year_1]); //发送个个位数据
LCD_SEND_COMMAND(LCD_LINE2+10); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[month_2]); //发送月十位数据
LCD_SEND_COMMAND(LCD_LINE2+11); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[month_1]); //发送月个位数据
LCD_SEND_COMMAND(LCD_LINE2+13); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[date_2]); //发送日十位数据
LCD_SEND_COMMAND(LCD_LINE2+14); //发送显示位置命令
LCD_SEND_DATA(DISPLAY[date_1]); //发送日个位数据
}
//*****************************************
//
//定时器0的溢出中断程序
//
//*****************************************
void timer0(void) interrupt 1 using 0
{
t++;
if(t==4000)
{
t=0;
second_1++;
if(second_1==10)
{
second_1=0;
second_2++;
if(second_2==6)
{
second_2=0;
minute_1++;
if(minute_1==10)
{
minute_1=0;
minute_2++;
if(minute_2==6)
{
minute_2=0;
hour_1++;
if(hour_1==10)
{
hour_1=0;
hour_2++;
}
if(hour_1==4&&hour_2==2)
{
hour_1=0;
hour_2=0;
date_1++;
if(date_1==10)
{
date_1=0;
date_2++;
}
if(date_2==3&&date_1==1)
{
date_2=0;
month_1++;
if(month_1==10)
{
month_1=0;
month_2++;
}
if(month_1==3&&month_2==1)
{
month_1=1;
month_2=0;
year_1++;
if(year_1==10)
{
year_1=0;
year_2++;
if(year_2==10)
{
year_2=0;
year_3++;
if(year_3==10)
{
year_3=0;
year_4++;
if(year_4==10)
{
year_4=0;
}
}
}
}
}
}
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -