?? 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 + -