3.4.20_プログラムリスト(thermohygrologger_ccsc.c)
#include <thermohygrologger_ccsc.h>
#include <stdlib.h> //SHT11 or SHT75 #include<sht75.c> //LCD #define lcd_enable_pin PIN_B2 #define lcd_rs_pin PIN_B0 #define lcd_rw_pin PIN_B1 #define lcd_data4 PIN_B4 #define lcd_data5 PIN_B5 #define lcd_data6 PIN_B6 #define lcd_data7 PIN_B7 #include <lcd.c> //キーマトリクス #define selrow1 output_bit(PIN_D0,0) #define selrow2 output_bit(PIN_D1,0) int keycode[2][4] = { {0, 1, 2, 3}, {4, 5, 6, 7} }; int1 flag20msec, flag100msec, flag500msec, flag1sec, flag5sec; int1 leftkey, rightkey, upkey, downkey, modekey, setkey, hosyu1key, hosyu2key, keywait, setmode; int1 ee_initerror, ee_samp, cmd_sampread, write_set, ee_logwrite, ee_ctrlwrite, cmd_erase; char out_str1[17], out_str2[17], receive_buf[8], comp_buf[8], transmit_buf[8], ee_erase[128]; char data_buf[8], ctrl_buf[8], clock_buf[7]; int8 sec, min, hour, day, month, year, premin, time_Work1, temp_ndp, temp_dp, hr_ndp, hr_dp; int8 sec_set, min_set, hour_set, day_set, month_set, year_set, cursorno_set, prekey, dt1, dt2; int16 timercount1,timercount2,timercount3,timercount4, timercount5, keywaitcount, strcount; int16 ee_work1, ee_work2, ee_logno, ee_ctrllogno, ee_adrslogwrite; int16 ee_sampdifflogno, ee_sampreadlogno, ee_adrslogread; float temp_f,humid_f; void dispcursor(int8 cursorno_set); void keymtxscan(void); void cmdproc(); void cmderase(); void lcd_puts(char *s); void txstr(char *transmit_buf); void i2c_rtc_write(char *data); void i2c_rtc_read(char *data); void i2c_rom_write(int16 adrs, char *data, int16 size); void i2c_rom_read(int16 adrs, char *data, int16 size); void i2c_rom_adrsset(int16 adrs); #int_rtcc void rtcc_isr(void) { timercount1++; timercount2++; timercount3++; timercount4++; if(timercount1 == 196) { timercount1 = 0; flag20msec = true; //nearly 20msec } if(timercount2 == 977) { timercount2 = 0; flag100msec = true; //neary 100msec } if(timercount3 == 4883) { timercount3 = 0; flag500msec = true; //neary 500msec } if(timercount4 == 9766) { timercount4 = 0; flag1sec = true; //neary 1sec timercount5++; } if(timercount5 == 5) { timercount5 = 0; flag5sec = true; //neary 5sec timercount5++; } if(keywait) { keywaitcount++; if(keywaitcount == 9766) //neary 1sec { keywaitcount = 0; keywait = false; } } } #int_rda void rda_isr() { char ch; ch = getc(); if((ch == '\r') || (ch == '\n')) //'\r'(0x0D) { receive_buf[strcount] = 0; //NULL strcount = 0; cmdproc(); } else { receive_buf[strcount] = ch; strcount = strcount + 1; if(strcount > 7) strcount = 7; } } void main() { setup_timer_0(rtcc_internal|rtcc_div_2|rtcc_8_bit); //102.4 us overflow enable_interrupts(int_rtcc); enable_interrupts(int_rda); enable_interrupts(global); i2c_rom_read(0x0000, data_buf, 4); dt1 = data_buf[0]; dt2 = data_buf[1]; ee_work1 = (int16)dt2<<8; ee_work2 = ee_work1 | dt1; if(ee_work2 > 8191) { ee_initerror = true; ee_logno = 0; } else ee_logno = ee_work2; if(ee_initerror) { ee_initerror = false; ctrl_buf[0] = 0; ctrl_buf[1] = 0; ctrl_buf[2] = 0; ctrl_buf[3] = 0; ctrl_buf[4] = 0; ctrl_buf[5] = 0; ctrl_buf[6] = 0; ctrl_buf[7] = 0; i2c_rom_write(0x0000, ctrl_buf, 8); } ee_ctrllogno = ee_logno; setmode = false; cmd_sampread = false; flag100msec = true; flag5sec = true; lcd_init(); while(true) { if(flag20msec) { flag20msec = false; //LogData Read if((ee_ctrlwrite == 0) && (ee_logwrite == 0) && (ee_samp == 0)) { if(cmd_sampread) { if(ee_sampdifflogno != 0) { if(ee_sampdifflogno <1) ee_sampdifflogno = 8191; if(ee_sampdifflogno > 8191) ee_sampdifflogno = 1; ee_adrslogread = ee_sampreadlogno * 8; i2c_rom_read(ee_adrslogread, transmit_buf, 8); TxStr(transmit_buf); ee_sampreadlogno = ee_sampreadlogno + 1; ee_sampdifflogno = ee_sampdifflogno - 1; } else cmd_sampread = false; } } else { //Sampling Data Edit //sampling cycle(10min) if(ee_samp) { ee_samp = false; ee_logno = ee_logno + 1; if(ee_logno > 8191) ee_logno = 1; ee_adrslogwrite = ee_logno * 8; data_buf[0] = year; data_buf[1] = month; data_buf[2] = day; data_buf[3] = hour; data_buf[4] = min; data_buf[5] = temp_ndp; data_buf[6] = hr_ndp; data_buf[7] = ((temp_dp << 4) & 0xF0) + (hr_dp & 0x0F); ee_logwrite = true; } //EEPROM LogWrite if(ee_ctrlwrite) { ee_ctrllogno = ee_logno; ctrl_buf[0] = ee_logno & 0x00FF; ctrl_buf[1] = ee_logno >> 8; ctrl_buf[2] = 0; ctrl_buf[3] = 0; ctrl_buf[4] = 0; ctrl_buf[5] = 0; ctrl_buf[6] = 0; ctrl_buf[7] = 0; i2c_rom_write(0x0000, ctrl_buf, 8); ee_ctrlwrite = false; } if(ee_logwrite) { i2c_rom_write(ee_adrslogwrite, data_buf, 8); ee_logwrite = false; ee_ctrlwrite = true; } } } if(flag100msec) { flag100msec = false; if(!keywait) keymtxscan(); if(write_set) { write_set = false; //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); 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; setmode = false; write_set = false; } 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[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(flag500msec) { flag500msec = false; if(setmode) { //LCD display sprintf(out_str1,"Clock %02d/%02d/%02d ",year_set, month_set, day_set); sprintf(out_str2,"Set %02d:%02d:%02d ",hour_set, min_set, sec_set); lcd_gotoxy(1,1); lcd_puts(out_str1); lcd_gotoxy(1,2); lcd_puts(out_str2); dispcursor(cursorno_set); } else { sprintf(out_str1,"%02d/%02d/%02d %5.1f%cC",year,month,day,temp_f,0xdf); sprintf(out_str2,"%02d:%02d:%02d %5.1f%% ",hour,min,sec,humid_f); lcd_gotoxy(1,1); lcd_puts(out_str1); lcd_gotoxy(1,2); lcd_puts(out_str2); } } if(flag1sec) { flag1sec = false; if(cmd_erase) { cmd_erase = false; cmderase(); } } if(flag5sec) { flag5sec = false; //10min SAMPLING if(min != premin) { premin = min; if( (min == 0) || (min == 10) || (min == 20) || (min == 30) || (min == 40) || (min == 50) ) ee_samp = true; } sht_rd (temp_f, humid_f); temp_ndp = abs(temp_f); temp_dp = abs(temp_f) * 10 - temp_ndp * 10; if(temp_f >= 0) temp_ndp = temp_ndp; else temp_ndp = temp_ndp | 0x80; hr_ndp = humid_f; hr_dp = humid_f * 10 - hr_ndp * 10; } if(modekey) { modekey = false; if(setmode) setmode = false; else setmode = true; if(setmode) { sec_set = sec; min_set = min; hour_set = hour; day_set = day; month_set = month; year_set = year; cursorno_set = 0; } } if(hosyu1key) hosyu1key = false; if(hosyu2key) hosyu2key = false; if(setmode) { if(leftkey) { leftkey = false; if(cursorno_set == 0) cursorno_set = 5; else cursorno_set = cursorno_set - 1; } if(rightkey) { rightkey = false; if(cursorno_set == 5) cursorno_set = 0; else cursorno_set = cursorno_set + 1; } if(upkey) { upkey = false; 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(hour_set >= 23) hour_set = 0; else hour_set = hour_set + 1; break; case 4: if(min_set >= 59) min_set = 0; else min_set = min_set + 1; break; case 5: if(sec_set >= 59) sec_set = 0; else sec_set = sec_set + 1; break; } } if(downkey) { downkey = false; 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(hour_set == 0) hour_set = 23; else hour_set = hour_set - 1; break; case 4: if(min_set == 0) min_set = 59; else min_set = min_set - 1; break; case 5: if(sec_set == 0) sec_set = 59; else sec_set = sec_set - 1; break; } } if(setkey) { setkey = false; write_set = 1; } } } } void dispcursor(int8 cursorno_set) { int8 x, y; switch(cursorno_set) { case 0: x = 9; y = 1; break; case 1: x = 12; y = 1; break; case 2: x = 15; y = 1; break; case 3: x = 9; y = 2; break; case 4: x = 12; y = 2; break; case 5: x = 15; y = 2; break; } lcd_gotoxy(x, y); lcd_cursor_on(true); } void keymtxscan(void) { int8 col, row, coldat, key = 0xff; for(row = 0; row < 2; row++) { switch(row) { case 0: selrow1; break; case 1: selrow2; break; } delay_us(5); coldat = input_d() >> 2; // d2-d5 for(col = 0; col < 4; col++) { if(!(coldat & 1)) { // found key = keycode[row][col]; goto next; } coldat >>= 1; } } next: if(key != prekey) { prekey = key; if(key != 0xff) keywait = true; } if(key == 0xff) { keywait = false; keywaitcount = 0; } switch(key) { case 0:upkey = 1;break; case 1:downkey = 1;break; case 2:leftkey = 1;break; case 3:rightkey = 1;break; case 4:modekey = 1;break; case 5:setkey = 1;break; case 6:hosyu1key = 1;break; case 7:hosyu2key = 1;break; } } void cmdproc() { cmd_sampread = false; ee_sampdifflogno = 0; comp_buf = "SAR1"; if(strcmp(receive_buf,comp_buf) == 0) { cmd_sampread = true; ee_sampdifflogno = 144; ee_sampreadlogno = ee_logno - ee_sampdifflogno + 1; if(ee_sampreadlogno < 1) ee_sampreadlogno = ee_sampreadlogno + 8191; } comp_buf = "SAR2"; if(strcmp(receive_buf,comp_buf) == 0) { cmd_sampread = true; ee_sampdifflogno = 1008; ee_sampreadlogno = ee_logno - ee_sampdifflogno + 1; if(ee_sampreadlogno < 1) ee_sampreadlogno = ee_sampreadlogno + 8191; } comp_buf = "SAR3"; if(strcmp(receive_buf,comp_buf) == 0) { cmd_sampread = true; ee_sampdifflogno = 8191; ee_sampreadlogno = ee_logno - ee_sampdifflogno + 1; if(ee_sampreadlogno < 1) ee_sampreadlogno = ee_sampreadlogno + 8191; } comp_buf = "ERASE"; if(strcmp(receive_buf,comp_buf) == 0) cmd_erase = true; strcpy(receive_buf,""); strcount = 0; } void cmderase() { //LCD display sprintf(out_str1," EEPROM ERASE!! "); sprintf(out_str2," "); lcd_gotoxy(1,1); lcd_puts(out_str1); lcd_gotoxy(1,2); lcd_puts(out_str2); //EE-PROM ERASE int8 i; int16 j, k; for(i = 0; i < 128; i++) ee_erase[i] = 0; for(j = 0; j < 512; j++) { k = 128 * j; i2c_rom_write(k, ee_erase, 128); delay_ms(10); } ee_logno = 0; ee_ctrllogno = 0; ee_logwrite = false; ee_ctrlwrite = false; ee_samp = false; } // // LCD function // void lcd_puts(char *s) { while(*s){ lcd_putc(*s++); } } // // RS232C transmit // void txstr(char *transmit_buf) { char i,c; for(i = 0; i < 8; i++) //8byte transmit { c = *transmit_buf++; putc(c); } } // // I2C-RTC DATA WRITE (7byte Write: sec, min, hour, day, week, month, year) // void i2c_rtc_write(char *data) { char i; i2c_start(); i2c_write(0xA2); // control byte (write) i2c_write(0x02); // Address set (sec) for(i = 0; i < 7; i++) { i2c_write(*data); data++; } i2c_stop(); } // // I2C-RTC DATA READ (7byte Read: sec, min, hour, day, week, month, year) // void i2c_rtc_read(char *data) { char i; i2c_start(); i2c_write(0xA2); // control byte (write) i2c_write(0x02); // Address set (sec) i2c_start(1); i2c_write(0xA3); // control byte (read) for(i = 0; i < 7; i++) { if(i != 6) *data = i2c_read(1); else *data = i2c_read(0); data++; } i2c_stop(); } // // I2C-EEPROM DATA WRITE // void i2c_rom_write(int16 adrs, char *data, int16 size) { int16 i; i2c_rom_adrsset(adrs); for(i = 0; i < size; i++) { i2c_write(*data); data++; } i2c_stop(); } // // I2C-EEPROM DATA READ // void i2c_rom_read(int16 adrs, char *data, int16 size) { int16 i; i2c_rom_adrsset(adrs); i2c_start(1); i2c_write(0xA1); // control byte (read) for(i = 0; i < size; i++) { if(i != (size - 1)) *data = i2c_read(1); else *data = i2c_read(0); data++; } i2c_stop(); } // // I2C-EEPROM DATA READ/WRITE ADDRES SET // void i2c_rom_adrsset(int16 adrs) { i2c_start(); i2c_write(0xA0); // control byte (write) i2c_write(adrs>>8); // EEPROM Address(H) i2c_write(adrs); // EEPROM Address(L) } トップページヘもどる |