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

📄 lcd128x64.c

📁 基于AT89S52的电子钟(LCD12864显示)
💻 C
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////////////////////////////////
///// 函数名称: SetTime                                                     /////                                                                 /////
///// 功能: 设置初始时间                                                    /////
///// 调用: WriteTo1302()                                                   /////
///// 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年    ///// 
///// 返回值: 无                                                            /////
/////////////////////////////////////////////////////////////////////////////////

void SetTime(unsigned char *pSecDa) 
 {
  unsigned char i;
  unsigned char Addr = 0x80; 
  WriteTo1302(0x8e,0x00);         // 控制命令,WP=0,写操作 //
  for(i =7;i>0;i--)
   { 
    WriteTo1302(Addr,*pSecDa);         // 秒 分 时 日 月 星期 年 //
    pSecDa++;
    Addr +=2;
   }
  WriteTo1302(0x8e,0x80);         // 控制命令,WP=1,写保护 //
 }                                                                  
/**************************************************************************************************/ 
//////////////////////////////////////////////////////////////////////////////////////
///// 名称: GetTime                                                              /////
///// 说明:                                                                      /////
///// 功能: 读取DS1302当前时间                                                   /////
///// 调用: uc_R1302()                                                           /////
///// 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年  /////
///// 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B                                         /////
///// 返回值: 无                                                                 /////
//////////////////////////////////////////////////////////////////////////////////////

