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

📄 keyb.c

📁 nokia3310多功能温度计设计
💻 C
字号:
/* 其中键盘扫描程序返回的n数值分别代表 1:P1.0 
                                       2:P1.1 
									   3:P1.2 
									   4:P1.3 
	    	89S51实验板				   5:P1.4 */ 
									  
#include "reg51.h"
#include "stdio.h"

//外部变量函数			  
sbit BLACK_LIGHT=P2^4;  //背光控制
//------------------LPH7366.C------------------
extern void LPH7366_write_str(unsigned char line,unsigned char row,unsigned char str); //LPH7366任意写入字符函数
extern void data_tick(unsigned char i_data); //数据拆分函数
extern unsigned char ge,shi;  //数据拆分
//-----------------time.C----------------------
extern struct time
{ 
  unsigned char hour;
  unsigned char minute;
  unsigned char second;
}local_time,alarm_time,temp_time;
extern bit second_flag;   //秒信号标志
//------------------温度计.C-------------------
extern void temp_display();  //温度显示
//------------------DS18B20.C------------------
extern void temp_data_turn(float in_data);  //DS18B20读取温度转换
extern signed char temp_TL,temp_TH;  //温度上下限
extern bit T_sign;   //温度正负符号
//------------------------------------------
//内部变量函数
unsigned char keyB();  //键盘扫描 
void time_switch();  //时间功能切换
void temp_switch();  //温度功能切换
void temp_set_display(unsigned char option_i); //温度切换显示
void temp_set_option_display(signed char temp);  //温度切换显示子函数
void time_set_display(unsigned char option_i); //时间切换显示
void time_set_option_display(struct time i); //时间切换显示子函数
void key_time_setdone(struct time *i);  //时间调整
void key_temp_setdone(unsigned char *i);  //温度调整
void flash_co(unsigned char set_i);  //闪烁控制函数

bit key_flag=1;   //键盘标志位
bit flash=0;  //闪烁总开关
bit flash1;  //闪烁控制位
bit flash2;  //闪烁控制位
bit flash3;  //闪烁控制位
extern bit ring_flag;  //闹铃
unsigned char data key;
unsigned char key_option_i; //具体哪位调整 共有3位可调  
unsigned char temp_TLTH_dis;  //显示用TH_dis,TL_dis


/******************************键盘函数********************************/
/*函数原型:unsigned char keyB()
/*函数功能:键盘扫描
/*输入参数:无
/*输出参数:key (根据该数值进行判断是哪个键被按下)
/*调用模块:无

/**********************************************************************/
unsigned char keyB()    //键盘扫描子程序
{    unsigned char data i;
     i=P1;   //读P1口
     i=i|0xe0;  //屏蔽高3位 为1
      switch(i)
	 {case 0xfe: key=1;
	  break;
	  case 0xfd: key=2;
	  break;
	  case 0xfb: key=3;
	  break;
	  case 0xf7: key=4;
	  break;
	  case 0xef: key=5;
	  break;
	  case 0xff: key=6;
	  default:  key=0; 
	  break;
	 }
	  return(key);
}

/****************************键盘主函数********************************/
/*函数原型:void key_mian()
/*函数功能:最上级键盘操作
/*输入参数:无
/*输出参数:无
/*调用模块:keyB(),time_set(),temp_set()

/**********************************************************************/
void key_main()
{
    keyB();

  if(key==1&&key_flag)  //时间
  {
    key_flag=0;
    time_switch();  //时间功能切换
  }
  if(key==2&&key_flag)  //温度
  { 
    key_flag=0;
    temp_switch();  //温度功能切换
  }

  if(key==4&&key_flag)  //背光控制
  { 
    key_flag=0;
    BLACK_LIGHT=~BLACK_LIGHT;
  }

  if(key==5&&key_flag)   //闹铃控制
  {
    key_flag=0;
    ring_flag=~ring_flag;
  }

  if(key==3||key==0)  //键盘标志位复位
  {
    key_flag=1;
  }
    flash=0;
	flash_co(0);
}

