title

◎温度湿度計 r_main.c

はじめに r_main.c リストを示します。 E2studioのタブとブラウザのタブ位置が異なり見づらいですがご了承下さい。 /* Start user code ~から /* End user code の間だけに記述します。 右サイドにリストの注釈を入れるつもりでしたが、リストの表示を私自身の表示と同じように(崩れないように)するため <PRE>のタグを使いました。注釈は右サイドに入れにくくなりましたのでリスト下に入れました。
/***********************************************************************************************************************
	* DISCLAIMER
	* This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products.
	* No other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all
	* applicable laws, including copyright laws. 
	* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING THIS SOFTWARE, WHETHER EXPRESS, IMPLIED
	* OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
	* NON-INFRINGEMENT.  ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY
	* LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE FOR ANY DIRECT,
	* INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR
	* ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
	* Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability 
	* of this software. By using this software, you agree to the additional terms and conditions found by accessing the 
	* following link:
	* http://www.renesas.com/disclaimer
	*
	* Copyright (C) 2011, 2021 Renesas Electronics Corporation. All rights reserved.
	***********************************************************************************************************************/
	
	/***********************************************************************************************************************
	* File Name    : r_main.c
	* Version      : CodeGenerator for RL78/G13 V2.05.06.02 [08 Nov 2021]
	* Device(s)    : R5F100LG
	* Tool-Chain   : GCCRL78
	* Description  : This file implements main function.
	* Creation Date: 2023/01/13
	***********************************************************************************************************************/
	
	/***********************************************************************************************************************
	Includes
	***********************************************************************************************************************/
	#include "r_cg_macrodriver.h"
	#include "r_cg_cgc.h"
	#include "r_cg_port.h"
	#include "r_cg_serial.h"
	#include "r_cg_rtc.h"
	/* Start user code for include. Do not edit comment generated here */
	/* End user code. Do not edit comment generated here */
	#include "r_cg_userdefine.h"
	
	/***********************************************************************************************************************
	Global variables and functions
	***********************************************************************************************************************/
	/* Start user code for global. Do not edit comment generated here */
	
	void wait( unsigned int loop);
	void init_IIC_lcd(void);
	void itoa(unsigned char out_str[],uint32_t in_i);
	
	void clear_screen(void);
	void initial_screen(void);
	void disp_data(void);
	void disp_time(void);
	void convert_bcd_to_str(void);
	void date_set(void);
	void time_data_set(void);
	uint8_t iic_Disp_Buf[50];
	uint8_t iic_Tx_Buf[10];
	uint8_t iic_Rx_Buf[10];
	uint32_t Temp;
	uint32_t Humi;
	uint8_t Humi_str[7];
	uint8_t Temp_str[7];
	
	uint8_t year_hi;
	uint8_t year_lo;
	uint8_t month_hi;
	uint8_t month_lo;
	uint8_t day_hi;
	uint8_t day_lo;
	uint8_t hour_hi;
	uint8_t hour_lo;
	uint8_t min_hi;
	uint8_t min_lo;
	uint8_t time_set_mode = 0;
	rtc_counter_value_t	temp_time;
	uint8_t one_min_flug;
	uint8_t five_sec_flug;
	uint8_t cnt_60 = 0;

	/* End user code. Do not edit comment generated here */
	void R_MAIN_UserInit(void);
	
	/***********************************************************************************************************************
	* Function Name: main
	* Description  : This function implements main function.
	* Arguments    : None
	* Return Value : None
	***********************************************************************************************************************/
	void main(void)
	{
		R_MAIN_UserInit();
		/* Start user code. Do not edit comment generated here */
		wait(60000);
		wait(60000);
		wait(60000);
		wait(60000);
		wait(60000);
		wait(60000);
		init_IIC_lcd();
		clear_screen();
		initial_screen();
		rtc_counter_value_t time_set;
			time_set.sec = 0x00;
			time_set.min = 0x00;
			time_set.hour = 0x00;
			time_set.day = 0x1;
			time_set.week = 0x01;
			time_set.month = 0x01;
			time_set.year = 0x23;
	
		R_RTC_Set_CounterValue(time_set);
		   disp_time();
		   wait(10000);
		while (1U)
		{
	//		static uint16_t count=0;
	//		wait(1000);
			time_set_mode = 0;			//0:通常時 1:設定モード移行時
			time_data_set();			//時刻データ取得
			if(one_min_flug == 1){
			   disp_time();				//時刻表示更新
			   one_min_flug = 0;
			}
	
			if(	five_sec_flug == 1){
				five_sec_flug = 0;
	
				wait(60000);	//60000+30000で実測 90mSec > 80mSec(必要待機時間)
				wait(30000);
	//		    EI();
				iic_Tx_Buf[0] = 0xac;
				iic_Tx_Buf[1] = 0x33;
				iic_Tx_Buf[2] = 0x00;
				R_IICA0_Master_Send(0x70,iic_Tx_Buf, 3,1);
	
	//		    P7_bit.no2 =1;	//オシロスコープでのwait時間計測用
				wait(60000);	//60000+30000で実測 90mSec > 80mSec(必要待機時間)
	//		    wait(60000);
	//		    P7_bit.no2 =0;
	
				R_IICA0_Master_Receive(0x70,iic_Rx_Buf, 7,16);
				wait(60000);	//60000+30000で実測 90mSec > 80mSec(必要待機時間)
				wait(60000);
	
	//		    P7_bit.no2 =1;
	//		    wait(1);
	//		    P7_bit.no2 =0;
	
				Humi = iic_Rx_Buf[1];
				Humi <<= 8;
				Humi |= iic_Rx_Buf[2];
				Humi <<= 4;
				Humi |= ((iic_Rx_Buf[3]>>4)& 0x0f);
				Humi = (uint32_t)((double)Humi / 10485.76);
				   itoa(Humi_str,Humi);
	
				   Temp = iic_Rx_Buf[3]&0x0f;
				Temp <<= 8;
				Temp |= iic_Rx_Buf[4];
				Temp <<= 8;
				Temp |= iic_Rx_Buf[5];
				Temp = (uint32_t)((double)Temp/5242.88 - 50);
				itoa(Temp_str,Temp);
	
				   disp_data();
	
	
			}
		}
		/* End user code. Do not edit comment generated here */
	}
	
	
	/***********************************************************************************************************************
	* Function Name: R_MAIN_UserInit
	* Description  : This function adds user code before implementing main function.
	* Arguments    : None
	* Return Value : None
	***********************************************************************************************************************/
	void R_MAIN_UserInit(void)
	{
		/* Start user code. Do not edit comment generated here */
		R_RTC_Set_ConstPeriodInterruptOn(ONESEC); 
		R_RTC_Start();
		EI();
		/* End user code. Do not edit comment generated here */
	}
	
	/* Start user code for adding. Do not edit comment generated here */
	
	//********************
	/*	タイミングループ */
	//********************
	void wait( unsigned int loop) {			//10000=10mS
		volatile unsigned int	i;
		volatile unsigned int	dummy;
		volatile unsigned int	dummy2;
		for (i=0;i < loop;i++) {
		dummy++;
		dummy2++;
		}
	}
	
		/***********************************************************/
		/*	液晶の初期化*/
		/***********************************************************/
	
	void init_IIC_lcd(void){
	
				iic_Disp_Buf[0] = 0x00;
				iic_Disp_Buf[1] = 0x38;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(400);
	
				iic_Disp_Buf[0] = 0x00;
				iic_Disp_Buf[1] = 0x39;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(400);
	
				iic_Disp_Buf[1] = 0x14;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(400);
				iic_Disp_Buf[1] = 0x74;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(400);
				iic_Disp_Buf[1] = 0x56;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(400);
				iic_Disp_Buf[1] = 0x6C;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(60000);		//トータル200mSec以上待機
				wait(60000);
				wait(60000);
				wait(60000);
				wait(60000);
				iic_Disp_Buf[1] = 0x38;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(400);
				iic_Disp_Buf[1] = 0x01;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(6000);
				iic_Disp_Buf[1] = 0x0d;
				R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
				wait(6000);
	
			}
	
		//************************************************************************
		//数値ー>文字変換 char out_str[10];を用意しておく
		//************************************************************************
	void itoa(unsigned char out_str[],uint32_t in_i)
		{
		uint16_t n0,n1,n2,n3;
		int lp,chk;
	
		// 1.Convert Integer to Strings
			n0 = (uint16_t)(in_i / 1000);
			n1 = (uint16_t)((in_i % 1000) / 100);
			n2 = (uint16_t)((in_i % 100)  /  10 );
			n3 = (uint16_t)((in_i %  10)  /   1);
	
			out_str[0] = (unsigned char)n0 | 0x30;
			out_str[1] = (unsigned char)n1 | 0x30;
			out_str[2] = (unsigned char)n2 | 0x30;
			out_str[3] = (unsigned char)n3 | 0x30;
			out_str[4] = 0x00;
			out_str[5] = 0x00;
		//  return;
	
		// 2.Zero sus
			chk=3;
			for(lp=0;lp<4;lp++){
				if(out_str[lp]!='0'){
					chk=lp;
					break;
				}
			}
	//   	    out_str[0]='0';
			if(chk>3)chk=3;
			for(lp=0;lp> 4) & 0x0f)+0x30);
		year_lo =  	(uint8_t)(((temp_time.year) & 0x0f)+0x30);
		month_hi = 	(uint8_t)(((temp_time.month >> 4) & 0x0f)+0x30);
		month_lo = 	(uint8_t)(((temp_time.month) & 0x0f)+0x30);
		day_hi = 	(uint8_t)(((temp_time.day   >> 4) & 0x0f)+0x30);
		day_lo = 	(uint8_t)(((temp_time.day)  & 0x0f)+0x30);
		hour_hi = 	(uint8_t)(((temp_time.hour  >> 4) & 0x0f)+0x30);
		hour_lo = 	(uint8_t)(((temp_time.hour) & 0x0f)+0x30);
		min_hi= 	(uint8_t)(((temp_time.min   >> 4) & 0x0f)+0x30);
		min_lo = 	(uint8_t)(((temp_time.min)  & 0x0f)+0x30);
	}
	//***************************************************************
	// 日付・時刻設定
	//***************************************************************
	void time_data_set(void){
		if(P14_bit.no0 == 0 && P14_bit.no1 == 0 && time_set_mode == 0){	//通常動作モードの時に2つのスイッチが両方とも同時に押されて設定モードに入る
			wait(500);
	
			while(P14_bit.no0 == 0 || P14_bit.no1 == 0)       //2つのスイッチが両方とも離れて設定モード
				;
			time_set_mode = 1;
			uint8_t selector = 0;
			convert_bcd_to_str();
	
			while(time_set_mode == 1){
	
				if(P14_bit.no0 == 1 && P14_bit.no1 == 0){     //b1ボタン:モード切替セレクターの切り替え
					wait(50000);
					while(P14_bit.no0 == 1 && P14_bit.no1 == 0)
						;
					selector++;
					if(selector >10){
						selector = 0;
					}
				}
	
	
				if(selector == 0){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xc2;				//2行目3文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
							   ;
	
						year_hi ++;
						if(year_hi >= 9+0x30)
							year_hi = 2+0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(year_hi);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 1){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xc3;				//2行目4文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
												   ;
						year_lo ++;
						if(year_lo > 9 + 0x30)
							year_lo = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(year_lo);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 2){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xc5;				//2行目6文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
												   ;
						month_hi ++;
						if(month_hi > 1 + 0x30)
							month_hi = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(month_hi);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 3){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xc6;				//2行目7文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
											   ;
						month_lo ++;
						if(month_lo > 2 + 0x30)
							month_lo = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(month_lo);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 4){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xc8;				//2行目9文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
											   ;
						day_hi ++;
						if(day_hi > 3 + 0x30)
							day_hi = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(day_hi);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 5){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xc9;				//2行目10文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
											   ;
						day_lo ++;
						if(day_lo > 9 + 0x30)
							day_lo = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(day_lo);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 6){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xcb;				//2行目12文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
											   ;
						hour_hi ++;
						if(hour_hi > 2 + 0x30)
							hour_hi = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(hour_hi);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 7){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xcc;				//2行目13文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
											   ;
						hour_lo ++;
						if(hour_lo > 9 + 0x30)
							hour_lo = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(hour_lo);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 8){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xce;				//2行目15文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
											   ;
						min_hi ++;
						if(min_hi > 6 + 0x30)
							min_hi = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(min_hi);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
				else if(selector == 9){
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xcf;				//2行目16文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					if(P14_bit.no0 == 0 && P14_bit.no1 == 1){     //b0ボタン:選択値の変更
						wait(50000);
						while(P14_bit.no0 == 0 && P14_bit.no1 == 1)
							;
						min_lo ++;
						if(min_lo > 9 + 0x30)
							min_lo = 0 + 0x30;
						iic_Disp_Buf[0] = 0x40;
						iic_Disp_Buf[1] = (uint8_t)(min_lo);				//
						R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
						wait(1000);
					}
				}
	
	
				if(P14_bit.no0 == 0 && P14_bit.no1 == 0 && time_set_mode == 1){         //sw0
					wait(50000);
					while(P14_bit.no0 == 0 || P14_bit.no1 == 0)       //2つのスイッチが両方とも離れて設定モード
						;
					time_set_mode = 0;
					iic_Disp_Buf[0] = 0x00;
					iic_Disp_Buf[1] = 0xc0
							;				//2行目1文字目に移動
					R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);
					wait(1000);
	
					rtc_counter_value_t time_set;
	
					time_set.sec = 0x00;
					time_set.min = (uint8_t)(((min_hi << 4) & 0xf0) | (min_lo & 0x0f));
					time_set.hour = (uint8_t)(((hour_hi << 4) & 0xf0) | (hour_lo & 0x0f));
					time_set.day = (uint8_t)(((day_hi << 4)& 0xf0) | (day_lo & 0x0f));
					time_set.week = temp_time.week;
					time_set.month = (uint8_t)(((month_hi << 4) & 0xf0) | (month_lo & 0x0f));
					time_set.year = (uint8_t)(((year_hi << 4) & 0xf0) | (year_lo & 0x0f));
	
					R_RTC_Set_CounterValue(time_set);
					cnt_60 = 0;
					return;
				}
	
			}
		}
	}
		/* End user code. Do not edit comment generated here */
	
以上がr_main.cです。前述しましたように”/* Start user code ~から /* End user codec> の間だけ”に記述します。

Global variables and functions 広域変数や関数のプロトタイプ

void main(void) メイン関数(自動生成された関数の戻り値はvoidになっていますがコンパイル時には「intではないのか?」という警告が出ます。無視していますが)

void R_MAIN_UserInit(void)自動生成された関数内にはEI()だけが入っています。リアルタイムクロックを起動させるため R_RTC_Set_ConstPeriodInterruptOn(ONESEC); (コンパイル時に// @suppress("シンボルが解決されません")というエラーが出ることがありますが自動生成された r_cg_rtc.h内に定義されています。また、エラーが出るのにかかわらずコンパイル出来ます。理由は分かりませんが無視します。もう一度コンパイルするとエラーが消えたりします。) と R_RTC_Start();を追加します。

void wait( unsigned int loop) ごく一般的なタイミングループです。wait(1)では測定していませんが16MHz動作:wait(100)ではほぼ100μ秒です。

void init_IIC_lcd(void)LCD表示器AQM1602のイニシャライズです。今まで何度か使っており操作方法はなれていたつもりですが今回はトラブルに嵌まりました。 DHT20の操作法を理解していませんのでデーターシートを読みながら「データーの読み込みが上手く出来ない。表示が変化しない」と思いDHT20ばかりに気を配って いましたが、AQM1602のIICバスがハングアップしていたようです。時刻など期待した文字が表示されカーソルも点滅しているので表示機にはなんの問題もないと思っていました が実はAQMに送る温度湿度のデータをDHT20から読み込むタイミングとそれを変換し表示させるタイミングに時間的な余裕が十分でなかったためのようでした。waitが十分すぎる 位入っているのはそのためです。

void itoa(unsigned char out_str[],uint32_t in_i)Integer to Ascii 数値->文字変換です。10年ほど前に先人たちのwebsiteから頂いたものです。どこからかは覚えていませんが。

void clear_screen(void)LCD:AQM1602の表示をクリアします。電源オンでクリアされますので必要ないですが・・・。

void initial_screen(void)温度タイトルの「T:」と湿度の「H:」を表示させます。数値が入る部分はスペースを入れておきます。T:とH:を表示させるのはここだけです。

void disp_data(void)iic_Disp_Bufに取り込まれたデータを表示させます。

void disp_time(void)iic_Disp_Buf(温度湿度と兼用)に取り込まれた時計データーを表示させます。

void convert_bcd_to_str(void)リアルタイムクロックから読み込んだデータを文字変換します。データは年(下2桁)、月、時等毎にBCDデーターなっています (バイナリーデータにすることも出来ますがここまでの自動生成の過程で24時間BCDを選択しました)のでバイトデータの上下4bitづゝを文字変換します。0x30を加えると ASCIIコードになります。

void time_data_set(void)時刻設定関数です。P14-0とP14-1に接続されたプッシュボタンを同時に押し離すと時刻設定モードに入ります。それまでは表示されていない カーソルが年10位で点滅します。P14-1のボタンで項目変更、P14-0のボタンで値の変更ができます。同時押しで通常モードに移行します。(このとき全くの同時押しは難しいので P14-1ボタンの方を先に押してください。P14-0ボタンを先に押すと1分進んでしまいます。離すタイミングはどちらが先でも良いです)

R_IICA0_Master_Send(0x7c,iic_Disp_Buf, 2,16);自動生成された関数です。IICデバイスへの送信です。引数が4項目あります。1番目は0x7c:この場合は AQM1602のスレーブアドレスは7bit:0x3e(x0111110)を1bit左シフトして0x7c(0111110x->書き込みには01111100、読み出しには0x7d:01111101)にします。 iic_Disp_Bufは自前のジククや温度等の表示データバッファです。2は今から送るつもりのデータバイト数(スレーブアドレスは除きます)、16はスタートコンディ ション発行のディレイですが関数内でタイミングループを取っています。オシロで見てもあまり変化していません。

R_IICA0_Master_Receive(0x70,iic_Rx_Buf, 7,16);上記同様自動生成された関数です。IICデバイスからの受信です。引数は上記同様です。ただし、 スレーブアドレス指定に関して、読み出しは0x71となるはずですが関数内で第0bitを自動的に1にしてくれます(0x70でも0x71でも同じ結果になります。)

次は r_cg_serial_user.c