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

📄 digitalclock.c

📁 主要使用12864液晶及DS1302,DS18B20完成的数字钟使多级菜单
💻 C
📖 第 1 页 / 共 5 页
字号:
void conversion_t(void)
{
  uchar save=0,save1=0;
  if(temp.temp_data<0) 	         // 判断数值符号
    {temp_pn=1;temp.temp_data=~temp.temp_data+1;}
  else temp_pn=0;
  if(temp.t_data[1]&0x01==1) save+=6;	    // 小数点后的值转变
  if((temp.t_data[1]>>1)&0x01==1) save+=12;
  if((temp.t_data[1]>>2)&0x01==1) save+=25;
  if((temp.t_data[1]>>3)&0x01==1) save+=50;
  temp.temp_data>>=4;
  save1=temp.temp_data&0x00ff;				// 整数部分数值
  temp.t_data[0]=save1;
  temp.t_data[1]=save;
  thl_als=1;
  if(save1>=(als_temp[0]&0x7f))      // 温度比较
  {
	if(!temp_pn||(temp_pn&(als_temp[0]&0x80)!=0)){ als_th=open;als_tl=close;}
  }
  else if(save1<(als_temp[1]&0x7f)&&als_temp[1]!=255)
  {
    if(!temp_pn||(temp_pn&(als_temp[1]&0x80)!=0)) {als_tl=open;als_th=close;}
  }
  else {als_th=als_tl=close;thl_als=0;buzstop=0;buzzer=close;} 
}



/*18b20功能*/
void ds18b20_func(void)
{
  EA=0;
  TR0=0;
  temp.temp_data=0;
  init_ds18b20(); 
  send18b20_byte(0xcc); // 跳过ROM
  send18b20_byte(0x44); // 温度转换
  delay_pw();
  init_ds18b20();
  send18b20_byte(0xcc); 
  send18b20_byte(0xbe); // 读RAM
  receive18b20();		// 读取温度值
  conversion_t();		// 数值转换
  EA=1;
  TR0=1;
}



/*=====================================================================================
 函数名称:画面构造
 功能描述:界面1、2、3,图片菜单,反白,标头,16*16(32)图片
 全局变量:无
 参数说明:函数说明
 返回说明:无
 设 计 人:LIJH
 版    本:1.0
 说    明:X坐标每一格每次16点
 ======================================================================================*/


/*反白或显示图片 参数格式:(H)8bit数据,(L)8bit数据,X0坐标(16bit),Y0坐标(1bit),X坐标(16bit),Y坐标(1bit)*/
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
  uchar i,j;
  for(j=0;j<yl;j++)
  {
    for(i=0;i<xl;i++)
    {
      wr_lcd(comm,0x34);     // 扩展功能
      wr_lcd(comm,y0+j);	 // 写Y坐标
      wr_lcd(comm,x0+i);	 // 写X坐标
      wr_lcd(comm,0x30);	 // 普通功能
      wr_lcd(dat,data1);
      wr_lcd(dat,data2);
    }
  }
  wr_lcd(comm,0x36);		 // 开绘图显示
}



/*显示字体 参数格式: 显示位置(0x80-0x9f),显示个数,显示内容指针*/
void display_cnasc(uchar dis_bit,uchar num,uchar *cnasc)
{
  wr_lcd(comm,0x30);	     // 普通功能
  wr_lcd(comm,dis_bit);	     // 写地址
  while(num>0)
  {
    wr_lcd(dat,*(cnasc++));
    wr_lcd(dat,*(cnasc++));
	num--; 
  }
}