void GetTime(void) 
 {
  unsigned char i;
  unsigned char Addr = 0x81;
  for (i=0;i<7;i++)
   {
    Curtime[i] = ReadFrom1302(Addr);        // 格式为: 秒 分 时 日 月 星期 年 //
    Addr += 2;
   }
  sec = Curtime[0];
  min = Curtime[1];
  hour = Curtime[2];
  day = Curtime[5];
  date = Curtime[3];
  month = Curtime[4];
  year = Curtime[6];
 }
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   定时器T0初始化子函数         //////
///// 函数功能: 初始化T0定时50ms             //////
///// 调用:     无                           //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void Init_T0(void)
 { 
  TMOD=0x01;            //定时器T0,工作模式1//
  TH0=0x3c;             //50ms//
  TL0=0xb0;
  EA=1; 
  ET0=1;
  TR0=1;
 }
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   闪烁信号产生子函数           //////
///// 函数功能: 用定时中断方式产生闪烁信号   //////
///// 调用:     无                           //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void T0_flash(void) interrupt 1          // 中断程序,产生时钟秒信号 //
 {
  TR0=0;          
  fla_cou++;
  if(fla_cou==3)             //闪烁间隔为50ms*5次=250ms//
   {
    flash=!flash;
    fla_cou=0;
   }
  TH0=0x3c;             //50ms//
  TL0=0xb0;
  TR0=1;
 }
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   时间闪烁子函数               //////
///// 函数功能: 选择确定闪烁位等待调整       //////
///// 调用:     Add();                       //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void FlashKey(void)             //闪烁子函数//
{
 if(P1_0==0)
  {
   while(P1_0==0)
    Refresh();
   n++;                        
  }                            
 if(n==8)  n=0;                         
 if(n!=1)  K1=1;
 if(n!=2)  K2=1;
 if(n!=3)  K3=1;                      
 if(n!=4)  K4=1;
 if(n!=5)  K5=1;
 if(n!=6)  K6=1;                      
 if(n!=7)  K7=1;
 switch(n)
  {
   case 0:KT=0;break;
   case 1:K1=flash;hms=year;KT=1;break;        //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中//
   case 2:K2=flash;hms=month;KT=1;break;
   case 3:K3=flash;hms=date;KT=1;break;
   case 4:K4=flash;hms=hour;KT=1;break;
	case 5:K5=flash;hms=min;KT=1;break;
   case 6:K6=flash;hms=sec;KT=1;break;
   case 7:K7=flash;hms=day;KT=1;break;
  }
 Add();
} 
/*********************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   时间调整子函数               //////
///// 函数功能: 对闪烁位进行调整(加一)       //////
///// 调用:     SetTime();                   //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void Add(void)           //调时子函数//
 {
  if(P1_2==0)             //按P0_2键进行时间调整//
   {
    while(P1_2==0)
     Refresh();
    if(KT==1)             //检验可调标志位KT//
     {
      hms++;
      switch(n)
       {
        case 1:year=hms;break;           //根据n不同,返回给不同的位: n=1  ->  返回给小时位//
        case 2:month=hms;break;          //                            n=2  ->  返回给分钟位//
        case 3:date=hms;break;           //                            n=3  ->  返回给秒位  //
        case 4:hour=hms;break;           //                            n=4  ->  返回给星期位//
        case 5:min=hms;break;            //                   依次类推                      //
		  case 6:sec=hms;break;
		  case 7:day=hms;break;
		 }
      if((sec&0x0f)==0x0a) {sec&=0xf0; sec+=0x10;}         // 如果秒位满十,向十秒位进一 //
      if((min&0x0f)==0x0a) {min&=0xf0; min+=0x10;}         // 如果分位满十,向十分位进一 //
      if((hour&0x0f)==0x0a) {hour&=0xf0; hour+=0x10;}      // 如果时位满十,向十时位进一 //
      if(day==8) {day=1;}          // 如果星期满七,重新从星期一开始计 //
      
      if((sec&0xf0)==0x60) {sec&=0x0f;}         // 如果十秒位满六,清零 //
      if((min&0xf0)==0x60) {min&=0x0f;}         // 如果十分位满六,清零 //
      if(((hour&0xf0)==0x20)&((hour&0x0f)==0x04)) {hour&=0x00;}          //如果小时满24,清零//

      if((date&0x0f)==0x0a) {date&=0xf0; date+=0x10;}         // 如果日期位满十,向十号位进一 //
      if((month&0x0f)==0x0a) {month&=0xf0; month+=0x10;}         // 如果月份位满十,向十月位进一 //
      if((year&0x0f)==0x0a) {year&=0xf0; year+=0x10;}      // 如果年位满十,向十年位进一 //

		if(((date&0xf0)==0x30)&((date&0x0f)==0x02)) {date&=0x00;}
		if(((month&0xf0)==0x10)&((month&0x0f)==0x03)) {month&=0x00;}
		if((year&0xf0)==0xa0) {year&=0x0f;}
      
      Curtime[0] = sec;
      Curtime[1] = min;
      Curtime[2] = hour;
	   Curtime[3] = date;
	   Curtime[4] = month;
      Curtime[5] = day;
	   Curtime[6] = year;
      SetTime(&Curtime[0]);         // 将调整过后的时间值写入DS1302 //
     }
   }
 }
/********************************************************************************************************/
/*******************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   时钟初始化子函数             //////
///// 函数功能: 对所有时钟程序变量初始化     //////
///// 调用:     Init_T0();                   //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void Init_Clock(void)
 {
  K1=1; K2=1; K3=1; K4=1; K5=1;
  K6=1; K7=1; KT=0; n=0;
  Init_T0();
 }
/*******************************************************************************************///时钟部分// ↑ 
////////////////////////////////////////////////////
///// 函数名:   刷新显示子函数               //////
///// 函数功能: 即时刷新时钟数据进行显示     //////
///// 调用:  InputCommand();DisplayChar();   //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 
void Refresh(void)
 {
  GetTime();
  CS1=1;CS2=0;
  if(K6)
   { sz_disp16(5,40,shuzi[sec&0x0f]);       // 秒位 //
     sz_disp16(5,32,shuzi[sec>>4]); }       // 十秒位 //
  else
   { hz_disp16(5,32,kongbai2); }             // 秒位  十秒位 //
  
  if(K5)
   { sz_disp16(5,8,shuzi[min&0x0f]);        // 分钟位 //
     sz_disp16(5,0,shuzi[min>>4]); }        // 十分位 //
  else
   { hz_disp16(5,0,kongbai2); }
  
  if(K7)
   { sz_disp16(1,0,shuzi[day&0x0f]); }
  else
   { sz_disp16(1,0,kongbai1); }
 
  if(K3)
   { sz_disp16(3,24,shuzi[date&0x0f]);       // 日期位 //
     sz_disp16(3,16,shuzi[date>>4]);  }
  else
   { hz_disp16(3,16,kongbai2); }

  CS1=0;CS2=1;
  if(K4)
   { sz_disp16(5,40,shuzi[hour&0x0f]);       // 小时位 //
     sz_disp16(5,32,shuzi[hour>>4]); }     // 十时位 //
  else
   { hz_disp16(5,32,kongbai2); }
	
  if(K2)
   { sz_disp16(3,56,shuzi[month&0x0f]);       // 月份位 //
     sz_disp16(3,48,shuzi[month>>4]);  }
  else
   { hz_disp16(3,48,kongbai2); }	 

  if(K1)
   { sz_disp16(3,24,shuzi[year&0x0f]);       // 年份位 //
     sz_disp16(3,16,shuzi[year>>4]);  }
  else
   { hz_disp16(3,16,kongbai2); } 
 } 
/*-----------------------------状态判断于提示------------------------*/
void State(void)
 {
  CS1=1;CS2=0;
  if(KT==1)
   { hz_disp16(1,32,tiao);
	  hz_disp16(1,48,shi2);}
  else
   { hz_disp16(1,32,kongbai2);
	  hz_disp16(1,48,kongbai2); }
 }
/*------------------------------主函数---------------------------------*/

main()
 {
  Init_Clock();
  init_lcd();
  Disp_Img(FirstPage);
  delay(10000);
  StartMsg();
  delay(10000);
  ClockMsg();
  while(1)
   {
    Refresh();
    FlashKey();
	 State();
	 delay(250);       // 适当延时防止因为不断查忙而耗费大量CUP资源 //
   } 
 }

⌨️ 快捷键说明

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