3.5.1_プログラムリスト(ALARMCLOCK_User.c)

修正箇所(自動生成ファイルに記述追加)は、以下の青色の箇所です。
#include "C:\\WIZ_C\\Ver17\\Projects\\ALARMCLOCK\\ALARMCLOCK_Auto.h"
#include "C:\\WIZ_C\\Ver17\\Projects\\ALARMCLOCK\\i2c.h"

#include <Strings.h>

#__config _CONFIG1H, 0x02
#__config _CONFIG1L, 0x00
#__config _CONFIG2H, 0x0E
#__config _CONFIG2L, 0x0E
#__config _CONFIG3H, 0x01
#__config _CONFIG3L, 0x00
#__config _CONFIG4H, 0x00
#__config _CONFIG4L, 0x81

int    alarm_Out_Count;
BYTE    out_str1[17], out_str2[17], clock_Buf[7], weekdays_str1[4], weekdays_str2[5];
BYTE    TimerCount1, SetModeNo, cursorNo_Set;
BYTE    alarm_min, alarm_hour, alarm_Out;
BYTE    alarm_hour_Set, alarm_min_Set;
BYTE    sec, min, hour, day, week, weekdays, month, year, time_Work1, premin;
BYTE    sec_Set, min_Set, hour_Set, day_Set, weekdays_Set, month_Set, year_Set;
bit    Flag500mSec, EEWSet1, EEWSet2;
bit    LeftKey, RightKey, UpKey, DownKey, DispModeKey, SetModeKey, SetKey ,write_Set;

void I2C_RTC_Write(BYTE *data);
void I2C_RTC_Read(BYTE *data);
void DispCursor1(BYTE cursorNo_Set);
void DispCursor2(BYTE cursorNo_Set);


//
// This file includes all user definable routines. It may be changed at will as
// it will not be regenerated once the application has been generated for the
// first time.
//

//*******************************************************************************
//
// Insert your interrupt handling code if required here.
// Note quick interrupts are used so code must be simple
// See the manual for details of quick interrupts.
//

void UserInterrupt()
{
    // Insert your code here
    if(PIR1 & (1<<CCP1IF))
    {
        PIR1 &= ~(1<<CCP1IF);
        TimerCount1 = TimerCount1 + 1;
        if(TimerCount1 >= 5)
        {
            Flag500mSec = 1;
            TimerCount1 = 0;
        }
    }

#asmline goto UserIntReturn    ; PIC Assembler - go back to interrupt routine
}


//*******************************************************************************
//
// Insert your initialisation code if required here.
// Note that when this routine is called Interrupts will not be enabled - the
// Application Designer will enable them before the main loop
//

void UserInitialise()
{
    alarm_hour = ReadEEData(0);
    alarm_min = ReadEEData(1);
    if(alarm_hour > 24)
        alarm_hour = 0;
    if(alarm_min > 59)
        alarm_min = 0;
    SetModeNo = 0;
    PC.B6 = 0;        //BUZZER OFF
    hour = 99;
    min = 99;
    INTCON |= 1<<PEIE;
    PIE1 |= 1<<CCP1IE;

}

//*******************************************************************************
//
// Insert your main loop code if required here. This routine will be called
// as part of the main loop code
//

void UserLoop()
{
    if(Flag500mSec)
    {
        Flag500mSec = 0;
        if(write_Set)
        {
            if(SetModeNo == 1)
            {
                //clock write(RTC)
                time_Work1 = sec_Set / 10;
                clock_Buf[0] = (time_Work1 << 4) + (sec_Set % 10);
                time_Work1 = min_Set / 10;
                clock_Buf[1] = (time_Work1 << 4) + (min_Set % 10);
                time_Work1 = hour_Set / 10;
                clock_Buf[2] = (time_Work1 << 4) + (hour_Set % 10);
                time_Work1 = day_Set / 10;
                clock_Buf[3] = (time_Work1 << 4) + (day_Set % 10);
                clock_Buf[4] = weekdays_Set;
                time_Work1 = month_Set / 10;
                clock_Buf[5] = (time_Work1 << 4) + (month_Set % 10);
                time_Work1 = year_Set / 10;
                clock_Buf[6] = (time_Work1 << 4) + (year_Set % 10);
                I2C_RTC_Write(clock_Buf);
                sec = sec_Set;
                min = min_Set;
                hour = hour_Set;
                day = day_Set;
                month = month_Set;
                year = year_Set;
                SetModeNo = 0;
                write_Set = 0;        
            }
            if(SetModeNo == 2)
            {
                if(EEWSet2)
                {        
                    //PIC EEPROM
                    EEWSet1 = 0;
                    EEWSet2 = 0;
                    WriteEEData(1,alarm_min_Set);
                    alarm_hour = alarm_hour_Set;
                    alarm_min = alarm_min_Set;
                    SetModeNo = 0;
                    write_Set = 0;
                }
                if(EEWSet1)
                {    
                    //PIC EEPROM
                    WriteEEData(0,alarm_hour_Set);
                    EEWSet1 = 0;
                    EEWSet2 = 1;
                }
            }
        }
        else
        {
            //clock read(RTC)
            I2C_RTC_Read(clock_Buf);
            time_Work1 = clock_Buf[0];
            sec = ((time_Work1 >> 4) & 0x07) * 10 + (time_Work1 & 0x0F);
            time_Work1 = clock_Buf[1];
            min = ((time_Work1 >> 4) & 0x07) * 10 + (time_Work1 & 0x0F);
            time_Work1 = clock_Buf[2];
            hour = ((time_Work1 >> 4) & 0x03) * 10 + (time_Work1 & 0x0F);
            time_Work1 = clock_Buf[3];
            day = ((time_Work1 >> 4) & 0x03) * 10 + (time_Work1 & 0x0F);
            time_Work1 = clock_Buf[4];
            weekdays = time_Work1 & 0x07;
            time_Work1 = clock_Buf[5];
            month = ((time_Work1 >> 4) & 0x01) * 10 + (time_Work1 & 0x0F);
            time_Work1 = clock_Buf[6];
            year = ((time_Work1 >> 4) & 0x0F) * 10 + (time_Work1 & 0x0F);
            if(SetModeNo == 0)
            {
                switch(weekdays)
                {
                    case 0:
                        sprintf(weekdays_str2,"Sun.");
                        break;            
                    case 1:
                        sprintf(weekdays_str2,"Mon.");
                        break;            
                    case 2:
                        sprintf(weekdays_str2,"Tue.");
                         break;            
                    case 3:
                        sprintf(weekdays_str2,"Wed.");
                         break;            
                    case 4:
                        sprintf(weekdays_str2,"Thu.");
                         break;            
                    case 5:
                        sprintf(weekdays_str2,"Fri.");
                         break;            
                    case 6:
                        sprintf(weekdays_str2,"Sat.");
                         break;            
                }        
                if(!PC.B7)    //ALARM SW ON
                {
                    sprintf(out_str1,"%02d/%02d/%02d %04s AL",year,month,day,weekdays_str2);
                    LCDPrintAt(0,0);
                    LCDString(out_str1);
                    sprintf(out_str2,"%02d:%02d:%02d %02d:%02d",hour,min,sec,alarm_hour,alarm_min);
                    LCDPrintAt(0,1);
                    LCDString(out_str2);
                }
                else
                {
                    sprintf(out_str1,"%02d/%02d/%02d %04s ",year,month,day,weekdays_str2);
                    LCDPrintAt(0,0);
                    LCDString(out_str1);
                    sprintf(out_str2,"%02d:%02d:%02d ",hour,min,sec);
                    LCDPrintAt(0,1);
                    LCDString(out_str2);
                }
            }
            if(SetModeNo == 1)
            {
                switch(weekdays_Set)
                {
                    case 0:
                        sprintf(weekdays_str1,"Sun");
                        break;            
                    case 1:
                        sprintf(weekdays_str1,"Mon");
                        break;            
                    case 2:
                        sprintf(weekdays_str1,"Tue");
                        break;            
                    case 3:
                        sprintf(weekdays_str1,"Wed");
                        break;            
                    case 4:
                        sprintf(weekdays_str1,"Thu");
                        break;            
                    case 5:
                        sprintf(weekdays_str1,"Fri");
                        break;            
                    case 6:
                        sprintf(weekdays_str1,"Sat");
                        break;            
                }        
                sprintf(out_str1,"SET %02d/%02d/%02d %03s",year_Set, month_Set, day_Set, weekdays_str1);
                LCDPrintAt(0,0);
                LCDString(out_str1);
                sprintf(out_str2,"No1 %02d:%02d:%02d ",hour_Set, min_Set, sec_Set);
                LCDPrintAt(0,1);
                LCDString(out_str2);
                DispCursor1(cursorNo_Set);
            }
            if(SetModeNo == 2)
            {
                sprintf(out_str1,"SET *ALARM* ");
                LCDPrintAt(0,0);
                LCDString(out_str1);
                sprintf(out_str2,"No2 %02d:%02d ",alarm_hour_Set,alarm_min_Set);
                LCDPrintAt(0,1);
                LCDString(out_str2);
                DispCursor2(cursorNo_Set);
            }
        }
        if(alarm_Out)
        {
            if(PC.B6)
                PC.B6 = 0;
            else
                PC.B6 = 1;
            alarm_Out_Count = alarm_Out_Count + 1;
            if(alarm_Out_Count > 360)
            {
                PC.B6 = 0;        //BUZZER OFF
                alarm_Out = 0;
                alarm_Out_Count = 0;
            }
        }
    }
    if(DispModeKey)
    {
        DispModeKey = 0;
        SetModeNo = 0;
    }
    if(SetModeKey)
    {
        SetModeKey = 0;
        SetModeNo = SetModeNo + 1;
        if(SetModeNo > 2)
             SetModeNo = 1;
        if(SetModeNo == 1)
        {
            sec_Set = sec;
            min_Set = min;
            hour_Set = hour;
            day_Set = day;
            weekdays_Set = weekdays;
            month_Set = month;
            year_Set = year;
            cursorNo_Set = 0;
            LCDClear();
        }
        if(SetModeNo == 2)
        {
            alarm_hour_Set = alarm_hour;
            alarm_min_Set = alarm_min;
            cursorNo_Set = 0;
            LCDClear();        
        }            
    }
    if(SetModeNo == 0)
    {
        UpKey = 0;
        DownKey = 0;
        LeftKey = 0;
        RightKey = 0;
        SetKey = 0;    
    }        
    if(SetModeNo == 1)
    {
        if(UpKey)
        {
            UpKey = 0;
            switch(cursorNo_Set)
            {
                case 0:
                    if(year_Set >= 99)
                        year_Set = 0;
                    else
                        year_Set = year_Set + 1;
                    break;
                case 1:
                    if(month_Set >= 12)
                        month_Set = 1;
                    else
                        month_Set = month_Set + 1;
                    break;            
                case 2:
                    if(day_Set >= 31)
                        day_Set = 1;
                    else
                        day_Set = day_Set + 1;
                    break;
                case 3:
                    if(weekdays_Set >= 6)
                        weekdays_Set = 0;
                    else
                        weekdays_Set = weekdays_Set + 1;
                    break;
                case 4:
                    if(hour_Set >= 23)
                        hour_Set = 0;
                    else
                        hour_Set = hour_Set + 1;
                    break;
                case 5:
                    if(min_Set >= 59)
                        min_Set = 0;
                    else
                        min_Set = min_Set + 1;
                    break;
                case 6:
                    if(sec_Set >= 59)
                        sec_Set = 0;
                    else
                        sec_Set = sec_Set + 1;
                    break;
            }
        }
        if(DownKey)
        {
            DownKey = 0;
            switch(cursorNo_Set)
            {
                case 0:
                    if(year_Set == 0)
                        year_Set = 99;
                    else
                        year_Set = year_Set - 1;
                    break;
                case 1:
                    if((month_Set == 1) || (month_Set == 0))
                        month_Set = 12;
                    else
                        month_Set = month_Set - 1;
                    break;
                case 2:
                    if(day_Set == 1 || (day_Set == 0))
                        day_Set = 31;
                    else
                        day_Set = day_Set - 1;
                    break;
                case 3:
                    if(weekdays_Set == 0)
                        weekdays_Set = 6;
                    else
                        weekdays_Set = weekdays_Set - 1;
                    break;
                case 4:
                    if(hour_Set == 0)
                        hour_Set = 23;
                    else
                        hour_Set = hour_Set - 1;
                    break;
                case 5:
                    if(min_Set == 0)
                        min_Set = 59;
                    else
                        min_Set = min_Set - 1;
                    break;
                case 6:
                    if(sec_Set == 0)
                        sec_Set = 59;
                    else
                        sec_Set = sec_Set - 1;
                    break;
            }
        }
        if(LeftKey)
        {
            LeftKey = 0;
            if(cursorNo_Set == 0)
                cursorNo_Set = 6;
            else
                cursorNo_Set = cursorNo_Set - 1;
        }
        if(RightKey)
        {
            RightKey = 0;
            if(cursorNo_Set == 6)
                cursorNo_Set = 0;
            else
                cursorNo_Set = cursorNo_Set + 1;
        }
        if(SetKey)
        {
            SetKey = 0;
            write_Set = 1;
        }     
    }
    if(SetModeNo == 2)
    {
        if(UpKey)
        {
            UpKey = 0;
            switch(cursorNo_Set)
            {
                case 0:
                    if(alarm_hour_Set >= 23)
                        alarm_hour_Set = 0;
                    else
                        alarm_hour_Set = alarm_hour_Set + 1;
                    break;
                case 1:
                    if(alarm_min_Set >= 59)
                        alarm_min_Set = 0;
                    else
                        alarm_min_Set = alarm_min_Set + 1;
                    break;
            }
        }
        if(DownKey)
        {
            DownKey = 0;
            switch(cursorNo_Set)
            {
                case 0:
                    if(alarm_hour_Set == 0)
                        alarm_hour_Set = 23;
                    else
                        alarm_hour_Set = alarm_hour_Set - 1;
                    break;
                case 1:
                    if(alarm_min_Set == 0)
                        alarm_min_Set = 59;
                    else
                        alarm_min_Set = alarm_min_Set - 1;
                    break;
            }
        }
        if(LeftKey)
        {
            LeftKey = 0;
            if(cursorNo_Set == 0)
                cursorNo_Set = 1;
            else
                cursorNo_Set = cursorNo_Set - 1;
        }
        if(RightKey)
        {
            RightKey = 0;
            if(cursorNo_Set == 1)
                cursorNo_Set = 0;
            else
                cursorNo_Set = cursorNo_Set + 1;
        }
        if(SetKey)
        {
            EEWSet1 = 1;
            EEWSet2 = 0;
            SetKey = 0;
            write_Set = 1;
        }     
    }
    if(min != premin)
    {
        premin = min;
        if(!PC.B7)    //ALARM SW ON
            if(alarm_hour == hour)
                if(alarm_min == min)
                    alarm_Out = 1;
    }
    if(PC.B7)    //ALARM SW OFF
    {
        PC.B6 = 0;        //BUZZER OFF    
        alarm_Out = 0;
        alarm_Out_Count = 0;
    }

}