/*导航标头显示*/
void dis_title(void)
{
  display_cnasc(0x80,1,"\x15 ");
  display_cnasc(0x90,1,"┏");
  display_cnasc(0x97,1,"┓");
  display_cnasc(0x98,1,"┗");
  display_cnasc(0x9f,1,"┛");
  display_cnasc(0x92,1,"\x1e ");
  display_cnasc(0x9a,1,"\x1f ");
  con_disp(0xff,0xff,0x80,0x80,3,16);
  con_disp(0xef,0xef,0x83,0x80,1,16);
  con_disp(0xde,0xf7,0x84,0x80,1,16);
  con_disp(0x76,0xdb,0x85,0x80,1,16);
  con_disp(0x55,0x55,0x86,0x80,1,16);
  con_disp(0x55,0x55,0x87,0x80,1,16);	
}


/*图片显示标头*/
void dis_title_pic(void)
{
  display_cnasc(0x80,2,"〓〓");
  display_cnasc(0x86,2,"〓〓");
}


/*功能实现显示标头*/
void dis_title_e(void)
{
  display_cnasc(0x80,1," \x15");
  con_disp(0xff,0xff,0x80,0x80,1,16);
  con_disp(0xff,0xc7,0x81,0x80,1,16);
  con_disp(0xff,0xff,0x82,0x80,3,16);
  con_disp(0xe3,0xff,0x85,0x80,1,16);
  con_disp(0xff,0xff,0x86,0x80,2,16);
}



/*显示菜单图片  格式:图片反显(1)或正常显示(0),显示图片的号码*/
void anti_nor_pic (uchar cpl_sign,uchar menu_num)
{
  uchar i,j,x,y;
  x=menu_num*3;	   // 计算图片显示坐标
  if(x>6) x--;
  if(menu_num<3) y=16;	// 上下半屏显示
  else y=8;
  if(cpl_sign==1) display_cnasc(0x82,4,menu_cn[menu_num]);
  for(j=0;j<24;j++)
  {
   for(i=0;i<2;i++)
   {
     wr_lcd(comm,0x34);
     wr_lcd(comm,0x80+y);
     wr_lcd(comm,0x80+x+i);  // 分两次显示 16bit
     wr_lcd(comm,0x30);
     if(cpl_sign==1)	      // 图片反选
     {
	   wr_lcd(dat,~menu_pic[menu_num][j*4+i*2]);
       wr_lcd(dat,~menu_pic[menu_num][j*4+i*2+1]);
	 }
     else					  // 正常显示
     {
	   wr_lcd(dat,menu_pic[menu_num][j*4+i*2]);
       wr_lcd(dat,menu_pic[menu_num][j*4+i*2+1]);
	 }
   }
   y++;
   if(y==32&&menu_num<3) {x+=8;y=0;}  // 上下屏切换
  }
  wr_lcd(comm,0x36);
}




/*状态16*16图片  格式:反色(1)或正常0,X坐标,Y坐标,状态编码(16*16)*/
void dis_run_state(uchar cpl,uchar x0,uchar y0,uchar state_num)
{
  uchar j;
  for(j=0;j<16;j++)
  {
    wr_lcd(comm,0x34);  // 扩展功能
    wr_lcd(comm,y0++);	// 写Y地址
    wr_lcd(comm,x0);	// 写X地址
    wr_lcd(comm,0x30);	// 普通功能
	if(cpl==1)			// 写数据
    {
	  wr_lcd(dat,~running[state_num][j*2]);
      wr_lcd(dat,~running[state_num][j*2+1]);
	}
	else
	{
	  wr_lcd(dat,running[state_num][j*2]);
      wr_lcd(dat,running[state_num][j*2+1]);
	}
  }
  wr_lcd(comm,0x36);
}

 

 /*显示菜单按钮  参数格式:反色(1)或正常(0)*/
void dis_menu_key(uchar d)
{
  if(d==1)
  {
    for(d=0;d<8;d++)								  // 显示菜单按钮
      con_disp(~menu_key[d*2],~menu_key[d*2+1],0x9f,0x97+d,1,1);
  }
  else
  {
    for(d=0;d<8;d++)								  // 显示菜单按钮
      con_disp(menu_key[d*2],menu_key[d*2+1],0x9f,0x97+d,1,1);
  }
}




