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

📄 按键温度.c

📁 万年历154.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code dispcode[]=
{0x3f,0x06,0x5b,0x4f,0x66, 
0x6d,0x7d,0x07,0x7f,0x6f}; 
unsigned char dispbuf[15]=
{2,0,0,8,1,2,3,0,0,0,0,0,0,0,1};//定义显示缓存数组
sbit  DS1302_CLK = P3^6;              //实时时钟时钟线引脚 
sbit  DS1302_IO  = P3^7;              //实时时钟数据线引脚 
sbit  DS1302_RST = P3^5;              //实时时钟复位线引脚 
sbit  wireless_1 = P3^0;
sbit  wireless_2 = P3^1;
sbit  wireless_3 = P3^2;
sbit  wireless_4 = P3^3;
sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;
uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数  
sbit Set = P0^0;       //模式切换键 
sbit Up = P0^1;        //加法按钮 
sbit Down = P0^2;      //减法按钮 
sbit out = P0^3;       //立刻跳出调整模式按钮  
sbit DQ = P0^4;        //温度传送数据IO口 
unsigned char mscnt;
unsigned char dispbitcnt;
uchar done,count,temp,flag,up_flag,down_flag; 
uchar temp_value;      //温度值
uchar TempBuffer[5],week_value[2];
//短延时程序
void short_delay()
{
  unsigned char i;
  for(i=0;i<5;i++);
}
//长延时程序
void long_delay()
{
  unsigned char i;
  for(i=0;i<125;i++);
}
#define DS1302_SECOND	0x80          //时钟芯片的寄存器位置,存放时间 
#define DS1302_MINUTE	0x82
#define DS1302_HOUR		0x84 
#define DS1302_WEEK		0x8A
#define DS1302_DAY		0x86
#define DS1302_MONTH	0x88
#define DS1302_YEAR		0x8C 
void show_time();
void DS1302InputByte(unsigned char d) 	//向实时时钟写入一字节(内部函数) 
{ 
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;           	 
        DS1302_CLK = 1;                 //下降沿有效  
        DS1302_CLK = 0;
        ACC = ACC >> 1;                 //相当于汇编中的 RRC 
    } 
}

unsigned char DS1302OutputByte(void) 	//实时时钟读取一字节(内部函数) 
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;         			//相当于汇编中的 RRC 
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    } 
    return(ACC); 
}

void Write1302(unsigned char ucAddr, unsigned char ucDa)	//ucAddr: DS1302地址, ucData: 要写的数据 
{
    DS1302_RST = 0;                 //复位引脚为低电平所有数据终止传送 
    DS1302_CLK = 0;                 //只有在CLK为低电平时才能将RSTY置为高电平  
    DS1302_RST = 1;                 //复位引脚为高电平,逻辑控制有效 
    DS1302InputByte(ucAddr);       	// 地址,命令 
    DS1302InputByte(ucDa);       	// 写1Byte数据 
    DS1302_CLK = 1;
    DS1302_RST = 0;
} 

unsigned char Read1302(unsigned char ucAddr)	//读取DS1302某地址的数据 
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址或命令 ,最低位为1时对寄存器进行读 ,为0时写  
    ucData = DS1302OutputByte();         // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}
/*延时子程序*/
void mdelay(uint delay)
{	uint i;
 	for(;delay>0;delay--)
   	for(i=0;i<62;i++); //1ms延时.
       		
   	
}