void DispCursor1(BYTE cursorNo_Set)
{
    BYTE    x, y;
    switch(cursorNo_Set)
    {
        case 0:
            x = 5;
            y = 0;
            break;
        case 1:
            x = 8;
            y = 0;
            break;
        case 2:
            x = 11;
            y = 0;
            break;    
        case 3:
            x = 15;
            y = 0;
            break;
        case 4:
            x = 5;
            y = 1;
            break;
        case 5:
            x = 8;
            y = 1;
            break;
        case 6:
            x = 11;
            y = 1;
            break;
    }
    LCDPrintAt(x, y);
    LCDOnOff(1, 0, 1);
}

void DispCursor2(BYTE cursorNo_Set)
{
    BYTE    x, y;
    switch(cursorNo_Set)
    {
        case 0:
            x = 7;
            y = 1;
            break;
        case 1:
            x = 10;
            y = 1;
            break;
    }
    LCDPrintAt(x, y);
    LCDOnOff(1, 0, 1);
}


//
// User occurrence code
//

//
// Occurrence - A key has been pressed (or is repeating)
//

void KeyPress()
{
    switch(KP4Value)
    {
        case 0:UpKey = 1;break;
        case 1:DownKey = 1;break;
        case 2:LeftKey = 1;break;
        case 3:RightKey = 1;break;
        case 4:DispModeKey = 1;break;
        case 5:SetModeKey = 1;break;
        case 6:SetKey = 1;break;
    }

}

//
// I2C-RTC DATA WRITE (7byte Write: sec, min, hour, day, week, month, year)
//
void I2C_RTC_Write(BYTE *data)
{
    BYTE i;
    I2CStart(I2C_START_NORM);
    I2CWrite(0xA2);                // control byte (write)
    I2CWrite(0x02);                // Address set (sec)
    for(i = 0; i < 7; i++)
    {
        I2CWrite(*data);
        data++;
    }
    I2CStop();
}

//
// I2C-RTC DATA READ (7byte Read: sec, min, hour, day, week, month, year)
//
void I2C_RTC_Read(BYTE *data)
{
    BYTE i;
    I2CStart(I2C_START_NORM);
    I2CWrite(0xA2);                // control byte (write)
    I2CWrite(0x02);                // Address set (sec)
    I2CStart(I2C_START_CONT);
    I2CWrite(0xA3);                // control byte (read)
    for(i = 0; i < 7; i++)
    {
        if(i != 6)
            *data = I2CRead(I2C_READ_ACK);
        else
            *data = I2CRead(I2C_READ_NOACK);
        data++;
    }
    I2CStop();
}





トップページヘもどる