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

📄 12864

📁 这是一个用51开发的包含有多个模块的12864液晶显示的程序
💻
📖 第 1 页 / 共 3 页
字号:
    addr++;
   }
 }



/***********************/
/*       主函数        */
/***********************/
void main()
{
  
  unsigned int i;

  TMOD=0x11;
  EA=1;
  EX1=1;
  ET1=1;
  ET0=1;
  TH1=0;
  TL1=0;
  IT1=1;
  count=0;
  ir_enable=0;

  id=0;                     //闹钟初如值设定
  alarm=0;
  alarm_controls=0;
  alarm_min=0x00;
  alarm_hour=0x00;
  W1302(0xc0,alarm_hour);
  W1302(0xc2,alarm_min);
  P15=0;

  Set1302(&inittime);

  init();
  rst=0;
  delay(2);
  rst=1;
  _nop_();
  _nop_();
  psb=1;

send_dictate(0x34);
delay(2);
send_dictate(0x02);
delay(2);
send_dictate(0x30);
cgram();
send_dictate(0x01);


while(1)
 {
  if(ir_enable)
   {
    ir_key();
    ir_enable=0;
    init();
   }
  sec=R1302(0x81);
  sec&=0x7f;
  sec=sec/16*10+sec%16;
  if(alarm==1&&(sec!=sec_temp))
   {
	 sec_temp=sec;
	 P15=~P15;
	}
  i=ReadTemperature();
  if(sec==0x00)
   {
    min=R1302(0x83);
    min=min/16*10+min%16;
	 alarm=0;
	 P15=0;
    if(alarm_controls==1)
	  if(alarm_hour==hour)
	   if(alarm_min==min)
	    alarm=1;
	}
  if(min==0)
   {
    hour=R1302(0x85);
	 hour=hour/16*10+hour%16;
	}
  if(hour==0)
   {
    day=R1302(0x87);
    week=R1302(0x8b);
	 day=day/16*10+day%16;
	 Conversion(0,year,month,day);
   }
  if(day==1)
   {
    month=R1302(0x89);
    month=month/16*10+month%16;
	}
  if(month==1)
   {
    year=R1302(0x8d);
	 year=year/16*10+year%16;
	 jieqi1= calendar_calculate_solar_term_1();
    jieqi2= calendar_calculate_solar_term_2();
	}
  
  
  if(id==0)
   {
   send_dictate(0x80);
  send_data(shuzi[2]);
  send_data(shuzi[0]);
  if((mode==1)&&flash==1)
   {
	 send_data(0x20);
	 send_data(0x20);
	}
  else
   {
    send_data(shuzi[year/10]);
    send_data(shuzi[year%10]);
   }
  send_data(riqi[0]);
  send_data(riqi[1]);             //"年"
   
   if((mode==2)&&flash==1)
   {
	 send_data(0x20);
	 send_data(0x20);
	}
  else
   {
    send_data(shuzi[month/10]);
    send_data(shuzi[month%10]);
   }
  send_data(riqi[2]);
  send_data(riqi[3]);             //"月"
  
  if((mode==3)&&flash==1)
   {
	 send_data(0x20);
	 send_data(0x20);
	}
  else
   {
    send_data(shuzi[day/10]);
    send_data(shuzi[day%10]);
   }
  send_data(riqi[4]);
  send_data(riqi[5]);             //"日"
  send_data(riqi[18]);
  send_data(riqi[19]);     //空白


	 


  send_dictate(0x90);

  send_data(riqi[6]);
  send_data(riqi[7]); 
  send_data(riqi[8]);
  send_data(riqi[9]);          //"农历"

  

  send_data(shuzi3[month_moon/10*2]);
  send_data(shuzi3[month_moon/10*2+1]);
  if(month_moon==3)
    {
     send_data(0xc8);
     send_data(0xfd);
	 }
  else
   {
    send_data(shuzi4[month_moon%10*2]);
    send_data(shuzi4[month_moon%10*2+1]);
   } 
  send_data(riqi[2]);
  send_data(riqi[3]);                  //"月"
  if(day_moon!=10)
   {
    send_data(rongli[day_moon/10*2]);
    send_data(rongli[day_moon/10*2+1]);
	if((day_moon%10)==3)
    {
     send_data(0xc8);
     send_data(0xfd);
	 }
   else
	 {
     send_data(shuzi2[day_moon%10*2]);
     send_data(shuzi2[day_moon%10*2+1]);
    }   
	}
  else                                   //初十特殊处理
   {
    send_data(rongli[0]);
    send_data(rongli[1]);
    send_data(shuzi2[0]);
    send_data(shuzi2[1]);
   }
  send_data(riqi[4]);
  send_data(riqi[5]);                 //日

 

	
	send_dictate(0x88);
   
	send_data(riqi[10]);
   send_data(riqi[11]); 
   send_data(riqi[12]);
   send_data(riqi[13]);        //"星期"
   
  if((mode==4)&&flash==1)
   {
	 send_data(0x20);
	 send_data(0x20);
	}
   else
	 {
          if(week==3)
           {
            send_data(0xc8);
            send_data(0xfd);
			  }
          else
           {
	    send_data(xingqi[week*2]);
	    send_data(xingqi[week*2+1]);
           }
	 }
	send_data(riqi[18]);
    send_data(riqi[19]);      //空白
   
	if((mode==5)&&flash==1)
    {
	 send_data(0x20);
	 send_data(0x20);
	 }
   else
	 {
     send_data(shuzi[hour/10]);
     send_data(shuzi[hour%10]);
	 }
	send_data(shuzi[10]);

	if((mode==6)&&flash==1)
    {
	 send_data(0x20);
	 send_data(0x20);
	 }
	else
	 {
     send_data(shuzi[min/10]);
	  send_data(shuzi[min%10]);
	 }
    send_data(shuzi[10]);
	 send_data(shuzi[sec/10]);
	 send_data(shuzi[sec%10]);  //当前时间

	
	send_dictate(0x98);
  
	
	if(day<=jieqi1)
	 {
     send_data(jieqi[month*8]);
     send_data(jieqi[month*8+1]);
	  send_data(jieqi[month*8+2]);
     send_data(jieqi[month*8+3]);
	  send_data(shuzi[jieqi1/10]);
     send_data(shuzi[jieqi1%10]); //农历节气
	 }
    else
     {
	  if(day<=jieqi2&&day>jieqi1)
	   {
	    send_dictate(0x98);
	    send_data(jieqi[month*8+4]);
        send_data(jieqi[month*8+5]);
	    send_data(jieqi[month*8+6]);
        send_data(jieqi[month*8+7]);
	    send_data(shuzi[jieqi2/10]);
        send_data(shuzi[jieqi2%10]); //农历节气
	   }
      else
       {
        send_data(riqi[18]);
        send_data(riqi[19]);            //空白 
        send_data(riqi[18]);
        send_data(riqi[19]);            //空白 
        send_data(riqi[18]);
        send_data(riqi[19]);            //空白 
       }
	   }
    send_data(riqi[18]);
    send_data(riqi[19]);      //空白
	
	send_data(riqi[14]);
   send_data(riqi[15]);  
	send_data(riqi[16]);
   send_data(riqi[17]);    //"室温"

	send_data(shuzi[i/100]);
   send_data(shuzi[i/10%10]);
	send_data(shuzi[11]);
   send_data(shuzi[i%10*5]);           //当前温度
  }
  else
  {
   send_dictate(0x80);
   send_data(riqi[20]);
   send_data(riqi[21]);    //"闹钟"
	send_data(riqi[22]);
   send_data(riqi[23]);      
	send_data(riqi[18]);
   send_data(riqi[19]);      //空白
	send_data(riqi[18]);
   send_data(riqi[19]);      //空白
	if(alarm_controls==1)
	 {
	  send_data(riqi[24]);
     send_data(riqi[25]);      //"开"
	 }
	else
	 {
	 send_data(riqi[26]);
    send_data(riqi[27]);      //"关"
	 }
	send_dictate(0x88);
	if(mode==7&&flash==1)
	 {
     send_data(riqi[18]);
     send_data(riqi[19]);      //空白
	 }
	else
	 {
     send_data(shuzi[alarm_hour/10]);
     send_data(shuzi[alarm_hour%10]);      //闹钟时
	 }
	send_data(shuzi[10]);                 //":"
	if(mode==8&&flash==1)
	 {
     send_data(riqi[18]);
     send_data(riqi[19]);      //空白
	 }
	else
	 {
	  send_data(shuzi[alarm_min/10]);
     send_data(shuzi[alarm_min%10]);      //闹钟时
	 }
   }          
                         
  }


}
   


