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

📄

📁 电子时钟带有闹钟功能
💻
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <reg51.h>
#include <math.h>

#define uchar  unsigned char
#define uint   unsigned int
#define BUSY  0x80                               //lcd忙检测标志
#define LCD_DATA P0                             //定义P0口为LCD通讯端口
sbit RS=P2^5;								 //数据/命令端
sbit RW=P2^6;								 //读/写选择端
sbit E=P2^7;
sbit speaker=P2^3;					
char second=0,minite=0,hour=9;    //定义并初始化时钟变量
uint day=20,month=6,year=2008;		//定义并初始化日期变量
uint k,k1,k2,s1,s2,s3,s4,j,m,n;
int set=0,set1,weekjudge;
uchar mstcnt0=0,mstcnt1=0, status=0,ss=0,view=0;disturb=0,clockview;
	
char idata clockjudge[32]={0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
						   0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
						   0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
						   0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,
                           }; 
						   		 
char idata hourjudge[32]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
char idata minitejudge[32]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void delay(uint k);
void init_timer0(void); 
void init_timer1(void);            											//LCD延时子程序
void LCDInit(void);               											//LCD初始化子程序
void ReadStatus(void);              											//LCD检测忙子程序
void WriteCommand(uchar WC);                              //写指令到ICM子函数
void WriteData(uchar WD);                                             //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar *DData);                    //显示指定坐标的一串字符子函数
void init_timer0(void);

void displaytime(void);

void displayclock(void);

void changehour(void);
void changeminite(void);
void changeyear(void);
void changemonth(void);
void changeday(void);
void displaytimejudge(void);
void displayclockjudge(void);

void keyscan(void );
void menu_key(void);               									   
void tab_key(void);
void inc_key(void);
void dec_key(void);
void inc_time(void);
void dec_time(void);

void changesecond(void);
void inc_clock(void);
void dec_clock(void);
void inc_stopwatch(void);
void dec_stopwatch(void);
int dayjudge(int year,int month);
int date(int year,int month);
int yearchange(int year);


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

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

void WriteCommand(uchar WC)
{
    
	ReadStatus();
	LCD_DATA=WC;
    RS=0;                   // 选中指令寄存器
    RW=0;               	// 写模式	
    E=1;
	E=0;
}

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

void WriteData(uchar WD)
{
    ReadStatus();               //检测忙信号
	LCD_DATA=WD;
    RS=1;                   // 选中数据寄存器
    RW=0;           	    // 写模式
    E=1;
    E=0;
}

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


void  ReadStatus(void)
{
    LCD_DATA=0xff;	
	E=1;
    RS=0;   			
    RW=1;   			
    
    while(LCD_DATA&BUSY)
	{  E=0;
	   E=1;
	   }
   	E=0;	
}


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

void LCDInit(void) //LCM初始化
{
	LCD_DATA=0;	
    WriteCommand(0x38);    //8bit数据传送,2行显示,5*7字型,检测忙信号
    WriteCommand(0x08);    //关闭显示,检测忙信号
    WriteCommand(0x01);    //清屏,检测忙信号
    
    WriteCommand(0x0c);    //显示屏打开,光标不显示,不闪烁,检测忙信号
}

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

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

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

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

/***************液晶显示时间子函数1*****************/

void displaytimejudge(void)
{			    	
	DisplayOneChar(0,1,hour/10+0x30);		        //液晶上显示小时
	DisplayOneChar(1,1,hour%10+0x30);

	DisplayOneChar(3,1,minite/10+0x30);			//液晶上显示分
	DisplayOneChar(4,1,minite%10+0x30);

	DisplayOneChar(6,1,second/10+0x30);	        //液晶上显示秒
	DisplayOneChar(7,1,second%10+0x30);
	yearchange(year);
	DisplayOneChar(5,0,month/10+0x30);			//液晶上显示月
	DisplayOneChar(6,0,month%10+0x30);

	DisplayOneChar(8,0,day/10+0x30);	        //液晶上显示日
	DisplayOneChar(9,0,day%10+0x30);
    DisplayOneChar(0,0,s1+0x30);		        //液晶上显示年
	DisplayOneChar(1,0,s2+0x30);	
	DisplayOneChar(2,0,s3+0x30);	
	DisplayOneChar(3,0,s4+0x30);

}


/************液晶显示时间子函数3***************/

void changeminite(void)
{
	DisplayOneChar(0,1,hour/10+0x30);		      
	DisplayOneChar(1,1,hour%10+0x30);

	DisplayOneChar(3,1,minite/10+0x30);			//液晶上显示分
	DisplayOneChar(4,1,minite%10+0x30);	

	delay(250);
	DisplayOneChar(3,1,0x20);
	DisplayOneChar(4,1,0x20);
	delay(250);
}

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


void changehour(void)
{

    DisplayOneChar(0,1,hour/10+0x30);		        //液晶上显示小时
	DisplayOneChar(1,1,hour%10+0x30);

    delay(250);
	DisplayOneChar(0,1,0x20);
	DisplayOneChar(1,1,0x20);
	delay(250);
}

