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)
}




トップページヘもどる