/***************************时间功能切换函数***************************/
/*函数原型:void time_switch()
/*函数功能:时间功能切换
/*输入参数:无
/*输出参数:无
/*调用模块:keyB(),key_time_setdone(),LPH7366_write_str(),time_set_display()

/**********************************************************************/
void time_switch()
{
  key_option_i=1;  //键盘按键计数器
  while(1)
 {keyB();
//------------3号键---------------------
  if(key==3&&key_flag)  //功能切换
  {
    key_flag=0;
    key_option_i++;
    if(key_option_i==4)  
    key_option_i=1;
  }
//-----------4号键-------------------
  if(key==4&&key_flag)  //背光控制
  {
    key_flag=0;
    BLACK_LIGHT=~BLACK_LIGHT;
  }
//-----------5号键-------------------
  if(key==5&&key_flag)  //确定
  {
    key_flag=0;
	if(key_option_i==1)
    key_time_setdone(&local_time);  //时间功能的具体那项功能设置 1:local_time  2:alarm_time  3:temp_time
   	if(key_option_i==2)
    key_time_setdone(&alarm_time); 
	if(key_option_i==3)
    key_time_setdone(&temp_time); 
	LPH7366_write_str(6,9,0x00);  //显示空格
    LPH7366_write_str(6,10,0x00);  //显示空格
    break;
  }
//---------其余键--------------------
  if(key==1||key==2||key==0)
  {
    key_flag=1;
  }
//-----------------------------------
  time_set_display(key_option_i);   //功能切换时显示
  }
}

/***************************温度功能切换函数***************************/
/*函数原型:void temp_switch()
/*函数功能:温度功能切换
/*输入参数:无
/*输出参数:无
/*调用模块:keyB(),key_temp_setdone(),temp_set_display()

/**********************************************************************/
void temp_switch()
{
  key_option_i=1;  //键盘按键计数器
  while(1)
 {keyB();
//------------3号键---------------------
  if(key==3&&key_flag)  //功能切换
  {
    key_flag=0;
    key_option_i++;
    if(key_option_i==3)  
    key_option_i=1;
  }
//-----------4号键-------------------
  if(key==4&&key_flag)  //背光控制
  {
    key_flag=0;
    BLACK_LIGHT=~BLACK_LIGHT;
  }
//-----------5号键-------------------
  if(key==5&&key_flag)  //确定
  {
    key_flag=0;
	if(key_option_i==1)
    key_temp_setdone(&temp_TH);  //时间功能的具体那项功能设置  1:TH  2:TL
  	if(key_option_i==2)
    key_temp_setdone(&temp_TL);
	LPH7366_write_str(3,6,0);  //显示空格
    LPH7366_write_str(3,7,0);  //显示空格
    break;
  }
//----------其余键--------------------
  if(key==1||key==2||key==0)
  {
    key_flag=1;
  }
//-----------------------------------
  temp_set_display(key_option_i);   //功能切换时显示
  }
}

/**************************时间切换显示函数****************************/
/*函数原型:void time_set_display(unsigned char option_i)
/*函数功能:时间切换显示
/*输入参数:无
/*输出参数:无
/*调用模块:time_set_option_display(),LPH7366_write_str(),

/**********************************************************************/
void time_set_display(unsigned char option_i)
{
  if(option_i==1)  //local_time
 {
     time_set_option_display(local_time);
	 LPH7366_write_str(6,9,0x00);  //显示空格
     LPH7366_write_str(6,10,35);  //显示C
 }

  if(option_i==2)  //alarm_time
 {
     time_set_option_display(alarm_time);
     LPH7366_write_str(6,9,0x00);  //显示空格
     LPH7366_write_str(6,10,33);  //显示A
 }

 if(option_i==3)  //temp_time
 {
     time_set_option_display(temp_time);
     LPH7366_write_str(6,9,0x00);  //显示空格
     LPH7366_write_str(6,10,52);  //显示T
 }
}

