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

📄 text1

📁 电子时钟带有闹钟功能
💻
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <reg51.h>
#include <math.h>
//#include "eeprom.h"
#define uchar  unsigned char
#define uint   unsigned int
#define BUSY  0x80                               //lcd忙检测标志
#define LCD_DATA P0                             //定义P0口为LCD通讯端口
sbit RS=P1^0;								 //数据/命令端
sbit RW=P1^1;								 //读/写选择端
sbit E=P1^2;
sbit speaker=P1^3;					
char second=0,minite=0,hour=0;    //定义并初始化时钟变量
uint day=1,month=1,year=2000;		//定义并初始化日期变量
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;
//uchar *week[]={"SUN","MON","TUE","WEN","THU","FRI","SAT"}; 
//uchar idata time[]={0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00};
/*uchar code datechina[3][8]= {{0x08,0x0f,0x12,0x0f,0x10a,0x1f,0x02,0x02},
                              {0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00},
						      {0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00}};	  */
//char code gd[200];
//char idata dateclock[7]={0x40,0x02,0x04,0x08,0x10,0x20,0x01};		
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 stopwatchjudge[1][3];						   		 
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 LCDchina(void);
void displaytime(void);
//void displaydate(void);
void displayclock(void);
//void displaystopwatch(void);
void changehour(void);
void changeminite(void);
void changeyear(void);
void changemonth(void);
void changeday(void);
void displaytimejudge(void);
void displayclockjudge(void);
//void displaystopwatchjudge(void);
//void displaydateclock(void);
//void displayhourjudge(void);
//void displayminitejudge(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 inc_stopwatch(void);
//void dec_stopwatch(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);

//void dishz(uint chn);
//uchar inva(uchar m);
/*********延时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(0x06);    //显示光标右移设置,检测忙信号
    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++;
    }
}
 /*
void LCDchina(void)
{
unsigned char i=0;
for(i=0;i<8;i++)
      {                       //也是CGRAM的地址AC不能到0,进行了这样的处理
	    WriteCommand(0x40+i);
		
        WriteData(datechina[j][i]);
      }
}
 */

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

void displaytimejudge(void)
{			    	
	DisplayOneChar(0,1,hour/10+0x30);		        //液晶上显示小时
	DisplayOneChar(1,1,hour%10+0x30);
//	DisplayOneChar(7,1,0x3A);
	DisplayOneChar(3,1,minite/10+0x30);			//液晶上显示分
	DisplayOneChar(4,1,minite%10+0x30);
//	DisplayOneChar(10,1,0x3A);
	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(12,0,0x2D);
	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);
//	DisplayOneChar(9,0,0x2D);
}


/************液晶显示时间子函数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);
 //DisplayListChar(8,0,"SMTWTFS");
 delay(250);
/* for(m=0;m<7;m++)
 {
  if((clockjudge[set]&dateclock[m])!=0)
   {DisplayOneChar(8+m,0,0x20);}
 }*/
 if(set1==1)
 {
  DisplayOneChar(9,1,0x20);
  DisplayOneChar(10,1,0x20);
 }
 if(set1==2)
 {
  DisplayOneChar(12,1,0x20);
  DisplayOneChar(13,1,0x20);
 }
/* if(set1==3)
 {
 WriteCommand(0x0f);
 WriteCommand(0x88+set2); 
 } */
 delay(250);
 //WriteCommand(0x0c);
}
/*
void displaystopwatchjudge(void)
{

 DisplayOneChar(5,1,stopwatchjudge[0][0]/10+0x30);
 DisplayOneChar(6,1,stopwatchjudge[0][0]%10+0x30);
 DisplayOneChar(8,1,stopwatchjudge[0][1]/10+0x30);
 DisplayOneChar(9,1,stopwatchjudge[0][1]%10+0x30);
 DisplayOneChar(11,1,stopwatchjudge[0][2]/10+0x30);
 DisplayOneChar(12,1,stopwatchjudge[0][2]%10+0x30);	
 delay(250);
 if(set==1)
 {
 DisplayOneChar(5,1,0x20);
 DisplayOneChar(6,1,0x20);
 }
 if(set==2)
 {
 DisplayOneChar(8,1,0x20);
 DisplayOneChar(9,1,0x20);
 }
 if(set==3)
 {
 DisplayOneChar(11,1,0x20);
 DisplayOneChar(12,1,0x20);
 }
 delay(250);
}
/*
void displaydateclock(void)
{
 displayclockjudge();
 DisplayListChar(8,0,"SMTWTFS");
 delay(250);
 for(m=0;m<7;m++)
 {
  if(clockjudge[n]&dateclock[week1]!=0)
  DisplayOneChar(m+8,0,0x20);
  delay(250);
 }
}
void displayhourjudge(void)
{
 displayclockjudge();
 delay(250);
 DisplayOneChar(9,1,0x20);
 DisplayOneChar(10,1,0x20);
 delay(250);
}
void displayminitejudge(void)
{
 displayclockjudge();
 delay(250);
 DisplayOneChar(12,1,0x20);
 DisplayOneChar(13,1,0x20);
 delay(250);
} */
/**************键盘扫描子函数******************/

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

		if(P2!=0xff)
		  {	
			xx=P2;
			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;displaydate();break;
		case 1:TR0=1;displayclock();break;
		default:
        break; 
		}
}

/*******************显示主界面*******************/
void menu_key(void)
{
//delay(500);
disturb=0;
//if((set1!=0)&&(status==1))
//{
 status++;
 set=0;
 set1=0;
 view=0;
//}
/*
if(status==2)
{
 if(set1==3)
 {
   if((clockjudge[set]&dateclock[set2])==0)
   {
      next=1;
	clockjudge[set]=(clockjudge[set]|dateclock[set2]);
    }
   
    if(((clockjudge[set]&dateclock[set2])!=0)&&(next==0))
    {
	 
	clockjudge[set]=(clockjudge[set]&(~dateclock[set2]));
    }
   	next=0;
  
 }
 } */

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

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

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

void inc_key(void)
{
  /* set2++;
   if(set2>6)
   {set2=0;}*/
   disturb=0;
	switch(status)
	{

⌨️ 快捷键说明

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