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

📄 液晶显示电子时钟1.c

📁 一个使用单片机设计的简单电子钟显示,使用C写的,可用于课程设计
💻 C
字号:
/*******************************************************************/
//Name of this design:     LCD show Electric Clock
//Author:                  xuqian  zhangmengcheng
//Date:                    2008-10-02
/*******************************************************************/

#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#define uchar  unsigned char
#define uint   unsigned int

#define BUSY  0x80                               //lcd忙检测标志
#define DATAPORT P0                             //定义P0口为LCD通讯端口

//sbit light=P1^3;
sbit LCM_RS=P2^0;								 //数据/命令端
sbit LCM_RW=P2^1;								 //读/写选择端
sbit LCM_EN=P2^2;
sbit sounder=P2^5;

sbit p1_0=P1^0;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_3=P1^3;
sbit p1_4=P1^4;
sbit p1_5=P1^5;
sbit p1_6=P1^6;
sbit p1_7=P1^7;
						
uchar second;                		    		 //定义并初始化时钟变量
uchar minite;
uchar hour;
uchar sminite;
uchar shour;
uchar mstcnt=0;
uchar t,set=0;
uchar code str0[]={"DATE :2008-10-11"};
uchar code str1[]={"TIME :   :  :   "};
uchar code str2[]={"clock:   :  :   "};

void delay_LCM(uint);             											//LCD延时子程序
void initLCM( void);               											//LCD初始化子程序
void lcd_wait(void);              											//LCD检测忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              //写指令到ICM子函数
void WriteDataLCM(uchar WDLCM);                                             //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar code *DData);                    //显示指定坐标的一串字符子函数
void init_timer0(void);               										//定时器初始化
void displayfun1(void);
void displayfun2(void);
void displayfun3(void);
void displayfun4(void);
void displayfun5(void);
void displayfun6(void);
void keyscan(void );                									    //键盘扫描子程序
void set_adj(void);
void inc_key(void);
void dec_key(void);
void inc_clock(void);
void dec_clock(void);
void set_sure(void);                        //确认键函数,set=0




/*********延时K*1ms,12.000mhz**********/

void delay_LCM(uint k)
{
    uint i,j;
    for(i=0;i<k;i++)
    {
        for(j=0;j<60;j++)
        	{;}
    }
}
/**********写指令到LCM子函数************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
    if(BusyC)lcd_wait();
	DATAPORT=WCLCM;
    LCM_RS=0;                   // 选中指令寄存器
    LCM_RW=0;               	// 写模式	
    LCM_EN=1;
	_nop_();
	_nop_();
	_nop_();
    LCM_EN=0;
}

/**********写数据到LCM子函数************/

void WriteDataLCM(uchar WDLCM)
{
    lcd_wait( );                //检测忙信号
	DATAPORT=WDLCM;
    LCM_RS=1;                   // 选中数据寄存器
    LCM_RW=0;           	    // 写模式
    LCM_EN=1;
    _nop_();
	_nop_();
	_nop_();
    LCM_EN=0;
}

/***********lcm内部等待函数*************/


void lcd_wait(void)
{
    DATAPORT=0xff;	
	LCM_EN=1;
    LCM_RS=0;   			
    LCM_RW=1;   			
    _nop_();
    while(DATAPORT&BUSY)
	{  LCM_EN=0;
	   _nop_();
	   _nop_();
	   LCM_EN=1;
	   _nop_();
	   _nop_();
	   }
   	LCM_EN=0;
	
}


/**********LCM初始化子函数***********/

void initLCM( )
{
	DATAPORT=0;	
	delay_LCM(15);
	WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
    delay_LCM(5);
    WriteCommandLCM(0x38,0);
    delay_LCM(5);
    WriteCommandLCM(0x38,0);
    delay_LCM(5);

    WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
    WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
    WriteCommandLCM(0x01,1);    //清屏,检测忙信号
    WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
    WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
}

/****************显示指定坐标的一个字符子函数*************/

void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
    Y&=1;
    X&=15;
    if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
    X|=0x80;                    //指令码为地址码+0X80
    WriteCommandLCM(X,0);
    WriteDataLCM(DData);
}

/***********显示指定坐标的一串字符子函数***********/

void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
    uchar ListLength=0;
    Y&=0x01;
    X&=0x0f;
    while(X<16)
    {
        DisplayOneChar(X,Y,DData[ListLength]);
        ListLength++;
        X++;
    }
}