/***************************时间切换显示子函数************************/
/*函数原型:void time_set_option_display(struct time i)
/*函数功能:时间切换显示子函数
/*输入参数:无
/*输出参数:无
/*调用模块:data_tick(),LPH7366_write_str()

/**********************************************************************/
void time_set_option_display(struct time i)
{
     data_tick(i.hour);  //hour
	  if(flash1==1)
	 {
	  if(second_flag==1)
      {
	   LPH7366_write_str(6,1,(shi+16));
	   LPH7366_write_str(6,2,(ge+16));
	  }
	  else
      { 
	   LPH7366_write_str(6,1,60);  //55
	   LPH7366_write_str(6,2,60);
	  }
	 }
	  else
	 {
	  LPH7366_write_str(6,1,(shi+16));
	  LPH7366_write_str(6,2,(ge+16));
	 }

     if(second_flag==1)
     LPH7366_write_str(6,3,26);  //:
	 else
     LPH7366_write_str(6,3,0);  // 

      data_tick(i.minute);   //minute
	  if(flash2==1)
	 {
	  if(second_flag==1)
      {
	   LPH7366_write_str(6,4,(shi+16));
	   LPH7366_write_str(6,5,(ge+16));
	  }
	  else
      { 
	   LPH7366_write_str(6,4,60);  //55
	   LPH7366_write_str(6,5,60);
	  }
	 }
	 else
	{
     LPH7366_write_str(6,4,(shi+16));
	 LPH7366_write_str(6,5,(ge+16));
	}

     if(second_flag==1)
     LPH7366_write_str(6,6,26);  //:
	 else
     LPH7366_write_str(6,6,0);  // 

	  data_tick(i.second);   //second
	  if(flash3==1)
	 {
	  if(second_flag==1)
      {
	   LPH7366_write_str(6,7,(shi+16));
	   LPH7366_write_str(6,8,(ge+16));
	  }
	  else
      { 
	   LPH7366_write_str(6,7,60);  //55
	   LPH7366_write_str(6,8,60);
	  }
	 }
	 else
	 {
	  LPH7366_write_str(6,7,(shi+16));
	  LPH7366_write_str(6,8,(ge+16));
	 }
}

/***************************温度切换显示函数***************************/
/*函数原型:void temp_set_display(unsigned char option_i)
/*函数功能:温度切换显示
/*输入参数:无
/*输出参数:无
/*调用模块:temp_set_option_display(),LPH7366_write_str()

/**********************************************************************/
void temp_set_display(unsigned char option_i)
{
  if(option_i==1)  //TH
 { 
   temp_set_option_display(temp_TH);
   LPH7366_write_str(3,6,52);  //显示T
   LPH7366_write_str(3,7,40);  //显示H
 }

 if(option_i==2)  //TL
 {  
   temp_set_option_display(temp_TL);
   LPH7366_write_str(3,6,52);  //显示T
   LPH7366_write_str(3,7,44);  //显示L
 }
}


/***************************温度切换显示子函数函数*********************/
/*函数原型:void temp_set_option_display(signed char option_i)
/*函数功能:温度切换显示子函数
/*输入参数:无
/*输出参数:无
/*调用模块:temp_data_turn(),LPH7366_write_str(),

/**********************************************************************/
void temp_set_option_display(signed char temp)
{
     if(temp>0)   //正值
     T_sign=0;

      else   //负值
     { 
     T_sign=1;
	 temp_TLTH_dis=temp*(-1);
     }

     if(T_sign==1)  //负值
     temp_data_turn(temp_TLTH_dis); //转换温度数值
     else  //正值
     temp_data_turn(temp); //转换温度数值

     temp_display(); 

     data_tick(local_time.hour);
     LPH7366_write_str(6,1,(shi+16));
	 LPH7366_write_str(6,2,(ge+16));

     if(second_flag==1)
     LPH7366_write_str(6,3,26);  //:
	 else
     LPH7366_write_str(6,3,0);  // 

     data_tick(local_time.minute);
     LPH7366_write_str(6,4,(shi+16));
	 LPH7366_write_str(6,5,(ge+16));

     if(second_flag==1)
     LPH7366_write_str(6,6,26);  //:
	 else
     LPH7366_write_str(6,6,0);  // 

	 data_tick(local_time.second);
     LPH7366_write_str(6,7,(shi+16));
	 LPH7366_write_str(6,8,(ge+16));  
}

