📄 keyb.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 + -