/***************液晶显示子函数1正常显示*****************/

void displayfun1(void)
{	
	WriteCommandLCM(0x0c,1);   					    //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);		
											    	
	DisplayOneChar(7,1,hour/10+0x30);		        //液晶上显示小时
	DisplayOneChar(8,1,hour%10+0x30);

	DisplayOneChar(10,1,minite/10+0x30);			//液晶上显示分
	DisplayOneChar(11,1,minite%10+0x30);
	
	DisplayOneChar(13,1,second/10+0x30);	        //液晶上显示秒
	DisplayOneChar(14,1,second%10+0x30);
}


/************液晶显示子函数2***************/

void displayfun2(void)
{
    WriteCommandLCM(0x0c,1);    			  	  //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
	
	DisplayOneChar(7,1,hour/10+0x30);
	DisplayOneChar(8,1,hour%10+0x30);

	DisplayOneChar(13,1,second/10+0x30);
	DisplayOneChar(14,1,second%10+0x30);


	WriteCommandLCM(0x0f,1);   					  //显示屏打开,光标显示,闪烁,检测忙信号
	DisplayOneChar(10,1,minite/10+0x30);
	DisplayOneChar(11,1,minite%10+0x30);

	

}
/*************液晶显示子函数3****************/

void displayfun3(void)
{
    WriteCommandLCM(0x0c,1);                     //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
		
	DisplayOneChar(10,1,minite/10+0x30);
	DisplayOneChar(11,1,minite%10+0x30);
	
	DisplayOneChar(13,1,second/10+0x30);
	DisplayOneChar(14,1,second%10+0x30);

   	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号	
    DisplayOneChar(7,1,hour/10+0x30);
	DisplayOneChar(8,1,hour%10+0x30);
}
/**************液晶显示子函数闹钟1*****************/
void displayfun4(void)
{	
	WriteCommandLCM(0x0c,1);   					    //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str2);		
											    	
	DisplayOneChar(7,1,shour/10+0x30);		        //液晶上显示闹钟小时
	DisplayOneChar(8,1,shour%10+0x30);

	DisplayOneChar(10,1,sminite/10+0x30);			//液晶上显示闹钟分
	DisplayOneChar(11,1,sminite%10+0x30);
	
	DisplayOneChar(13,1,second/10+0x30);	        //液晶上显示秒
	DisplayOneChar(14,1,second%10+0x30);
}

/**************液晶显示子函数闹钟2*****************/
void displayfun5(void)
{
    WriteCommandLCM(0x0c,1);    			  	  //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str2);	
	
	DisplayOneChar(7,1,shour/10+0x30);
	DisplayOneChar(8,1,shour%10+0x30);

	DisplayOneChar(13,1,second/10+0x30);
	DisplayOneChar(14,1,second%10+0x30);


	WriteCommandLCM(0x0f,1);   					  //显示屏打开,光标显示,闪烁,检测忙信号
	DisplayOneChar(10,1,sminite/10+0x30);
	DisplayOneChar(11,1,sminite%10+0x30);

}
/**************液晶显示子函数闹钟3*****************/
void displayfun6(void)
{
    WriteCommandLCM(0x0c,1);                     //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str2);	
		
	DisplayOneChar(10,1,sminite/10+0x30);
	DisplayOneChar(11,1,sminite%10+0x30);
	
	DisplayOneChar(13,1,second/10+0x30);
	DisplayOneChar(14,1,second%10+0x30);

   	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号	
    DisplayOneChar(7,1,shour/10+0x30);
	DisplayOneChar(8,1,shour%10+0x30);
}



/**************键盘扫描子函数******************/

void keyscan(void)
{
	uchar temp;                                           //局部变量
	P1=0xff;
    p1_6=0;
    //unsigned char temp;
    temp=P1;
    temp&=0x0F;
    if(temp!=0x0F)
    {
      delay_LCM(150);
      temp=P1;
      temp&=0x0F;
      if(temp!=0x0F)
      {
       temp=P1;
       temp&=0x0F;
       switch(temp)    		          // 根据按键状态,调用不同的子函数
	   {
		 case 0x0E:inc_clock();
         break;
		 case 0x0D:dec_clock();
         break;
		 case 0x07:set_sure();
         break;
		 default:
         break;
	   }
	  }	
      }
	P1=0xff;
    p1_7=0;
    //unsigned char temp;
    temp=P1;
    temp&=0x0F;
    if(temp!=0x0F)
    {
      delay_LCM(150);
      temp=P1;
      temp&=0x0F;
      if(temp!=0x0F)
      {
       temp=P1;
       temp&=0x0F;
       switch(temp)    		          // 根据按键状态,调用不同的子函数
	   {
		 case 0x0E:set_adj();
         break;
		 case 0x0D:inc_key();
         break;
		 case 0x0B:dec_key();
         break;
		 case 0x07:sounder=0;
		 default:
         break;
	   }
	   }	
      }

}