/***************************时间调整函数************************/
/*函数原型:void key_time_setdone(struct time *i)
/*函数功能:时间调整
/*输入参数:无
/*输出参数:无
/*调用模块:无

/***************************************************************/
void key_time_setdone(struct time *i)
{
  unsigned char set_i=1;  //设置计数器
  
   while(1)
  {
    keyB();

	if(key==1&&key_flag)  //+
	{
      key_flag=0;
	  if(set_i==1)
      {
	   i->hour++;
	   if(i->hour==24)
	   i->hour=0;
	  }

	  if(set_i==2)
      {
	   i->minute++;
	   if(i->minute==60)
	   i->minute=0;
	  }

	  if(set_i==3)
      {
	   i->second++;
	   if(i->second==60)
	   i->second=0;
	  }
	}

   	if(key==2&&key_flag)  //-
	{
	  key_flag=0;
 	   if(set_i==1)
      {
	   i->hour--;
	   if(i->hour==0xff)
	   i->hour=23;
	  }

	  if(set_i==2)
      {
	   i->minute--;
	   if(i->minute==0xff)
	   i->minute=59;
	  }

	  if(set_i==3)
      {
	   i->second--;
	   if(i->second==0xff)
	   i->second=59;
	  }
	}

	if(key==3&&key_flag)  //设置位调整
	{
	  key_flag=0;
      set_i++;
	  if(set_i==4)
	  set_i=1;
	}

	if(key==4&&key_flag)  //背光
	{
      key_flag=0;
      BLACK_LIGHT=~BLACK_LIGHT;
	}

	if(key==5&&key_flag)  //跳出
	{
	  key_flag=0;
      break;
	}

	if(key==0)
	{
	 key_flag=1;
	}
	flash=1;
	flash_co(set_i);
	time_set_display(key_option_i);
  }
}

/***************************温度调整函数************************/
/*函数原型:void key_temp_setdone(unsigned char i)
/*函数功能:温度调整
/*输入参数:无
/*输出参数:无
/*调用模块:keyB(),temp_set_display()

/***************************************************************/
void key_temp_setdone(signed char *i)
{
    while(1)
  {
    keyB();

	if(key==1&&key_flag)  //+  温度设置在-55~125C
	{
       key_flag=0;
	   (*i)++;
	   if((*i)>125)
	   (*i)=-55;
	}

   	if(key==2&&key_flag)  //-
	{
	  key_flag=0;
	   (*i)--;
	   if((*i)<-55)
	   (*i)=125;
	}

	if(key==4&&key_flag)  //背光
	{
      key_flag=0;
      BLACK_LIGHT=~BLACK_LIGHT;
	}

	if(key==5&&key_flag)  //跳出
	{
	  key_flag=0;
      break;
	}

	if(key==0||key==3)
	{
	 key_flag=1;
	}
	temp_set_display(key_option_i);
  }
}

/********************************闪烁控制函数******************************/
/*函数原型:void flash_co(unsigned char set_i)
/*函数功能:闪烁控制
/*输入参数:无
/*输出参数:无
/*调用模块:无

/**************************************************************************/
void flash_co(unsigned char set_i)
{
   if(flash==1)
 { if(set_i==1)   //第1个标志位闪烁
  {
    flash1=1;
	flash2=0;
	flash3=0;
  }

   if(set_i==2)  //第2个标志位闪烁
  {
    flash1=0;
	flash2=1;
	flash3=0;
  }

   if(set_i==3)  //第3个标志位闪烁
  {
    flash1=0;
	flash2=0;
	flash3=1;
  }
 }
  else 
 {
  if(set_i==0)
  {
   flash1=0;
   flash2=0;
   flash3=0;
  }
 }
}



⌨️ 快捷键说明

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