void outkey()                    //跳出调整模式,返回默认显示 
{ uchar Second;
  if(out==0||wireless_1==1)         
  { mdelay(8); 
	count=0;
	hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0; 
	Second=Read1302(DS1302_SECOND);
    Write1302(0x8e,0x00); //写入允许 
	Write1302(0x80,Second&0x7f);
	Write1302(0x8E,0x80);          //禁止写入 
	done=0;           
	//while(out==0);
	//while(wireless_1==1);
  }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Upkey()//升序按键
{	   
		Up=1;
		if(Up==0||wireless_2==1)
		          {
				   mdelay(8);
				       switch(count)
				          {case 1:
                                  temp=Read1302(DS1302_SECOND);  //读取秒数 
								  temp=temp+1;  //秒数加1
                                  up_flag=1;    //数据调整后更新标志 
								  if((temp&0x7f)>0x59)   //超过59秒,清零 
                                  temp=0;								  
								  break;
				           case 2:
                                  temp=Read1302(DS1302_MINUTE);  //读取分数 
								  temp=temp+1;  //分数加1
                                  up_flag=1;
								  if(temp>0x59)          //超过59分,清零 
								  temp=0;
								  break;
				           case 3:
                                  temp=Read1302(DS1302_HOUR);  //读取小时数 
								  temp=temp+1;  //小时数加1
                                  up_flag=1;
								  if(temp>0x23)   //超过23小时,清零 
								  temp=0;
								  break;
				           case 4:
                                  temp=Read1302(DS1302_WEEK);  //读取星期数 
								  temp=temp+1;  //星期数加1 
                                  up_flag=1;
								  if(temp>0x7)  
								  temp=1;
								  break;
				           case 5:
                                  temp=Read1302(DS1302_DAY);  //读取日数 
								  temp=temp+1;  //日数加1
                                  up_flag=1;
								  if(temp>0x31)
								  temp=1;
								  break;
				           case 6:
                                  temp=Read1302(DS1302_MONTH);  //读取月数 
								  temp=temp+1;  //月数加1 
                                  up_flag=1;
								  if(temp>0x12)
								  temp=1;
								  break;
				           case 7:
                                  temp=Read1302(DS1302_YEAR);  //读取年数 
								  temp=temp+1;  //年数加1
                                  up_flag=1;
								  if(temp>0x85)
								  temp=0;
								  break;
					       default:break;
				          }
					  
				   while(Up==0);
	               while(wireless_2==1);
				  }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按键
{	    
		Down=1;
	    if(Down==0||wireless_3==1)
		          {
				   mdelay(8);
				     switch(count)
				          {case 1:
                                  temp=Read1302(DS1302_SECOND);  //读取秒数
								  temp=temp-1;						    //秒数减1
                                  down_flag=1;       //数据调整后更新标志
								  if(temp==0x7f)     //小于0秒,返回59秒
								  temp=0x59;
								  break;
				           case 2:
                                  temp=Read1302(DS1302_MINUTE);  //读取分数        
								  temp=temp-1;  //分数减1
                                  down_flag=1;
								  if(temp==-1)
								  temp=0x59;      //小于0秒,返回59秒
								  break;
				           case 3:
                                  temp=Read1302(DS1302_HOUR);  //读取小时数 
								  temp=temp-1;  //小时数减1
                                  down_flag=1;
								  if(temp==-1)
								  temp=0x23;
								  break;
				           case 4:
                                  temp=Read1302(DS1302_WEEK);  //读取星期数 
								  temp=temp-1;  //星期数减1
                                  down_flag=1;
								  if(temp==0)
								  temp=0x7;;
								  break;
				           case 5:
                                  temp=Read1302(DS1302_DAY);  //读取日数 
								  temp=temp-1;  //日数减1
                                  down_flag=1;
								  if(temp==0)
								  temp=31;
								  break;
				           case 6:
                                  temp=Read1302(DS1302_MONTH);  //读取月数 
								  temp=temp-1;  //月数减1
                                  down_flag=1;
								  if(temp==0)
								  temp=12;
								  break;
				           case 7:
                                  temp=Read1302(DS1302_YEAR);  //读取年数
								  temp=temp-1;  //年数减1
                                  down_flag=1;
								  if(temp==-1)
								  temp=0x85;
								  break;
					      default:break;
				         }
					 
				   while(Down==0);
				   while(wireless_3==1);
				  }
}

void Setkey()//模式选择按键 
{
		Set=1;
		if(Set==0||wireless_4==1)
	    {
           mdelay(8);
           count=count+1;	 //Setkey按一次,count就加1
		   done=1;			 //进入调整模式 
           while(Set==0);
           while(wireless_4==1);
		 }

}

void keydone()//按键功能执行 
{        uchar Second;
		 if(flag==0)    //关闭时钟,停止计时 
         { Write1302(0x8e,0x00); //写入允许 
           temp=Read1302(0x80);
           Write1302(0x80,temp|0x80);
	       Write1302(0x8e,0x80); //禁止写入
           flag=1;
         }
         Setkey();				            //扫描模式切换按键 
		 switch(count)
		 {case 1:do					        //count=1,调整秒 
		          {
                   outkey();			   //扫描跳出按钮 
				   Upkey();                //扫描加按钮
				   Downkey();              //扫描减按钮
				   if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据 
				   {
				   Write1302(0x8e,0x00); //写入允许
				   Write1302(0x80,temp|0x80); //写入新的秒数 
				   Write1302(0x8e,0x80); //禁止写入 
				   up_flag=0;
				   down_flag=0;
				   }

				   hide_sec++;          //位闪计数 
				   if(hide_sec>3)
				     hide_sec=0;
                   show_time();         //液晶显示数据 

⌨️ 快捷键说明

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