/**************设定工作模式子函数****************/

void set_adj(void)
{
	delay_LCM(100);
	  set++;
    if(set>5)
      set=0;	
}

/*************确认键函数************************/
void set_sure(void)
{
    delay_LCM(100);
    set=0;
}

/****************按键加法子函数******************/

void inc_key(void)
{
	delay_LCM(150);
	  if(set==1)
        {
           hour++;
           if(hour>23)
           hour=0;
        }
	  else
	    if(set==2)
	    {
		  minite++;
          if(minite>59)
          minite=0;
		 
        }
		else
          displayfun1();
}

/****************按键减法子函数*****************/

void dec_key(void)
{
	delay_LCM(150);
        if(set==1)
		  {
		    hour--;
            if(hour<=0)
            hour=23;
          }
		else
		  if(set==2)
		  {
            minite--;
            if(minite<=0)
            minite=59;
          }
		 else
		   displayfun1();	
}
/****************闹钟按键加法子函数******************/

void inc_clock(void)
{
	delay_LCM(150);
	  if(set==5)
        {
           shour++;
           if(shour>23)
           shour=0;
        }
	  else
	    if(set==4)
	    {
		  sminite++;
          if(sminite>59)
          sminite=0;
		 
        }
		else
          displayfun1();
}

/****************闹钟按键减法子函数*****************/

void dec_clock(void)
{
	delay_LCM(150);
        if(set==5)
		  {
		    
            if(shour<=0)
            shour=23;
            else shour--;
          }
		else
		  if(set==4)
		  {
     
            if(sminite<=0)
             sminite=59;
            else sminite--;
          }
		 else
		   displayfun1();	
}

/***************定时器t0初始化*******************/

void init_timer0(void)
{
	 TMOD=0x01;                                  //time0为定时器,方式1
     TH0=0x3c;                                   //预置计数初值
     TL0=0xb0;
     EA=1;   								
     ET0=1;          											
     TR0=1;          		
}

/***********定时器t0中断子函数**************/

void timer0(void) interrupt 1 using 0            //定时器0方式1,50ms中断一次
{
     TH0=0x3c;
     TL0=0xb0;
     mstcnt++;
     if(mstcnt>=20 )
       {
         second++;
         mstcnt=0;
       }
	   if(second>=60)
         {
           minite++;
           second=0;
         }
	     if(minite>=60)
           {
             hour++;
             minite=0;
            // light=0;
             delay_LCM(200);
             //light=1;
           }
	       if(hour>=24)
             {
               hour=0;
             }
	 keyscan( );                                 //按键扫描
}

/***********the main funtion*************/

void main(void)
{
    //shour=12;
	//sminite=0;
    P1=0xff; 
	sounder=0;	  //初始化p1口,全设为1
	delay_LCM(500);	                                          //延时500ms启动
	initLCM( );                               			  	  //LCD初始化
	init_timer0( );	                           				  //时钟定时器0初始化	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);
                     	
    while (1)
    {
       	keyscan();                                            //按键扫描		
	    if(hour==shour&&minite==sminite&&second==0)
        sounder=1;
		switch(set)                                           //LCD根据工作模式显示
		{
			case 0:displayfun1();delay_LCM(1000);             //正常工作显示
			  break;
			case 1:displayfun3();delay_LCM(1000);             //调整分显示
			  break;
			case 2:displayfun2();delay_LCM(1000);             //调整时显示
			  break;
            case 3:displayfun4();delay_LCM(1000);             //正常显示闹钟时间
			  break;
            case 4:displayfun5();delay_LCM(1000);             //调整闹钟时显示
			  break;
            case 5:displayfun6();delay_LCM(1000);             //调整闹钟分显示
			  break;
			default:
              break;
		} 	
	
    }
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -