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

📄 system.c

📁 倒车雷达的原理图与源码
💻 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 + -