/********DS1302读写程序***************
/******************************************************************** 
函 数 名:RTInputByte()
功    能:实时时钟写入一字节
说    明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据 
返 回 值:无  
***********************************************************************/
void RTInputByte(uchar d) 
{ 
    uchar i;
    ACC = d;
    for(i=8; i>0; i--)
    {
      T_IO = ACC0;           /*相当于汇编中的 RRC */
      T_CLK = 1;
      T_CLK = 0;
      ACC = ACC >> 1; 
    } 
}
/******************************************************************** 
函 数 名:RTOutputByte()
功    能:实时时钟读取一字节
说    明:从DS1302读取1Byte数据 (内部函数)
入口参数:无  
返 回 值:ACC
***********************************************************************/
uchar RTOutputByte(void) 
{ 
    uchar i;
    for(i=8; i>0; i--)
    {
    
	   ACC = ACC >>1;         /*相当于汇编中的 RRC */
      ACC7 = T_IO;
      T_CLK = 1;
      T_CLK = 0;
    }  
    return(ACC); 
}
/******************************************************************** 
函 数 名:W1302()
功    能:往DS1302写入数据
说    明:先写地址,后写命令/数据 (内部函数)  
调    用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);       /* 地址,命令 */
    RTInputByte(ucDa);         /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 
函 数 名:R1302()
功    能:读取DS1302某地址的数据
说    明:先写地址,后读命令/数据 (内部函数)
调    用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);             /* 地址,命令 */
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
	
    return(ucData);
}

/******************************************************************** 
函 数 名:Set1302()
功    能:设置初始时间
说    明:先写地址,后读命令/数据(寄存器多字节方式)
调    用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
返 回 值:无
***********************************************************************/
void Set1302(uchar *pClock) 
{
    uchar i;
    uchar ucAddr = 0x80; 
    W1302(0x8e,0x00);           //控制命令,WP=0,允许写操作
    for(i =7; i>0; i--)
    { 
      W1302(ucAddr,*pClock);    // 秒 分 时 日 月 星期 年  
      pClock++;
      ucAddr +=2;
    }
    W1302(0x8e,0x80);           // 控制命令,WP=1,写保护
}   


//初始化函数
Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(20);
}

//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(4);
 }
 return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }
                    //delay(4);
}

                                  //读取温度
 ReadTemperature(void)
  {
   unsigned char a=0;

⌨️ 快捷键说明

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