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

📄 ht1380.c

📁 用ansi c 实现针对时钟芯片HT1380的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    // Not display the unit bits of second, that is let it flash
    disp_led (second, 0x08, 0x04, 2);
}

/*------------------------- HT1380 inc_year_10 -----------------------*/
void inc_year_10 ()
{
    if ( (year & 0x0F0) == 0x90 )
        year = year & 0x0F;
    else
        year = year + 0x10;
}

/*-------------------------- HT1380 inc_year_1 -----------------------*/
void inc_year_1 ()
{
    if ( (year & 0x0F) == 0x09 )
    {
        year = year & 0x0F0;
        inc_year_10 ();
    }
    else
        year = year + 0x01;
}

/*-------------------------- HT1380 inc_mon_10 -----------------------*/
void inc_mon_10 ()
{
    if ( (month & 0x0F0) == 0x10 )
        month = month & 0x0F;
    else
        month = month | 0x10;
}

/*-------------------------- HT1380 inc_mon_1 ------------------------*/
void inc_mon_1 ()
{
    if ( month >= 0x12)
        month = 0x01;
    else if ( month == 0x09)
        month = 0x10;
    else
        month = month + 0x01;
}

/*-------------------------- HT1380 inc_day_10 -----------------------*/
void inc_day_10 ()
{
    if ( (day & 0x0F0) == 0x30 )
        day = day & 0x0F;
    else
        day = day + 0x10;
}

/*-------------------------- HT1380 inc_day_1 ------------------------*/
void inc_day_1 ()
{
    if ( day >= 0x31 )
        day = 0x01;
    else if ( (day & 0x0F) == 0x09 )
    {
        day = day & 0x0F0;
        inc_day_10 ();
    }
    else
        day = day + 0x01;
}

/*------------------------- HT1380 inc_hour_10 -----------------------*/
void inc_hour_10 ()
{
    if ( (hour & 0x0F0) == 0x20 )
        hour = hour & 0x0F;
    else
        hour = hour + 0x10;
}

/*-------------------------- HT1380 inc_hour_1 -----------------------*/
void inc_hour_1 ()
{
    if ( hour >= 0x23 )
        hour = 0x00;
    else if ( (hour & 0x0F) == 0x09 )
    {
        hour = hour & 0x0F0;
        inc_hour_10 ();
    }
    else
        hour = hour + 0x01;
}

/*-------------------------- HT1380 inc_min_10 -----------------------*/
void inc_min_10 ()
{
    if ( (minute & 0x0F0) == 0x50 )
        minute = minute & 0x0F;
    else
        minute = minute + 0x10;
}

/*-------------------------- HT1380 inc_min_1 ------------------------*/
void inc_min_1 ()
{
    if ( minute == 0x59 )
        minute = 0x00;
    else if ( (minute & 0x0F) == 0x09 )
    {
        minute = minute & 0x0F0;
        inc_min_10 ();
    }
    else
        minute = minute + 0x01;
}

/*-------------------------- HT1380 inc_sec_10 -----------------------*/
void inc_sec_10 ()
{
    if ( (second & 0x0F0) == 0x50 )
        second = second & 0x0F;
    else
        second = second + 0x10;
}

/*-------------------------- HT1380 inc_sec_1 ------------------------*/
void inc_sec_1 ()
{
    if ( second == 0x59 )
        second = 0x00;
    else if ( (second & 0x0F) == 0x09 )
    {
        second = second & 0x0F0;
        inc_sec_10 ();
    }
    else
        second = second + 0x01;
}

/*------------------------- HT1380 dec_year_10 -----------------------*/
void dec_year_10 ()
{
    if ( (year & 0x0F0) == 0x00 )
        year = year | 0x90;
    else
        year = year - 0x10;
}

/*-------------------------- HT1380 dec_year_1 -----------------------*/
void dec_year_1 ()
{
    if ( (year & 0x0F) == 0x00 )
    {
        year = year | 0x09;
        dec_year_10 ();
    }
    else
        year = year - 0x01;
}

/*-------------------------- HT1380 dec_mon_10 -----------------------*/
void dec_mon_10 ()
{
    if ( (month & 0x0F0) == 0x10 )
        month = month & 0x0F;
    else
        month = month | 0x10;
}

/*-------------------------- HT1380 dec_mon_1 ------------------------*/
void dec_mon_1 ()
{
    if ( month == 0x01 | month >= 0x12)
        month = 0x12;
    else if ( month == 0x10)
        month = 0x09;
    else
        month = month - 0x01;
}

/*-------------------------- HT1380 dec_day_10 -----------------------*/
void dec_day_10 ()
{
    if ( (day & 0x0F0) == 0x00 )
        day = day | 0x30;
    else
        day = day - 0x10;
}

/*-------------------------- HT1380 dec_day_1 ------------------------*/
void dec_day_1 ()
{
    if ( day == 0x01 | day >= 0x31)
        day = 0x31;
    else if ( (day & 0x0F) == 0x00 )
    {
        day = day | 0x09;
        dec_day_10 ();
    }
    else
        day = day - 0x01;
}

/*------------------------- HT1380 dec_hour_10 -----------------------*/
void dec_hour_10 ()
{
    if ( (hour & 0x0F0) == 0x00 )
        hour = hour | 0x20;
    else
        hour = hour - 0x10;
}

/*-------------------------- HT1380 dec_hour_1 -----------------------*/
void dec_hour_1 ()
{
    if ( hour == 0x00 | hour >= 0x24)
        hour = 0x23;
    else if ( (hour & 0x0F) == 0x00 )
    {
        hour = hour | 0x09;
        dec_hour_10 ();
    }
    else
        hour = hour - 0x01;
}

/*-------------------------- HT1380 dec_min_10 -----------------------*/
void dec_min_10 ()
{
    if ( (minute & 0x0F0) == 0x00 )
        minute = minute | 0x50;
    else
        minute = minute - 0x10;
}

/*-------------------------- HT1380 dec_min_1 ------------------------*/
void dec_min_1 ()
{
    if ( minute == 0x00 )
        minute = 0x59;
    else if ( (minute & 0x0F) == 0x00 )
    {
        minute = minute | 0x09;
        dec_min_10 ();
    }
    else
        minute = minute - 0x01;
}

/*-------------------------- HT1380 dec_sec_10 -----------------------*/
void dec_sec_10 ()
{
    if ( (second & 0x0F0) == 0x00 )
        second = second | 0x50;
    else
        second = second - 0x10;
}

/*-------------------------- HT1380 dec_sec_1 ------------------------*/
void dec_sec_1 ()
{
    if ( second == 0x00 )
        second = 0x59;
    else if ( (second & 0x0F) == 0x00 )
    {
        second = second | 0x09;
        dec_sec_10 ();
    }
    else
        second = second - 0x01;
}

