📄 system.c
字号:
#include "includes.h"
#include "key.h"
#include "DS1302.h"
#include "Delay.h"
#include "HT1621B.h"
#include "prototype.h"
#include "radar.h"
/*
***************************************************************************************************
* Function name : ReadAndDisplay
* Description : Read the date&time from DS1302 and send to diaplay
* Note : None
* Parameters : None
* Returns : None
* Attribute : Public function
* Others : Application routin
***************************************************************************************************
*/
void ReadAndDisplay(void)
{
UCHAR_8 data;
static UCHAR_8 dot=0;
if (0x00!=dot)
{
dot = 0x00;
}
else
{
dot = 0x01;
}
data = DS1302ReadByte(DS_CLOCK_HOUR);
HT1621BWritedata(0x00,LED_CODE[(data>>4)%10]);//时十位显示
if (0x00!=dot)
{
HT1621BWritedata(0x02,LED_CODE[(data&0x0F)%10]);//时个位显示带点
}
else
{
HT1621BWritedata(0x02,LED_CODE[(data&0x0F)%10]&0x7F);//时个位显示不带点
}
data = DS1302ReadByte(DS_CLOCK_MIN);
if (0x00!=dot)
{
HT1621BWritedata(0x04,LED_CODE[((data&0x70)>>4)%10]);//秒十位显示带点
}
else
{
HT1621BWritedata(0x04,LED_CODE[((data&0x70)>>4)%10]&0x7F);//秒十位显示不带点
}
HT1621BWritedata(0x06,LED_CODE[(data&0x0F)%10]&0x7F);//秒个位显示
data = DS1302ReadByte(DS_CLOCK_YEAR);
HT1621BWritedata(0x08,LED_CODE[(data>>4)%10]);//年十位显示
HT1621BWritedata(0x0A,LED_CODE[(data&0x0F)%10]);//年个位显示
data = DS1302ReadByte(DS_CLOCK_MONTH);
HT1621BWritedata(0x0C,LED_CODE[(data>>4)%10]);//月十位显示
HT1621BWritedata(0x0E,LED_CODE[(data&0x0F)%10]);//月个位显示
data = DS1302ReadByte(DS_CLOCK_DATE);
HT1621BWritedata(0x10,LED_CODE[(data>>4)%10]&0x7F);//日十位显示
if (TESTBIT(SysFlag,Nag_bit))
{
HT1621BWritedata(0x12,LED_CODE[(data&0x0F)%10]);//负温,日个位显示
}
else
{
HT1621BWritedata(0x12,LED_CODE[(data&0x0F)%10]&0x7F);//正温,日个位显示
}
}
/*
***************************************************************************************************
* Function name : ReadAndStore
* Description : Read the data from DS1302 conver to metric and store to the buffer
* Note : This routine is application roution
* Parameters : UCHAR_8 * data_p,指向存储缓冲的指针
* Returns : None
* Attribute : Public function
* Others : 读回年月日小时分钟转换为十进制数并存储于缓冲,共五个字节
***************************************************************************************************
*/
void ReadConvAndStore(UCHAR_8 * data_p)
{
UCHAR_8 counter;
data_p[0] = DS1302ReadByte(DS_CLOCK_HOUR);
data_p[1] = DS1302ReadByte(DS_CLOCK_MIN);
data_p[2] = DS1302ReadByte(DS_CLOCK_YEAR);
data_p[3] = DS1302ReadByte(DS_CLOCK_MONTH);
data_p[4] = DS1302ReadByte(DS_CLOCK_DATE);
DS1302WriteByte(0x00,DS_CLOCK_CONTL);//写允许
DS1302WriteByte(0x80,DS_CLOCK_SEC);//时钟振荡停止
DS1302WriteByte(0x80,DS_CLOCK_CONTL);//写保护
for (counter=0;counter<5;counter++)
{
data_p[counter] = (data_p[counter]>>4)*10+(data_p[counter]&0x0F);
}
}
/*
***************************************************************************************************
* Function name : ConvertAndWrite
* Description : Convert metric number to BCD code, Write to DS1302 and send to display
* Note : This routine is application roution
* Parameters : UCHAR_8 * data_p,指向存储缓冲的指针
* Returns : None
* Attribute : Public function
* Others : 将十进制数转换为BCD码写入DS1302并送显示
***************************************************************************************************
*/
void ConvertAndWrite(const UCHAR_8 * const data_p)//第一个const表示数据内容不可更改,第二个const表示指针值不可更改
{
UCHAR_8 counter;
UCHAR_8 data_buf[5];
//convert metric to BCD code
for (counter=0;counter<5;counter++)
{
data_buf[counter] = ((data_p[counter]/10)<<4)|(data_p[counter]%10);
}
DS1302WriteByte(0x00,DS_CLOCK_CONTL);//写允许
DS1302WriteByte(data_buf[0],DS_CLOCK_HOUR);
DS1302WriteByte(data_buf[1],DS_CLOCK_MIN);
DS1302WriteByte(data_buf[2],DS_CLOCK_YEAR);
DS1302WriteByte(data_buf[3],DS_CLOCK_MONTH);
DS1302WriteByte(data_buf[4],DS_CLOCK_DATE);
DS1302WriteByte(0x30,DS_CLOCK_SEC);//时钟振荡开始,并设置为30秒
DS1302WriteByte(0x80,DS_CLOCK_CONTL);//写保护
}
/*
***************************************************************************************************
* Function name : Updown
* Description : Trade the time data
* Note : This routine is application roution
* Parameters : data_p:指向欲修改数据的指针
* : max_value:up操作时的峰值,若当前值为此值,按UP按钮将置为min_value,
* : min_value:down操作时的最小值,若当前值为此值,按DOWN按键将置为max_value
* Returns : 1:有按键操作,0:无按键操作
* Attribute : Public function
* Others : None
***************************************************************************************************
*/
UCHAR_8 Updown(UCHAR_8 * const data_p,UCHAR_8 max_value,UCHAR_8 min_value)//const 表示指针不可更改,但其指向的值可以改变
{
if (TESTBIT(ButtonFlag,KEY1_BIT))//up
{
CLEARBIT(ButtonFlag,KEY1_BIT);
(*data_p)++;
if ((*data_p)>max_value)
{
(*data_p) = min_value;
}
return(1);
}
if (TESTBIT(ButtonFlag,KEY2_BIT))//down
{
CLEARBIT(ButtonFlag,KEY2_BIT);
if ((*data_p)==min_value)
{
*data_p = max_value;
}
else
{
(*data_p)--;
}
return(1);
}
return(0);
}
/*
***************************************************************************************************
* Function name : KeyBoardTrade
* Description : Trade the keyboard data
* Note : This routine is application roution
* Parameters : None
* Returns : None
* Attribute : Public function
* Others : None
***************************************************************************************************
*/
void KeyBoardTrade(void)
{
/***************************hour min year month date**/
static UCHAR_8 time_buf[5] ={0x00,0x00,0x07,0x0B,0x00};
const UCHAR_8 max_value[5]={23, 59, 99, 12, 31};
const UCHAR_8 min_value[5]={ 0, 0, 0, 1, 1};
static UCHAR_8 set_flag=5;
if (0x00!=Radar_time)
{
if (5!=set_flag)//正在调时,立刻将数据保存退出
{
//将数据送显并存入DS1302,数据将保留于缓存中,并将开启DS1302走时
ConvertAndWrite(time_buf);
set_flag = 5;
}
return;
}
Alarm = 0;
if (!TESTBIT(SysFlag,Fir_Bit))
{
SETBIT(SysFlag,Fir_Bit);
HT1621BWritedata(0x18,0);
HT1621BWritedata(0x1A,0);
}
if (0x00!=ButtonFlag)//有任何按键将重新计时10秒
{
SetTimeOver = 0x0A;//调时空闲10秒将自动退出
}
if (TESTBIT(ButtonFlag,KEY3_BIT))
{
ButtonFlag = 0x00;//清除空闲间的按钮标志
if ((0x01==set_flag)||(0x04==set_flag))
{
HT1621BWritedata(set_flag*4,LED_CODE[(time_buf[set_flag]/10)%10]);
HT1621BWritedata(set_flag*4+2,LED_CODE[time_buf[set_flag]%10]&0x7F);
}
else if (set_flag<5)
{
HT1621BWritedata(set_flag*4,LED_CODE[(time_buf[set_flag]/10)%10]);
HT1621BWritedata(set_flag*4+2,LED_CODE[time_buf[set_flag]%10]);
}
set_flag++;
if (5==set_flag)
{
//将数据送显并存入DS1302,数据将保留于缓存中,并将开启DS1302走时
ConvertAndWrite(time_buf);
}
else if (6==set_flag)
{
set_flag = 0;
//将数据从DS1302读出并转换为十进制数存于缓冲中,并将停止DS1302走时
ReadConvAndStore(time_buf);
HT1621BWritedata(4,LED_CODE[(time_buf[1]/10)%10]);
}
}
else if (set_flag<5)
{
if (Updown(&time_buf[set_flag],max_value[set_flag],min_value[set_flag]))
{
if ((0x01==set_flag)||(0x04==set_flag))
{
HT1621BWritedata(set_flag*4,LED_CODE[(time_buf[set_flag]/10)%10]);
HT1621BWritedata(set_flag*4+2,LED_CODE[time_buf[set_flag]%10]&0x7F);
}
else
{
HT1621BWritedata(set_flag*4,LED_CODE[(time_buf[set_flag]/10)%10]);
HT1621BWritedata(set_flag*4+2,LED_CODE[time_buf[set_flag]%10]);
}
}
else if (0x00==LongKeyFlag)
{
if (TESTBIT(SysFlag,Time_500ms_Bit))
{
static UCHAR_8 dis=0;
CLEARBIT(SysFlag,Time_500ms_Bit);
if (0x00==dis)
{
dis = 0x01;
if ((0x00==set_flag)||(0x02==set_flag)||(0x03==set_flag))
{
HT1621BWritedata(set_flag*4,LED_CODE[(time_buf[set_flag]/10)%10]);
HT1621BWritedata(set_flag*4+2,LED_CODE[time_buf[set_flag]%10]);
}
else
{
HT1621BWritedata(set_flag*4,LED_CODE[(time_buf[set_flag]/10)%10]);
HT1621BWritedata(set_flag*4+2,LED_CODE[time_buf[set_flag]%10]&0x7F);
}
}
else
{
dis = 0x00;
if ((0x00==set_flag)||(0x02==set_flag)||(0x03==set_flag))
{
HT1621BWritedata(set_flag*4,0x80);
HT1621BWritedata(set_flag*4+2,0x80);
}
else
{
HT1621BWritedata(set_flag*4,0x80);
HT1621BWritedata(set_flag*4+2,0x00);
}
}
}
}
if (0x00==SetTimeOver)//超时退出
{
set_flag = 0x05;
//将数据送显并存入DS1302,数据将保留于缓存中,并将开启DS1302走时
ConvertAndWrite(time_buf);
}
}
else
{
if (TESTBIT(SysFlag,Time_500ms_Bit))
{
CLEARBIT(SysFlag,Time_500ms_Bit);
ReadAndDisplay();
ReadTempAndDisplay();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -