3.4.19_プログラムリスト(ALARMCLOCK_PIC18F2580_User.c)
修正箇所(自動生成ファイルに記述追加)は、以下の青色の箇所です。
3.4.19_プログラムリストからの追加変更箇所は、以下の赤色の箇所です。 #include "C:\\WIZ_C\\Ver17\\Projects\\ALARMCLOCK_PIC18F2580\\ALARMCLOCK_PIC18F2580_Auto.h"
#include "C:\\WIZ_C\\Ver17\\Projects\\ALARMCLOCK_PIC18F2580\\i2c.h" #include <Strings.h> #__config _CONFIG1H, 0x08 #__config _CONFIG2H, 0x1E #__config _CONFIG2L, 0x18 #__config _CONFIG3H, 0x00 #__config _CONFIG4L, 0x80 #__config _CONFIG5H, 0xC0 #__config _CONFIG5L, 0x0F #__config _CONFIG6H, 0xE0 #__config _CONFIG6L, 0x0F #__config _CONFIG7H, 0x40 #__config _CONFIG7L, 0x0F WORD BV_PV; 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, FlagWork1, FlagWork2; 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() { OSCCON = (OSCCON & 0x7F) | 0xCF; //0xCF:1MHz(0x?F - F:8MHz, E:4MHz, D:2MHz, C:1MHz, B:500kHz, A:250kHz, 9:125kHz, 8:31kHz) ADCON0 = 0x01; //AD Converter Active ADCON1 = 0x1E; //Analog input:AN0, Vref+:AN3 ADCON2 = 0x80; 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.B1 = 0; //BUZZER OFF hour = 99; min = 99; INTCON |= 1<<PEIE; PIE1 |= 1<<CCP1IE; ADCON0 |= (1<<GO); } //******************************************************************************* // // 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); //A/D read BV_PV =(WORD)ADRESH << 8; BV_PV = BV_PV | ADRESL; ADCON0 |= (1<<GO); 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; } FlagWork1 = PORTC & 0x01; if(FlagWork1==0) //ALARM SW ON { sprintf(out_str1,"%02d/%02d/%02d %04s AL",year,month,day,weekdays_str2); LCDPrintAt(0,0); LCDString(out_str1); if(BV_PV > 620) //BV_PV(3V≒620) sprintf(out_str2,"%02d:%02d:%02d %02d:%02d",hour,min,sec,alarm_hour,alarm_min); else sprintf(out_str2,"%02d:%02d:%02d B %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); if(BV_PV > 620) //BV_PV(3V≒620) sprintf(out_str2,"%02d:%02d:%02d %5d",hour,min,sec,BV_PV); else sprintf(out_str2,"%02d:%02d:%02d B %5d",hour,min,sec,BV_PV); 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) { FlagWork2 = PORTC & 0x02; if(FlagWork2 == 2) PC.B1 = 0; else PC.B1 = 1; alarm_Out_Count = alarm_Out_Count + 1; if(alarm_Out_Count > 360) { PC.B1 = 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(FlagWork1 == 0) //ALARM SW ON if(alarm_hour == hour) if(alarm_min == min) alarm_Out = 1; } if(FlagWork1 == 1) //ALARM SW OFF { PC.B1 = 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 5:DispModeKey = 1;break; case 6:SetModeKey = 1;break; case 7: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(); } |