/*显示模式3的界面*/
void dis_mode3(void)
{
  uchar i,j,h,l,x_0=0x80,y_0=0x90;
  h=now.hour>>4;       // 分离十位 个位
  l=now.hour&0x0f;
  for(j=0;j<2;j++)
  {
    for(i=0;i<32;i++)  // 十位个位一起读入
    { 
      wr_lcd(comm,0x34);
      wr_lcd(comm,y_0++);
      wr_lcd(comm,x_0);
      wr_lcd(comm,0x30);
      wr_lcd(dat,mode_3num[h][i*3]);  // 连续写数据,X坐标自动加1
      wr_lcd(dat,mode_3num[h][i*3+1]);
      wr_lcd(dat,mode_3num[h][i*3+2]);
      wr_lcd(dat,mode_3num[l][i*3]);
      wr_lcd(dat,mode_3num[l][i*3+1]);
      wr_lcd(dat,mode_3num[l][i*3+2]); 
      if(y_0==0xa0){x_0=x_0+8;y_0=0x80;}
    }
    x_0=0x84,y_0=0x90;
    h=now.minute>>4;   // 分离十位 个位
    l=now.minute&0x0f;
  }
  dis_run_state(0,0x83,0x90,4); // 显示点
  dis_run_state(0,0x8b,0x80,4);					   
  y_0=0x80;			   // 显示状态标记
  if(keb) {dis_run_state(0,0x87,y_0,2);y_0+=16;}
  if(alm) {dis_run_state(0,0x87,y_0,1);y_0+=16;}
  if(y_0<0xa0&&!als){dis_run_state(0,0x87,y_0,0);}
  if(y_0==0xa0&&!als){dis_run_state(0,0x8f,0x80,0);}
  dis_menu_key(0);
}




/*显示模式1和2的共用部分*/
void mode1_2_union(void)
{
  uchar x=0x9b;
  display_cnasc(0x98,2,"星期");
  if(nba_tim) dis_run_state(0,x,0x90,6);
  if(keb) {dis_run_state(0,x,0x90,2);x++;}    // 显示标记
  if(alm) {dis_run_state(0,x,0x90,1);x++;}
  if(!als){dis_run_state(0,x,0x90,0);}
  dis_menu_key(0);                           // 显示菜单按钮
}


/*显示模式2的日期*/
void dis_date_mode2(uchar d)
{
  uchar save[2];
  display_cnasc(d+2,1,"年");
  display_cnasc(d+4,1,"月");
  display_cnasc(d+6,1,"日");
  display_cnasc(0x9a,1,weeks[today.week]);  // 显示星期
  save[0]=char_num[today.year>>4];	        // 将显示的数值存到数组中
  save[1]=char_num[today.year&0x0f];
  display_cnasc(d+1,1,save);
  save[0]=char_num[today.month>>4];
  save[1]=char_num[today.month&0x0f];
  display_cnasc(d+3,1,save);
  save[0]=char_num[today.day>>4];
  save[1]=char_num[today.day&0x0f];
  display_cnasc(d+5,1,save);
}

/*显示模式2的时间数字显示  16*32*/
void num2_asc_dis(uchar num,uchar x_0)
{
  uchar i,y_0=0x90;
  for(i=0;i<32;i++)  // 十位个位一起读入
  { 
    wr_lcd(comm,0x36);
    wr_lcd(comm,y_0++);
    wr_lcd(comm,x_0);
    wr_lcd(comm,0x30);
    wr_lcd(dat,mode_2num[num][i*2]);
    wr_lcd(dat,mode_2num[num][i*2+1]);
	if(i==15){x_0+=8;y_0=0x80;}
  }
  wr_lcd(comm,0x36);
}