/**************液晶显示日期子函数1*****************/
void changesecond(void)
{
    DisplayOneChar(3,1,minite/10+0x30);			//液晶上显示分
	DisplayOneChar(4,1,minite%10+0x30);
	DisplayOneChar(6,1,second/10+0x30);	        //液晶上显示秒
	DisplayOneChar(7,1,second%10+0x30);
	delay(250);
	DisplayOneChar(6,1,0x20);
	DisplayOneChar(7,1,0x20);
	delay(250);
}

/**************液晶显示日期子函数2*****************/
void changeday(void)
{
    DisplayOneChar(5,0,month/10+0x30);			//液晶上显示月
	DisplayOneChar(6,0,month%10+0x30);

	DisplayOneChar(8,0,day/10+0x30);	        //液晶上显示日
	DisplayOneChar(9,0,day%10+0x30);

    delay(250);
	DisplayOneChar(9,0,0x20);
	DisplayOneChar(8,0,0x20);
	delay(250);
}
/**************液晶显示日期子函数3*****************/
void changemonth(void)
{
	yearchange(year);
	DisplayOneChar(0,0,s1+0x30);		        //液晶上显示年
	DisplayOneChar(1,0,s2+0x30);	
	DisplayOneChar(2,0,s3+0x30);	
	DisplayOneChar(3,0,s4+0x30);
	DisplayOneChar(5,0,month/10+0x30);			//液晶上显示月
	DisplayOneChar(6,0,month%10+0x30);
    delay(250);
	DisplayOneChar(5,0,0x20);
	DisplayOneChar(6,0,0x20);
	delay(250);
}
/**************液晶显示日期子函数4*****************/
void changeyear(void)
{
    DisplayOneChar(6,1,second/10+0x30);	        //液晶上显示秒
	DisplayOneChar(7,1,second%10+0x30);
	yearchange(year);
    DisplayOneChar(0,0,s1+0x30);		        //液晶上显示年
	DisplayOneChar(1,0,s2+0x30);	
	DisplayOneChar(2,0,s3+0x30);	
	DisplayOneChar(3,0,s4+0x30);
    delay(250);
	DisplayOneChar(1,0,0x20);
	DisplayOneChar(2,0,0x20);
	DisplayOneChar(3,0,0x20);
	DisplayOneChar(0,0,0x20);
	delay(250);
}
void displayclockjudge(void)
{
 DisplayOneChar(9,1,hourjudge[set]/10+0x30);
 DisplayOneChar(10,1,hourjudge[set]%10+0x30);
 DisplayOneChar(12,1,minitejudge[set]/10+0x30);
 DisplayOneChar(13,1,minitejudge[set]%10+0x30);

 delay(250);


 if(set1==1)
 {
  DisplayOneChar(9,1,0x20);
  DisplayOneChar(10,1,0x20);
 }
 if(set1==2)
 {
  DisplayOneChar(12,1,0x20);
  DisplayOneChar(13,1,0x20);
 }

 delay(250);
 
}

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

void keyscan(void)
{
	uchar xx;                                           //局部变量
	P1=0xff;
	if(P1!=0xff)
	  {
	    delay(30);

		if(P1!=0xff)
		  {	
			xx=P1;
			switch(xx)					                // 根据按键状态,调用不同的子函数
			{
				case 0xfe: menu_key();
                  break;
				case 0xfd: tab_key();
                  break;
				case 0xfb:inc_key();
                  break;
				case 0xf7:dec_key();
				default:
                  break;
			}
		
		  }
		
	  }
	  delay(400);
	  switch(status)
		{
		case 0:TR0=1;displaytime();break;
	
		case 1:TR0=1;displayclock();break;
		default:
        break; 
		}
}

/*******************显示主界面*******************/
void menu_key(void)
{

disturb=0;


 status++;
 set=0;
 set1=0;
 view=0;


if(status>1)
 {
 status=0;
 }
}
/**************设定工作模式子函数****************/

void tab_key(void)
{	
   
      disturb=0;
	  if(status==0)
	 { 
	  set++;
	  }
	  if(status==1)
	  {set1++;
	   if(set1>2)
	    set1=0;
	  }

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

void inc_key(void)
{
  
   disturb=0;
	switch(status)
	{
	case 0:inc_time();
	break;


	case 1:inc_clock();
	break;

	default:
     break;
	}
}
/****************时间加法子函数*****************/
void inc_time(void)
 {
	  if(set==1)
        {
           hour++;
           if(hour==24)
           hour=0;
		  
        }
	    if(set==2)
	    {
		  minite++;
          if(minite==60)
          minite=0;
        }
		if(set==3)
	    {
		  second++;
          if(second==60)
          second=0;
        }
		if(set==4)
	{
	  year++;
	}
	if(set==5)
  {
	month++;
	if(month>12)
	month=1;
  }
  if(set==6)
  {
  day++;
  k1=dayjudge(year,month);
  if(day>k1)
  day=1;
  }
  
}
/****************闹钟加法子函数*****************/
void inc_clock(void)
{
 if(set1==1)
 {
 hourjudge[set]++;
 if(hourjudge[set]>23)
 hourjudge[set]=0;
 }
 if(set1==2)
 {

⌨️ 快捷键说明

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