void main ()
{
    rst_1380_ = 0;
    sclk_1380 = 0;
    set_time ();
    blk_ctrl = 0;
    while (1)
    {
        read_key ();
        switch (FSM_State)
        {
            case SHOW_YEAR:
                if      (key0_hit)
                    FSM_State = SET_YEAR_10;
                else if (key2_hit)
                    FSM_State = SHOW_SEC;
                else if (key1_hit)
                    FSM_State = SHOW_MMDD;
                else
                {
                    read_time ();
                    disp_year ();
                }
                break;

            case SHOW_MMDD:
                if      (key0_hit)
                    FSM_State = SET_MON_10;
                else if (key2_hit)
                    FSM_State = SHOW_YEAR;
                else if (key1_hit)
                    FSM_State = SHOW_TIME;
                else
                {
                    read_time ();
                    disp_mmdd ();
                }
                break;

            case SHOW_TIME:
                if      (key0_hit)
                    FSM_State = SET_HOUR_10;
                else if (key2_hit)
                    FSM_State = SHOW_MMDD;
                else if (key1_hit)
                    FSM_State = SHOW_SEC;
                else
                {
                    read_time ();
                    disp_time ();
                }
                break;

            case SHOW_SEC:
                if      (key0_hit)
                    FSM_State = SET_SEC_10;
                else if (key2_hit)
                    FSM_State = SHOW_TIME;
                else if (key1_hit)
                    FSM_State = SHOW_YEAR;
                else
                {
                    second = read_sec ();
                    disp_sec  ();
                }
                break;

            case SET_YEAR_10:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_YEAR;
                }
                else if (key3_hit)
                    FSM_State = SET_YEAR_1;
                else if (key2_hit)
                    inc_year_10 ();
                else if (key1_hit)
                    dec_year_10 ();
                else
                    disp_set_year_10 ();
                break;

            case SET_YEAR_1:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_YEAR;
                }
                else if (key3_hit)
                    FSM_State = SET_YEAR_10;
                else if (key2_hit)
                    inc_year_1 ();
                else if (key1_hit)
                    dec_year_1 ();
                else
                    disp_set_year_1 ();
                break;

            case SET_MON_10:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_MMDD;
                }
                else if (key3_hit)
                    FSM_State = SET_MON_1;
                else if (key2_hit)
                    inc_mon_10 ();
                else if (key1_hit)
                    dec_mon_10 ();
                else
                    disp_set_mon_10 ();
                break;

            case SET_MON_1:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_MMDD;
                }
                else if (key3_hit)
                    FSM_State = SET_DAY_10;
                else if (key2_hit)
                    inc_mon_1 ();
                else if (key1_hit)
                    dec_mon_1 ();
                else
                    disp_set_mon_1 ();
                break;

            case SET_DAY_10:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_MMDD;
                }
                else if (key3_hit)
                    FSM_State = SET_DAY_1;
                else if (key2_hit)
                    inc_day_10 ();
                else if (key1_hit)
                    dec_day_10 ();
                else
                    disp_set_day_10 ();
                break;

            case SET_DAY_1:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_MMDD;
                }
                else if (key3_hit)
                    FSM_State = SET_MON_10;
                else if (key2_hit)
                    inc_day_1 ();
                else if (key1_hit)
                    dec_day_1 ();
                else
                    disp_set_day_1 ();
                break;

            case SET_HOUR_10:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_TIME;
                }
                else if (key3_hit)
                    FSM_State = SET_HOUR_1;
                else if (key2_hit)
                    inc_hour_10 ();
                else if (key1_hit)
                    dec_hour_10 ();
                else
                    disp_set_hour_10 ();
                break;

            case SET_HOUR_1:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_TIME;
                }
                else if (key3_hit)
                    FSM_State = SET_MIN_10;
                else if (key2_hit)
                    inc_hour_1 ();
                else if (key1_hit)
                    dec_hour_1 ();
                else
                    disp_set_hour_1 ();
                break;

            case SET_MIN_10:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_TIME;
                }
                else if (key3_hit)
                    FSM_State = SET_MIN_1;
                else if (key2_hit)
                    inc_min_10 ();
                else if (key1_hit)
                    dec_min_10 ();
                else
                    disp_set_min_10 ();
                break;

            case SET_MIN_1:
                if      (key0_hit)
                {
                    set_time ();
                    FSM_State = SHOW_TIME;
                }
                else if (key3_hit)
                    FSM_State = SET_HOUR_10;
                else if (key2_hit)
                    inc_min_1 ();
                else if (key1_hit)
                    dec_min_1 ();
                else
                    disp_set_min_1 ();
                break;

            case SET_SEC_10:
                if      (key0_hit)
                {
                    write_sec (second);
                    FSM_State = SHOW_SEC;
                }
                else if (key3_hit)
                    FSM_State = SET_SEC_1;
                else if (key2_hit)
                    inc_sec_10 ();
                else if (key1_hit)
                    dec_sec_10 ();
                else
                    disp_set_sec_10 ();
                break;

            case SET_SEC_1:
                if      (key0_hit)
                {
                    write_sec (second);
                    FSM_State = SHOW_SEC;
                }
                else if (key3_hit)
                    FSM_State = SET_SEC_10;
                else if (key2_hit)
                    inc_sec_1 ();
                else if (key1_hit)
                    dec_sec_1 ();
                else
                    disp_set_sec_1 ();
                break;

            default:
                FSM_State = SHOW_TIME;
                break;
        }
    key3_hit = 0;
    key0_hit = 0;
    key1_hit = 0;
    key2_hit = 0;
    if (blk_ctrl == BLK_TH * 2)
        blk_ctrl = 0;
    else
        blk_ctrl++;
    }
}

⌨️ 快捷键说明

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