/*显示模式2的时间*/
void dis_time_mode2(void)
{
  uchar h,l;
  if(now.hour!=save_time.hour||init_d2)
  {
    h=now.hour>>4;    // 分离十位 个位
    l=now.hour&0x0f;
    num2_asc_dis(h,0x80);
	num2_asc_dis(l,0x80+1);
  }
  if(now.minute!=save_time.minute||init_d2)
  {
    h=now.minute>>4;    // 分离十位 个位
    l=now.minute&0x0f;
    num2_asc_dis(h,0x83); 
	num2_asc_dis(l,0x83+1);
  }
  if(now.second!=save_time.second||init_d2)
  {
    h=now.second>>4;    // 分离十位 个位
    l=now.second&0x0f;
    num2_asc_dis(h,0x86);
	num2_asc_dis(l,0x86+1);
  }
  if(init_d2)
  {
    dis_run_state(0,0x82,0x90,5); // 显示点
    dis_run_state(0,0x8a,0x80,5);
    dis_run_state(0,0x85,0x90,5); // 显示点
    dis_run_state(0,0x8d,0x80,5);
  }	
}


/*显示模式2的界面*/
void dis_mode2(void)
{
  dis_date_mode2(0x81);	      // 显示日期
  display_cnasc(0x81,1,"20");
  dis_time_mode2();			  // 显示时间
  mode1_2_union();
}


/*显示模式1的日期*/
void dis_date_mode1(void)
{
  uchar save[2];
  display_cnasc(0x80,3,"日期:"); 
  display_cnasc(0x90,3,"时间:"); 
  display_cnasc(0x88,3,"温度:");
  display_cnasc(0x9a,1,weeks[today.week]);  // 显示星期
  display_cnasc(0x83,1,"20");
  save[0]=char_num[today.year>>4];			  
  save[1]=char_num[today.year&0x0f];
  display_cnasc(0x84,1,save);
  save[0]='/';
  save[1]=char_num[today.month>>4];
  display_cnasc(0x85,1,save);
  save[0]=char_num[today.month&0x0f];
  save[1]='/';
  display_cnasc(0x86,1,save);
  save[0]=char_num[today.day>>4];
  save[1]=char_num[today.day&0x0f];
  display_cnasc(0x87,1,save);
  mode1_2_union();
}


/*显示模式1的时间*/
void dis_time_mode1(void)
{
  uchar save[2];
  save[0]=char_num[now.hour>>4];
  save[1]=char_num[now.hour&0x0f];
  display_cnasc(0x93,1,save);
  save[0]=':';
  save[1]=char_num[now.minute>>4];
  display_cnasc(0x94,1,save);
  save[0]=char_num[now.minute&0x0f];
  save[1]=':';
  display_cnasc(0x95,1,save);
  save[0]=char_num[now.second>>4];
  save[1]=char_num[now.second&0x0f];
  display_cnasc(0x96,1,save);
}


/*显示模式1的温度*/
void dis_temp_mode1(void)
{
  uchar save[2];
  if(ds18b20)
  {
	 if(temp.t_data[0]>99)
	 {
	    save[0]=char_num[temp.t_data[0]/100];
		save[1]=char_num[(temp.t_data[0]/10)%10];
		display_cnasc(0x8b,1,save);
		save[0]=char_num[temp.t_data[0]%10];
		save[1]='.';
		display_cnasc(0x8c,1,save);
		save[0]=char_num[temp.t_data[1]/10];
		save[1]=' ';
		display_cnasc(0x8d,1,save);
		display_cnasc(0x8e,1,"℃");
	  }
	  else
	  {
        if(temp_pn) display_cnasc(0x8a,1,":-");
	    else  display_cnasc(0x8a,1,":");
		save[0]=char_num[temp.t_data[0]/10];
		save[1]=char_num[temp.t_data[0]%10];
		display_cnasc(0x8b,1,save);
		save[0]='.';
		save[1]=char_num[temp.t_data[1]/10];
		display_cnasc(0x8c,1,save);
		display_cnasc(0x8d,1,"℃");
	  }
	}
  else display_cnasc(0x8b,3,"FF.F℃");

⌨️ 快捷键说明

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