⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock_show_time_data.c

📁 这是一段开始学单片机时写的LCD程序
💻 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 + -