Ÿç„¡ç·šé€šä¿¡
本文ã¸ã‚­ãƒƒãƒ—

アトメル社ã®AVRマイコンをã¤ã‹ã£ãŸé›»å­å·¥ä½œãŠã‚ˆã³ç„¡ç·šã‚’使ã£ãŸé›»å­å·¥ä½œã‚’紹介ã—ã¾ã™ã€‚





ホーム > 工作室トップ > é éš”表示付温度計

é éš”表示付温度計

無線を使用ã—ã¦é éš”ã§æ¸©åº¦ã‚»ãƒ³ã‚µã®å€¤ã‚’表示ã™ã‚‹é›»å­å·¥ä½œã‚’ãŠã“ãªã„ã¾ã™ã€‚
例ãˆã°å¤–ã®æ°—温表示をã™ã‚‹ã¨ã—ãŸå ´åˆã€è¡¨ç¤ºå™¨ã¯éƒ¨å±‹ã®ä¸­ã€æ¸©åº¦ã‚»ãƒ³ã‚µã¯å¤–ã«ç½®ãå ´åˆã€æ¸©åº¦ã‚»ãƒ³ã‚µã¨è¡¨ç¤ºå™¨ã¯ãƒªãƒ¼ãƒ‰ç·šã§æŽ¥ç¶šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
温度センサを設置後自由ã«ä½ç½®ã‚’ã‹ãˆã‚‹ã“ã¨ã¯ãƒªãƒ¼ãƒ‰ç·šã®åˆ¶ç´„ã«ã‚ˆã‚Šé›£ã—ã‹ã£ãŸã§ã™ã€‚無線を使用ã™ã‚‹ã¨é€šä¿¡è·é›¢å†…ã§ã‚ã‚Œã°æ¸©åº¦ã‚»ãƒ³ã‚µã‚’自由ã«è¨­ç½®ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
従æ¥ã¯å·¥ä½œã§ç„¡ç·šã‚’使用ã™ã‚‹å ´åˆã¯ã‹ãªã‚Šæ•·å±…ãŒé«˜ã‹ã£ãŸã‚ˆã†ã«æ€ã„ã¾ã™ã€‚最近ã¯å®‰ä¾¡ã§ç„¡ç·šãŒã§ãる無線モジュールXBee(スイッãƒã‚µã‚¤ã‚¨ãƒ³ã‚¹ã•ã‚“)ãŒç™ºå£²ã•ã‚Œã„ã‚‹ã“ã¨ã€ï¼£ï¼±å‡ºç‰ˆã•ã‚“より「超ãŠæ‰‹è»½ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ï¼¸ï¼¢ï½…ï½…ã€ãªã‚‹æœ¬ã‚‚発光ã•ã‚Œã¦ã„ã¾ã™ã€‚
ã“れらã«ã‚ˆã‚Šå€‹äººã§ç„¡ç·šã‚’使用ã—ãŸå·¥ä½œãŒæ‰‹è»½ã«ã§ãるよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ã¾ãŸã€é›»æ³¢æ³•ã®èªè¨¼ã‚‚å—ã‘られã¦ã„ã¾ã™ã®ã§å®‰å¿ƒã—ã¦ä½¿ç”¨ã§ãã¾ã™ã€‚
CQ出版ã•ã‚“よりXBeeã®ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒï¼’個ã¨æ›¸è¾¼åŸºæ¿ãŒä»˜ã„ãŸã‚­ãƒƒãƒˆä»˜ã解説書「超ãŠæ‰‹è»½ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«XBeeã€ãŒè²©å£²ã•ã‚Œã¦ã„ã¾ã™ã€‚(本ã®ã¿ã‚‚販売ã•ã‚Œã¦ã„ã¾ã™ã€‚)少ã—高ã„ã§ã™ãŒæ‰‹è»½ã«å§‹ã‚られã¾ã™ã€‚
XBeeã«ä»˜ã„ã¦ã¯ä¸Šè¨˜ã®æœ¬ã‚’å‚ç…§ã—ã¦ãã ã•ã„。本工作ã«å¿…è¦ãªXBeeã®è¨­å®šç­‰ã«ã¤ã„ã¦ã¯ã“ã®æœ¬ã‚’å‚考ã«ã—ã¦ã„ã¾ã™ã€‚
ブレットボードã«å–り付ã‘ã‚‹å ´åˆã¯å¤‰æ›åŸºæ¿ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚XBee無線モジュールã¯ãƒ”ッãƒãŒ2mmé–“éš”ãªã®ã§2.54mmã«å¤‰æ›ã—ã¾ã™ã€‚変æ›åŸºæ¿ã¯ç§‹æœˆé›»å­ã•ã‚“ç­‰ã§è²©å£²ã•ã‚Œã¦ã„ã¾ã™ã€‚
ç§ã¯ç§‹æœˆé›»å­ã•ã‚“ã®å¤‰æ›åŸºæ¿ã‚’購入ã—ã¾ã—ãŸã€‚基æ¿ã«ã¯LEDã€ã‚³ãƒ³ãƒ‡ãƒ³ã‚µã€3.3VレギュレータãŒå®Ÿè£…ã•ã‚Œã¦ã„ã¦ã€ãƒ”ンヘッダ(2.54mm)ãŠã‚ˆã³ã‚½ã‚±ãƒƒãƒˆï¼ˆXBeeã¨æŽ¥ç¶šï¼‰ãŒå«ã¾ã‚Œã¦ã¾ã™

温度センサã¨è¡¨ç¤ºå™¨ã®ï¼’ã¤ã®é›»å­å·¥ä½œã‚’è¡Œã„ã¾ã™ã€‚
1ã¤ç›®ã¯æ¸©åº¦ã‚’計測ã™ã‚‹æ¸©åº¦ã‚»ãƒ³ã‚µéƒ¨
2ã¤ç›®ã¯æ¸©åº¦ã‚’表示ã™ã‚‹è¡¨ç¤ºå™¨ã§ã€è¡¨ç¤ºå™¨ã«ã‚‚温度センサをå–り付ã‘ã¾ã™ã€‚

1.仕様

表示器ã¯ä»¥å‰å·¥ä½œã‚’ã—ã¾ã—ãŸã€æ¸©åº¦è¨ˆã‚’利用ã—ã¾ã™ã€‚ãŸã ã—ã€ï¼¸ï¼¢ï½…ï½…ã¯ï¼“.3Vã§å‹•ä½œã•ã›ã‚‹å¿…è¦ãŒã‚ã‚‹ã®ã§å›žè·¯ã®é›»åœ§ã¯ï¼“.3Vã§å‹•ä½œã•ã›ã¾ã™ã€‚LCDã¯ï¼“.3V動作ã®ã‚‚ã®ãŒç§‹æœˆé›»å­ã•ã‚“ã§è³¼å…¥ã§ãã¾ã™ã®ã§ã“れを使用ã—ã¾ã™ã€‚XBeeã¯ï¼£ï¼±å‡ºç‰ˆè¶…ãŠæ‰‹è»½ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ï¼¸ï¼¢ï½…ï½…ã€ã«ä»˜ã„ã¦ãã¦ã„ã¾ã™ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’使用ã—ã¦ã„ã¾ã™ã€‚
XBeeã®è¨­å®šã¯æ›¸è¾¼åŸºæ¿ã‚’使用ã—ã¦ï¼¸ï¼ï¼£ï¼´ï¼µã§æ›¸è¾¼ã‚’ã—ã¾ã™ã€‚
1.表示器
 é …ç›® 内容 
機能 1行目:年月日を表示ã—ã¾ã™ã€‚
2行目:時分秒を è¡¨ç¤ºã—ã¾ã™ã€‚
3行目:温度1を表示ã—ã¾ã™ã€‚(表示器上ã®æ¸©åº¦ã‚’表示ã—ã¾ã™ã€‚以å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ã§ã™ã€‚)
4行目:温度2を表示ã—ã¾ã™ã€‚(温度センサã‹ã‚‰ã®æ¸©åº¦ã‚’表示ã—ã¾ã™ã€‚)
温度1ã¯ä»¥å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ï¼‘秒毎ã«æ›´æ–°ã—ã¾ã™ã€‚
温度2ã¯æ¸©åº¦ã‚»ãƒ³ã‚µã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒããŸã¨ãã«æ›´æ–°ã—ã¾ã™ã€‚
年月日時分秒ã®èª¿æ•´ãŒã§ãã¾ã™ã€‚(以å‰è£½ä½œã—ãŸæ¸©åº¦è¨ˆã¨åŒæ§˜ã§ã™ã€‚)
表示器ã¨æ¸©åº¦ã‚»ãƒ³ã‚µã¯ï¼¸ï¼¢ï½…ï½…ã§é€šä¿¡ã—ã¾ã™ã€‚(温度センサã‹ã‚‰è¡¨ç¤ºå™¨ã¸ä¸€æ–¹å‘ã®é€šä¿¡ã§ã™ã€‚)
表示器ã¯ã‚³ãƒ¼ãƒ‡ã‚£ãƒãƒ¼ã‚¿ãƒ¼ã«è¨­å®šã—ã¾ã™ã€‚
温度センサã¯ã‚¨ãƒ³ãƒ‰ãƒ‡ãƒã‚¤ã‚¹ã«è¨­å®šã—ã¾ã™ã€‚
é›»æº 3.3Vã§å‹•ä½œã•ã›ã¾ã™ã€‚今回ã¯DC3.3Vã®ACアダプタを使用ã—ã¾ã™ã€‚
LCD å½¢å:SC2004CS
表示:2ï¼æ–‡å­—X4行
データ:4ビットモードã§ä½¿ç”¨ã—ã¾ã™ã€‚
3.3V動作用
マイコン ATmega328
温度センサ 温度センサã¯LM61CIZを使用ã—ã¾ã™ã€‚
ADコンãƒãƒ¼ã‚¿ã®åŸºæº–é›»æºã¯ã‚·ãƒ£ãƒ³ãƒˆãƒ¬ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿TL451を使用ã—ã¾ã™ã€‚
LCD制御 CHANã•ã‚“ã®EZ-LCDを使用ã—ã¾ã™ã€‚
XBee XB24-Z7CIT-004

2.温度センサ
項目 内容
機能 10秒毎ã«æ¸©åº¦è¨ˆæ¸¬ãƒ‡ãƒ¼ã‚¿ã‚’ç„¡ç·šã§é€ä¿¡ã—ã¾ã™ã€‚
é€ä¿¡ã®ã¿ã¨ã—ã¾ã™ã€‚
é›»æº é›»æ± 2本(3V)ã§å‹•ä½œã•ã›ã¾ã™ã€‚
温度センサ 温度センサã¯LM61CIZを使用ã—ã¾ã™ã€‚
XBee  XB24-Z7CIT-004

2.回路

表示器å´å›žè·¯å›³

XBeeã¯æ¸©åº¦è¨ˆæ¸¬å€¤ã®å—ä¿¡ã®ã¿ã§ã™ã®ã§RXDã®ã¿æŽ¥ç¶šã—ã¾ã™ã€‚
XB24-Z7CIT-004ãŒXBeeã§ã™ã€‚
RTSã¨CTSã¯æŽ¥ç¶šã—ã¦ãŠãã¾ã™ã€‚
XBeeã¯é›»æºé›»åœ§2.1V~3.6Vã§å‹•ä½œã—ã¾ã™ã€‚
表示器å´éƒ¨å“表
å称 å½¢å メーカ 購入先 æ•°é‡
LCD SC2004CS(3.3V用) ç§‹æœˆé›»å­ 1
マイコン ATmega328 アトメル ç§‹æœˆé›»å­ 1
抵抗 10kΩ 1/4W ç§‹æœˆé›»å­ 4
åŠå›ºå®šæŠµæŠ— 10kΩ ç§‹æœˆé›»å­ 1
押ã—ãƒœã‚¿ãƒ³ã‚¹ã‚¤ãƒƒãƒ èµ¤è‰²ã‚¿ã‚¯ãƒˆã‚¹ã‚¤ãƒƒãƒ ç§‹æœˆé›»å­ 1
押ã—ãƒœã‚¿ãƒ³ã‚¹ã‚¤ãƒƒãƒ é»„è‰²ã‚¿ã‚¯ãƒˆã‚¹ã‚¤ãƒƒãƒ ç§‹æœˆé›»å­ 1
押ã—ãƒœã‚¿ãƒ³ã‚¹ã‚¤ãƒƒãƒ ç·‘è‰²ã‚¿ã‚¯ãƒˆã‚¹ã‚¤ãƒƒãƒ ç§‹æœˆé›»å­ 1
温度センサ LM61CIZ ナショセミ ç§‹æœˆé›»å­ 1
シャントレギュレータ TL431ACZ ç§‹æœˆé›»å­ 1
XBee XB24-Z7CIT-004 スイッãƒã‚µã‚¤ã‚¨ãƒ³ã‚¹ 1
表示器å´çµ„立図

表示器å´çµ„立図

温度センサå´å›žè·¯å›³

温度センサå´å›žè·¯å›³

XB24-Z7CIT-004ãŒXBeeã§ã™ã€‚
電池2本3Vã§å‹•ä½œã•ã›ã¾ã™ã€‚

温度センサå´éƒ¨å“表
å称 å½¢å メーカ 購入先 æ•°é‡
温度センサ LM61CIZ ナショセミ ç§‹æœˆé›»å­ 1
XBee XB24-Z7CIT-004 スイッãƒã‚µã‚¤ã‚¨ãƒ³ã‚¹ 1

温度センサå´çµ„立図

3.XBee設定値

X-CTUを使用ã—ã¦è¨­å®šã—ã¾ã™ã€‚
Xï¼ï¼£ï¼´ï¼µã¯ï¼¸ï¼¢ï½…eを設定ã™ã‚‹ãŸã‚ã®ãƒ‘ソコン用ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚CQ出版「超ãŠæ‰‹è»½ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ï¼¸ï¼¢ï½…ï½…ã€ã«ä»˜å±žã—ã¦ã„るCDï¼ï¼²ï¼¯ï¼­ã«å…¥ã£ã¦ã„ã¾ã™ã€‚Xï¼ï¼£ï¼´ï¼µã¯ç§ã®ç’°å¢ƒã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚ºï¼— 64ビットã§å•é¡Œãªã動作ã—ã¦ã„ã¾ã™ã€‚
表示器å´XBee
設定項目 設定値
(16進)
内容
FUNCTION SET ZIGBEE COORDINATOR API
Networking PAN ID 10 温度センサã®PAN IDã¨ä¸€è‡´ã—ã¦ã„ã‚Œã°ä»»æ„ã§å¯ã€‚
ãŸã ã—'0'以外ã¨ã—ã¾ã™ã€‚
温度センサå´XBee
設定項目 設定値
(16進) 
内容
FUNCTION SET ZIGBEE END DEVICE AT
Networking PAN ID 10 表示器ã®PAN IDã¨ä¸€è‡´ã—ã¦ã„ã‚Œã°ä»»æ„ã§å¯ã€‚
ãŸã ã—'0'以外ã¨ã—ã¾ã™ã€‚
Sleep Mode SM-Sleep Mode サイクリック スリープ
ST-Time before Sleep 7D0 2秒間起ãã¦ã„ã¾ã™ã€‚(動作中)
SP-Cyclic Sleep Period 20 320ms毎ã«å—信確èªã‚’ã™ã‚‹ã€‚
SN-Number of Cyclic to power don IO 19 320ms毎ã«25回å—信確èªã—ã¾ã™ã€‚
従ã£ã¦ã‚¹ãƒªãƒ¼ãƒ—時間ã¯25回 X 320ms = 8秒ã§ã™ã€‚
ãã®å¾Œã€2秒間起ãã¦ã„ã¾ã™ã€‚ 
I/O Settings D1-AD1/DIO1 Configuration  2 2:ADCã€DI01端å­ã‚’ADC入力ã«ã™ã‚‹ã€‚
PR-Pull-up Resistor Enable 1FF7 AD1ã®ãƒ—ルアップをç¦æ­¢ã—ã¾ã™ã€‚
I/O Sampling IR-IO Sampling Rate  7D1 2001msã«è¨­å®šã€1回ADサンプリングを行ã„ã¾ã™ã€‚
( ST / IR + 1 )回サンプリングを行ã„ã¾ã™ã€‚
温度センサå´ï¼¸ï¼¢ï½…ï½…ã®å—信データ
温度センサå´ï¼¸ï¼¢ï½…ï½…ã®ï¼¤ï¼¯ï¼µï¼´ã‹ã‚‰å‡ºã¦ãる電文を以下ã«ç¤ºã—ã¾ã™ã€‚
7E0014920013A200407798BB3FFE4101000102000102E841     16進ã§è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚
電文内容ã®èª¬æ˜Ž
フレーム・フィールド コード(16進) ãƒã‚¤ãƒˆæ•° 備考
開始コード 7E 1
データ長 0014 2 コマンドIDã‹ã‚‰ãƒã‚§ãƒƒã‚¯ã‚µãƒ ç›´å‰ã¾ã§ã®ãƒã‚¤ãƒˆæ•°
コマンドID 92 1 データãŒå—ä¿¡
64ビットアドレス 0013A200407798BB 8 é€ä¿¡å…ƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹
16ビットアドレス 3FFE 2 é€ä¿¡å…ƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚é€ä¿¡å…ƒãŒã‚³ãƒ¼ãƒ‡ã‚£ãƒãƒ¼ã‚¿ã®ã¨ãã¯ã‚ªãƒ¼ãƒ«'0'。
å—信オプション 41 1
サンプル数 01 1
デジタルãƒãƒ£ãƒ³ãƒãƒ« 0001 2 デジタルãƒãƒ£ãƒ³ãƒãƒ«ã®ä½¿ç”¨ãƒ“ット。ビット0を使用ã—ã¦ã„ã‚‹(DIO0)。
アナログãƒãƒ£ãƒ³ãƒãƒ« 02 1 アナログãƒãƒ£ãƒ³ãƒãƒ«ä½¿ç”¨ãƒ“ット。ビット1を使用ã—ã¦ã„ã‚‹(AD1)。
デジタルãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ 0001 2 デジタルãƒãƒ£ãƒ³ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿ã€‚ビット0ãŒ1
アナログãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ 02E8 2 アナログãƒãƒ£ãƒ³ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿ã€‚ãƒãƒ£ãƒ³ãƒãƒ«æ•°ã«å¿œã˜ã¦ãƒ‡ãƒ¼ã‚¿ãŒç¶šã。
AD1ã®ãƒ‡ãƒ¼ã‚¿ãŒ02E8。
ãƒã‚§ãƒƒã‚¯ã‚µãƒ  41 1

4.フローãƒãƒ£ãƒ¼ãƒˆ

メインループ

メインループ

åˆæœŸè¨­å®šã‚’è¡Œã£ãŸå¾Œã¯ã‚¹ãƒªãƒ¼ãƒ—ã«å…¥ã‚Šã¾ã™ã€‚割込を使用ã™ã‚‹ã®ã§ã‚¹ãƒªãƒ¼ãƒ—ã«å…¥ã‚‹å‰ã«å‰²è¾¼ã‚’許å¯ã—ã¦ãŠãã¾ã™ã€‚
スリープã‹ã‚‰æŠœã‘ã‚‹æ¡ä»¶ã¯ã€ã‚¿ã‚¤ãƒžå‰²è¾¼ã¨å—信割込ã§ã™ã€‚
タイマ割込ã¯250ms毎ã«ç™ºç”Ÿã—ã¾ã™ã€‚タイマをCTCモードã§ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚
å—信割込ã¯å—信完了毎ã«ç™ºç”Ÿã—ã€å—信データãŒ24キャラクタã§å—信完了ã§ã™ã€‚
å—信開始ã¯0x7Eå—ä¿¡ã‹ã‚‰ã¨ã—ã¾ã™ã€‚å—信開始ã®åˆ¤å®šã¯å‰²è¾¼å‡¦ç†å†…ã§è¡Œã„ã¾ã™ã€‚
å—信データ完了ã§å—信データã‹ã‚‰ã‚¢ãƒŠãƒ­ã‚°ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿2ãƒã‚¤ãƒˆåˆ†ã‚’å–り出ã—ã€æ¸©åº¦ã«å¤‰æ›ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚
1秒経éŽæ¯Žã«æ™‚計を更新ã—ã€è¡¨ç¤ºå™¨ã®æ¸©åº¦ã‚’æ›´æ–°ã—ã¾ã™ã€‚
時計設定モードã®å ´åˆã¯æ™‚計ã®ä¿®æ­£ã‚’è¡Œã„ã¾ã™ã€‚

5.プログラムã®å®Ÿè¡Œ

表示器実行画é¢

表示器実行画é¢

年月日を表示ã—ã¦ã„ã¾ã™ã€‚
時分秒を表示ã—ã¦ã„ã¾ã™ã€‚
温度1ã¯è¡¨ç¤ºå™¨ã«å®Ÿè£…ã•ã‚Œã¦ã„る温度センサã®æ¸©åº¦ã§ã™ã€‚1秒毎ã«æ›´æ–°ã—ã¦ã„ã¾ã™ã€‚
温度2ã¯æ¸©åº¦ã‚»ãƒ³ã‚µã‹ã‚‰ã®æ¸©åº¦ã§ã™ã€‚10秒毎ã«æ›´æ–°ã—ã¾ã™ã€‚10秒毎ã«æ¸©åº¦ã‚»ãƒ³ã‚µã‹ã‚‰æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ãŒé€ã‚‰ã‚Œã¦ãã¾ã™ã€‚

6.プログラム

/*
 * Temp.c
 *
 * Created: 2012/07/16
 *  Author: YoshioNakamura
 * 温度計測çµæžœã‚’ç„¡ç·šã§é€ã‚Šè¡¨ç¤ºã™ã‚‹ã€‚
 * LCDã®åˆ¶å¾¡ã¯ChaNã•ã‚“ã® "EZ-LCD - Generic control module for HD44780" LCDCを使用
 * XBeeã¯ã€ŒCQ出版超ãŠæ‰‹è»½ç„¡ç·šãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«XBeeã€ã‹ã‚‰å¼•ç”¨
 */

# define F_CPU 1000000UL

#include    <avr/io.h>
#include    <avr/interrupt.h>
#include    <avr/sleep.h>
#include    "hd44780.h"
#include    <util/delay.h>

// 時計
#define     RED     0x20    // 赤スイッãƒ
#define     YELLOW  0x10    // 黄スイッãƒ
#define     GREEN 0x08  // 緑スイッãƒ
#define     MODE    (RED | YELLOW)          // 時計変更モード
#define     SWON    (RED | YELLOW | GREEN)  // å…¨ã¦ã®ã‚¹ã‚¤ãƒƒãƒãŒON
// 温度計
#define     LM61_ON     PORTC |= 1 << PORTC2    // LM61é›»æºON
#define     LM61_OFF    PORTC &= ~(1 << PORTC2)   // LM61é›»æºOFF
#define     ADC_ON      ADCSRA |= (1 << ADEN) // adc許å¯
#define     ADC_OFF     ADCSRA &= ~(1 << ADEN)  // adcåœæ­¢
#define     ADC_START ADCSRA |= 1 << ADSC   // adcスタート
#define     V_REF   2480                    // レファレンス電圧
// 通信
#define     RXBUF_SIZE  30      // å—信データ数
#define     XBEE_REF    1200    // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã®ãƒ¬ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹é›»åœ§

void    InitHard(void);     // ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢åˆæœŸåŒ–
void    InitTime(void);     // 時間åˆæœŸåŒ–
void    CalcDate(uint8_t, uint8_t);     // 時計演算 0:加算ã€1:減算
void    BlinkDisp(uint8_t, uint8_t);    // 指定ä½ç½®ãƒ–リンクã™ã‚‹ã€‚ã€0:通常ã€1:å‰æ¡ã®æ–‡å­—を表示
void    DateDisp(uint8_t, uint8_t, uint8_t);    // 指定場所ã®æ–‡å­—ã‚’æ›´æ–°ã™ã‚‹ã€‚
void    UpdateTime(void);   // 時計更新
void    DoADC(void);            // ADCを動作ã•ã›è¡¨ç¤ºã•ã›ã‚‹ã€‚  1秒毎
uint16_t    ReadADCCel(void); // ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å‡ºã™ã€‚デジタルフィルタ付
void    AdcDisp( uint16_t);     // ADC値を変æ›ã—表示
void    XBeeTempDisp(void);   // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã‚’変æ›ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚


uint8_t   g_u8BlinkFlg = 0;         // 0:点ç¯ã€1:消ç¯
volatile uint8_t g_u8IntTimeFlg;    // 時計割り込ã¿ãƒ•ãƒ©ã‚°

uint8_t   g_u8CalenderBuf[6];       // 時計データä¿å­˜ã€ãƒ‡ãƒ¼ã‚¿ã¯BCDã§ä¿å­˜ã€‚上ä½4bit:10ã®ä½ã€ä¸‹ä½4bit:1ã®ä½

union switch_states                 // スイッãƒçŠ¶æ…‹ãƒ•ãƒ©ã‚°
{
    uint8_t BYTE;
    struct
    {
        uint8_t   mode      :1;   // 時計変更モード
        uint8_t mode_keep :1; // 時計変更モード確定
        uint8_t   red       :1; // 赤スイッãƒON
        uint8_t   red_keep  :1; // 赤スイッãƒON->OFF
        uint8_t   yellow        :1; // 黄スイッãƒON
        uint8_t   yellow_keep :1; // 黄スイッãƒON->OFF
        uint8_t green   :1; // 緑スイッãƒON
        uint8_t   green_keep    :1; // 緑スイッãƒON->OFF
    }BIT;
};          
union switch_states g_uSwitchState;

uint8_t g_u8CalenderArray[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // カレンダ通常年
                        { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};     // カレンダé–å¹´
uint8_t   g_u8LcdStr[] = {0xb5, 0xdd, 0xc4, 0xde, '1', ':', '-', '-', '-', '-', '.', '-', 0xdf, 'C'};   // LCD表示データ格ç´ãƒãƒƒãƒ•ã‚¡

// 通信
uint8_t g_u8Count;              // å—信データ数
uint8_t g_u8RxBuff[RXBUF_SIZE];   // å—信データä¿å­˜ãƒãƒƒãƒ•ã‚¡
union int_flg
{
    uint8_t BYTE;
    struct
    {
        uint8_t         :6;   // 余り
        uint8_t time    :1;   // 時計割込
        uint8_t   rx7E  :1; // å—信割込0x7eå—ä¿¡ã§ON   
    }BIT; 
};
union int_flg g_uIntFlg;

int main(void)
{
    uint8_t   u8PortcState;
    uint8_t   u8LcdLocate;      // 変更ä½ç½®è¨˜æ†¶ 0:yy, 1:mm, 2:dd, 3:hhh, 4:mmm, 5:sss
    uint8_t u8LocateChange = 0;   // 表示ä½ç½®å¤‰æ›´ãƒ•ãƒ©ã‚° 0:変更ä½ç½®ç§»å‹•ãªã—ã€1:移動ã‚ã‚Š  

    InitHard();                     // ãƒãƒ¼ãƒˆã€LCDåˆæœŸåŒ–
    g_u8IntTimeFlg = 0;             // 250ms毎ã«ã‚«ã‚¦ãƒ³ãƒˆ
    InitTime();                     // 時計åˆæœŸåŒ–ãŠã‚ˆã³åˆæœŸå€¤è¡¨ç¤º 
    
    sei();      // 割り込ã¿è¨±å¯
    
    while(1)
    {
        sleep_enable();     //sleep許å¯
        sleep_cpu();        //sleep中
        sleep_disable();    // sleepç¦æ­¢
        
        // 通信
        if ( (g_uIntFlg.BIT.rx7E == 1) && (g_u8Count > 23))
        {
            if ( g_u8Count == 24) // å—信完了データå–å¾—
            {
                g_uIntFlg.BIT.rx7E = 0;
                XBeeTempDisp();             
            }
            else          // データエラー
            {
                g_uIntFlg.BIT.rx7E = 0;
                g_u8Count = 0;      
            }
        }
        // 時計更新
        if ( g_uIntFlg.BIT.time == 1)
        {
            g_uIntFlg.BIT.time = 0;
            g_u8IntTimeFlg++;
            
            if (g_u8IntTimeFlg > 3)   // 一秒経éŽ
            {
                UpdateTime();   // 時計更新
                g_u8IntTimeFlg = 0;
                DoADC();            // 1秒毎ã«ADCを動作ã•ã›æ¸©åº¦ã‚’LCDã«è¡¨ç¤ºã™ã‚‹ã€‚
            }

            // 時計調整
            u8PortcState = ~PINC & SWON;
            
            if (g_uSwitchState.BIT.mode_keep == 0)  // 時計変更モード確èª
            {
                if ( (u8PortcState == MODE))    // 赤ã¨é»„色ã®ã‚¹ã‚¤ãƒƒãƒã‚’åŒæ™‚on。
                {
                    g_uSwitchState.BIT.mode = 1;
                }
                else if ( (u8PortcState == 0) && (g_uSwitchState.BIT.mode == 1))    
                // 赤ã¨é»„スイッãƒãŒoff->on->offã§æ™‚計変更モードã«ç§»è¡Œ
                {
                    g_uSwitchState.BIT.mode_keep = 1;
                u8LcdLocate = 0;
                BlinkDisp(u8LcdLocate, 0);  // å¹´ã®ä½ç½®ãƒ–リンク表示
                }       
            }
            else if (g_uSwitchState.BIT.mode_keep)      // 時計変更モードã€ã‚¹ã‚¤ãƒƒãƒã¯èµ¤->黄->ç·‘ã®é †ã§å„ªå…ˆé †ä½ãŒä½Žããªã‚‹ã€‚
            {                                       // 赤ã¨ç·‘ãŒæŠ¼ã•ã‚Œã å ´åˆã¯èµ¤ãŒå„ªå…ˆã•ã‚Œã‚‹ã€‚
                u8LocateChange = 0;                     //表示ä½ç½®å¤‰æ›´ãƒ•ãƒ©ã‚°ã‚¯ãƒªã‚¢
                if (u8PortcState == RED)    // 赤ãŒon 
                {
                    g_uSwitchState.BYTE = 0;
                    g_uSwitchState.BIT.mode_keep = 1;
                    g_uSwitchState.BIT.red = 1;
                }
                else if (u8PortcState == YELLOW)    // 黄ãŒon
                {
                    g_uSwitchState.BYTE = 0;
                    g_uSwitchState.BIT.mode_keep = 1;
                    g_uSwitchState.BIT.yellow = 1;
                }
                else if (u8PortcState == GREEN)     // ç·‘ãŒon
                {
                    g_uSwitchState.BYTE = 0;
                    g_uSwitchState.BIT.mode_keep = 1;
                    g_uSwitchState.BIT.green = 1;
                }
                else if ( u8PortcState == 0)    // スイッãƒãŒå…¨éƒ¨offã€ã‚¹ã‚¤ãƒƒãƒãŒoff->on->offã§å„動作をã™ã‚‹ã€‚
                {
                    if (g_uSwitchState.BIT.red == 1)        // 赤ãŒonã ã£ãŸ
                    {
                        g_uSwitchState.BIT.red = 0;
                        u8LcdLocate++;
                        u8LocateChange = 1;
                    }           
                    if (g_uSwitchState.BIT.yellow == 1)   // 黄ãŒonã ã£ãŸ
                    {
                        g_uSwitchState.BIT.yellow = 0;
                        CalcDate( u8LcdLocate, 0);
                    }
                    if (g_uSwitchState.BIT.green == 1)      // ç·‘ãŒonã ã£ãŸ
                    {
                        g_uSwitchState.BIT.green = 0;
                        CalcDate(u8LcdLocate, 1);
                    }

                }
                BlinkDisp(u8LcdLocate, u8LocateChange);     // ブリンクã€ã‚«ãƒ¬ãƒ³ãƒ€æ›´æ–°
            }
        }       
    } // while loop
}

void InitHard(void)
{
    uint8_t i;
    
    // portåˆæœŸåŒ–
    DDRB = 0xff;        // portb7:0=出力
    PORTB = 0;
    DDRC = 0x06;        // portc2:1=出力
    PORTC = 0;
    DDRD = 0xfe;    // portd7:1=出力
    PORTD = 0;
    // LCDåˆæœŸåŒ–
    lcd_init();
    // 温度1åˆæœŸå€¤
    lcd_locate( 2, 0);
    g_u8LcdStr[4] = '1';
    for ( i = 0; i < 14; i++)
    {
        lcd_putc(g_u8LcdStr[i]);
    }
    // 温度2åˆæœŸå€¤
    lcd_locate( 3, 0);
    g_u8LcdStr[4] = '2';
    for ( i = 0; i < 14; i++)
    {
        lcd_putc(g_u8LcdStr[i]);
    }
    // 16bitタイマ設定
    // CTC動作ã€1/8分周 周期ã¯ï¼’5ï¼ï½ï½“
    OCR1A = 31686;      // 31249 設定値
    TCCR1A = (1 << COM1A0);
    TCCR1B = 0x0a;  // スタート
    TIMSK1 = 1 << OCIE1A; // ctc割り込ã¿è¨±å¯
    // ADC
    ADMUX = 0;  // Vref = 外部レファレンス
    ADCSRA = (1 << ADPS1) | (1 << ADPS0); // adcクロック = 125kHz
    DIDR0 = (1 << ADC0D); // adc0デジタル入力ãƒãƒƒãƒ•ã‚¡ç¦æ­¢
    //UART 設定
    // baurate  9600
    // data     8
    // parity non
    // stop bit   1
    UCSR0A = 1 << U2X0;
    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
    UBRR0L = 12;
    UCSR0B = (1 << RXCIE0) | (1 << RXEN0);
    
    // スリープモードã¯ã‚¢ã‚¤ãƒ‰ãƒ«ã«è¨­å®š
    set_sleep_mode(SLEEP_MODE_IDLE);
}

void InitTime(void)
{
    g_u8CalenderBuf[0] = 0x12;
    g_u8CalenderBuf[1] = 6;
    g_u8CalenderBuf[2] = 1;
    g_u8CalenderBuf[3] = 0;
    g_u8CalenderBuf[4] = 0;
    g_u8CalenderBuf[5] = 0;

    lcd_locate( 0, 0);              // 1行目:年月日表示
    lcd_putc((g_u8CalenderBuf[0] >> 4) + 0x30);     // å¹´
    lcd_putc((g_u8CalenderBuf[0] & 0x0f) + 0x30);
    lcd_putc('/');
    lcd_putc((g_u8CalenderBuf[1] >> 4) + 0x30);     // 月
    lcd_putc((g_u8CalenderBuf[1] & 0x0f) + 0x30);
    lcd_putc('/');
    lcd_putc((g_u8CalenderBuf[2] >> 4) + 0x30);     // 分
    lcd_putc((g_u8CalenderBuf[2] & 0x0f) + 0x30);
        
    lcd_locate( 1, 0);              // 2行目:時分秒表示
    lcd_putc((g_u8CalenderBuf[3] >> 4) + 0x30);     // 時
    lcd_putc((g_u8CalenderBuf[3] & 0x0f) + 0x30);
    lcd_putc(':');
    lcd_putc((g_u8CalenderBuf[4] >> 4) + 0x30);     // 分
    lcd_putc((g_u8CalenderBuf[4] & 0x0f) + 0x30);
    lcd_putc(':');
    lcd_putc((g_u8CalenderBuf[5] >> 4) + 0x30);     // 秒
    lcd_putc((g_u8CalenderBuf[5] & 0x0f) + 0x30);
}

void DoADC(void)        // ADCを動作ã•ã›è¡¨ç¤ºã•ã›ã‚‹ã€‚1秒毎
{
    uint16_t result;
    
    LM61_ON;                // 温度センサ電æºON
    ADC_ON;                 // ADCイãƒãƒ¼ãƒ–ル
    DELAY_US(6000);         // wait 60ms レファレンス電圧ã€LM61ã€ADC安定待ã¡
    ADC_START;              // ADC動作開始
    result = ReadADCCel();  // ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å‡ºã™ã€‚デジタルフィルタ付
    ADC_OFF;                // ADCç¦æ­¢
    LM61_OFF;           // 温度センサ電æºOFF
    AdcDisp(result);        // LCDã«ãƒ‡ãƒ¼ã‚¿ã‚’表示    
}

uint16_t ReadADCCel(void) // 指定ã•ã‚ŒãŸãƒãƒ£ãƒ³ãƒãƒ«ã®ADCã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å‡ºã™ã€‚
{
    static uint16_t adc_data1, adc_data2, adc_data3;
    
    while((ADCSRA & (1 << ADSC)));
    adc_data3 = adc_data2;
    adc_data2 = adc_data1;
    adc_data1 = ADCW;
    
    return ((adc_data3 + adc_data2 + adc_data2 + adc_data1) / 4);
}

void AdcDisp( uint16_t result)          // ADC値を変æ›ã—表示
{
    int16_t i;
    long    sum;

    sum = ((long)result * V_REF/ 1024) - 600;
    // sumã®æ­£å¸¸ç¯„囲ãƒã‚§ãƒƒã‚¯
    g_u8LcdStr[4] = '1';
    
    if ( (sum > 1800) || ( sum < -400))
    {
        for ( i = 6; i < 10; i++)
        {
            g_u8LcdStr[i] = '-';
        }
        g_u8LcdStr[11] = '-';
    }
    else
    {
        if ( sum < 0)
        {
            sum *= -1;
            g_u8LcdStr[6] = '-';
        }
        else
        {
            g_u8LcdStr[6] = 0x20;
        }
        g_u8LcdStr[7] = 0x20;
        g_u8LcdStr[8] = 0x20;
        g_u8LcdStr[9] = 0x30;
        g_u8LcdStr[11] = 0x30;
            
        // binary -> BCDキャラクタ変æ›
        for ( i = 11; i > 5; i--)
        {
            g_u8LcdStr[i] = (sum % 10) + 0x30;
            sum /= 10;
            if ( i == 11)
            {
                i--;
            }
            if ( sum <= 0)
            {
                break;
            }   
        }
    }   
    // LCDã«è¡¨ç¤º
    lcd_locate( 2, 0);
    for ( i = 0; i < 14; i++)
    {
        lcd_putc(g_u8LcdStr[i]);
    }   
}


void    XBeeTempDisp(void)  // XBeeã®æ¸©åº¦ãƒ‡ãƒ¼ã‚¿ã‚’変æ›ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚
{
    uint8_t cnt;
    
    int16_t i;
    long    sum;
    
    g_u8LcdStr[4] = '2';
    sum =(g_u8RxBuff[22] << 8) | g_u8RxBuff[23];
    sum = (sum * XBEE_REF/ 1024) - 600;
    

    if ( (sum > 1800) || ( sum < -400))
    {
        for ( i = 6; i < 10; i++)
        {
            g_u8LcdStr[i] = '-';
        }
        g_u8LcdStr[11] = '-';
    }
    else
    {
        if ( sum < 0)
        {
            sum *= -1;
            g_u8LcdStr[6] = '-';
        }
        else
        {
            g_u8LcdStr[6] = 0x20;
        }
        g_u8LcdStr[7] = 0x20;
        g_u8LcdStr[8] = 0x20;
        g_u8LcdStr[9] = 0x30;
        g_u8LcdStr[11] = 0x30;
        
        // binary -> BCDキャラクタ変æ›
        for ( i = 11; i > 5; i--)
        {
            g_u8LcdStr[i] = (sum % 10) + 0x30;
            sum /= 10;
            if ( i == 11)
            {
                i--;
            }
            if ( sum <= 0)
            {
                break;
            }
        }
    }
    // LCDã«è¡¨ç¤º
    lcd_locate( 3, 0);
    for ( i = 0; i < 14; i++)
    {
        lcd_putc(g_u8LcdStr[i]);
    } 
}


void    BlinkDisp(uint8_t dat, uint8_t flg)   //指定ä½ç½®ã‹ã‚‰ï¼’文字分ブリンクã™ã‚‹ã€‚
{
    uint8_t raw, col;
    
    switch( dat)
    {
    case 0:   // å¹´
        lcd_locate(0, 0);
        break;
    case 1:   // 月
        lcd_locate(0, 3);
        raw = 0;
        col = 0;
        break;
    case 2: // æ—¥
        lcd_locate(0, 6);
        raw = 0;
        col = 3;
        break;
    case 3: // 時
        lcd_locate(1, 0);
        raw = 0;
        col = 6;
        break;
    case 4:   // 分
        lcd_locate(1, 3);
        raw = 1;
        col = 0;
        break;
    case 5:   // 秒
        lcd_locate(1, 6);
        raw = 1;
        col = 3;
        break;
    default:    // 時計修正モード終了
        g_uSwitchState.BYTE = 0;
        lcd_locate(1, 6);
        lcd_putc((g_u8CalenderBuf[5] >> 4) + 0x30);
        lcd_putc((g_u8CalenderBuf[5] & 0x0f) + 0x30);
        return;
        break;  
    }

    if ( g_u8BlinkFlg == 0)
    {
        // 消ç¯
        g_u8BlinkFlg = 1;

        lcd_putc(' ');
        lcd_putc(' ');
    }
    else
    {
        // 点ç¯
        g_u8BlinkFlg = 0;
        lcd_putc((g_u8CalenderBuf[dat] >> 4) + 0x30);
        lcd_putc((g_u8CalenderBuf[dat] & 0x0f) + 0x30);
    }
    
    if (flg == 1)
    {   
        lcd_locate(raw, col);
        lcd_putc((g_u8CalenderBuf[dat - 1] >> 4) + 0x30);
        lcd_putc((g_u8CalenderBuf[dat - 1] & 0x0f) + 0x30);     
    }
}


void CalcDate(uint8_t dat, uint8_t flg)
{
    int sum, day;
    
    switch ( dat)
    {
    case 0:   // å¹´
        sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
        switch(flg)
        {
        case 0:   // 加算
            if ( ++sum > 99)
            {
                sum = 0;
            }
            break;
        default:    // 減算
            if ( --sum < 0 )
            {
                sum = 99;
            }
            break;
        }
        g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
        break;
    case 1:   // 月
        sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
        switch(flg)
        {
        case 0:   // 加算
            if ( ++sum > 12)
            {
                sum = 1;
            }
            break;
        default:    // 減算
            if ( --sum < 1 )
            {
                sum = 12;
            }
            break;
        }
        g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
        break;
    case 2:   // æ—¥
        sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f);             // 月を抽出   
        if ((((g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f)) % 4) == 0)  // ã†ã‚‹ã†å¹´ãªã‚‰
        {
            day = g_u8CalenderArray[1][sum - 1];
        }
        else
        {
            day = g_u8CalenderArray[0][sum -1];
        }
        sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
        switch(flg)
        {
        case 0:   // 加算
            if ( ++sum > day)
            {
                sum = 1;
            }
            break;
        default:    // 減算
            if ( --sum < 1 )
            {
                sum = day;
            }
            break;
        }
        g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
        break;
    case 3:   // 時
        sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
        switch(flg)
        {
        case 0:   // 加算
            if ( ++sum > 23)
            {
                sum = 1;
            }
            break;
        default:    // 減算
            if ( --sum < 1 )
            {
                sum = 23;
            }
            break;
        }
        g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
        break;
    default:    // 分ã€ç§’
        sum = (g_u8CalenderBuf[dat] >> 4) * 10 + (g_u8CalenderBuf[dat] & 0x0f);
        switch(flg)
        {
        case 0:   // 加算
            if ( ++sum >59)
            {
                sum = 0;
            }
            break;
        default:    // 減算
            if ( --sum < 1 )
            {
                sum = 59;
            }
            break;
        }
        g_u8CalenderBuf[dat] =((sum / 10) << 4) | (sum % 10);
        break;      
    }
}

void    UpdateTime(void)        // 時計
{
    uint8_t sum, day, flg = 0;
    
    // 秒
    sum = (g_u8CalenderBuf[5] >> 4) * 10 + (g_u8CalenderBuf[5] & 0x0f);
    if ( ++sum > 59)
    {
        g_u8CalenderBuf[5] = 0;
        flg = 1;
        DateDisp(1, 6, g_u8CalenderBuf[5]);
    }
    else
    {
        g_u8CalenderBuf[5] =((sum / 10) << 4) | (sum % 10);
        DateDisp(1, 6, g_u8CalenderBuf[5]);
        return;
    }
    // 分
    if ( flg == 1) 
    {
        flg = 0;
        sum = (g_u8CalenderBuf[4] >> 4) * 10 + (g_u8CalenderBuf[4] & 0x0f);
        if( ++sum > 59)
        {
            g_u8CalenderBuf[4] = 0;
            flg = 1;
            DateDisp(1, 3, g_u8CalenderBuf[4]);         
        }
        else
        {
            g_u8CalenderBuf[4] =((sum / 10) << 4) | (sum % 10);
            DateDisp(1, 3, g_u8CalenderBuf[4]);
        }
    }

    // 時
    if ( flg == 1)
    {
        flg = 0;
        sum = (g_u8CalenderBuf[3] >> 4) * 10 + (g_u8CalenderBuf[3] & 0x0f);
        if( ++sum > 23)
        {
            g_u8CalenderBuf[3] = 0;
            flg = 1;
            DateDisp(1, 0, g_u8CalenderBuf[3]);
        }
        else
        {
            g_u8CalenderBuf[3] =((sum / 10) << 4) | (sum % 10);
            DateDisp(1, 0, g_u8CalenderBuf[3]);
        }
    }   
    // æ—¥
    if ( flg == 1)
    {
        flg = 0;

        sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f);             // 月を抽出   
        if ((((g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f)) % 4) == 0)  // ã†ã‚‹ã†å¹´ãªã‚‰
        {
            day = g_u8CalenderArray[1][sum - 1];
        }
        else
        {
            day = g_u8CalenderArray[0][sum -1];
        }
        
        sum = (g_u8CalenderBuf[2] >> 4) * 10 + (g_u8CalenderBuf[2] & 0x0f);
        if( ++sum > day)
        {
            g_u8CalenderBuf[2] = 1;
            DateDisp(0, 6, g_u8CalenderBuf[2]);
            flg = 1;
        }

        else
        {
            g_u8CalenderBuf[2] =((sum / 10) << 4) | (sum % 10);
            DateDisp(0, 6, g_u8CalenderBuf[2]);
        }
    }   
    // 月
    if ( flg == 1)
    {
        flg = 0;
        sum = (g_u8CalenderBuf[1] >> 4) * 10 + (g_u8CalenderBuf[1] & 0x0f);
        if( ++sum > 12)
        {
            g_u8CalenderBuf[1] = 1;
            DateDisp(0, 3, g_u8CalenderBuf[1]);
            flg = 1;
        }
        else
        {
            g_u8CalenderBuf[1] =((sum / 10) << 4) | (sum % 10);
            DateDisp(0, 3, g_u8CalenderBuf[1]);
        }
    }
    // å¹´
    if ( flg == 1)
    {
        flg = 0;
        sum = (g_u8CalenderBuf[0] >> 4) * 10 + (g_u8CalenderBuf[0] & 0x0f);
        if( ++sum > 99)
        {
            g_u8CalenderBuf[0] = 0;
            DateDisp(0, 0, g_u8CalenderBuf[0]);
            flg = 1;
        }
        else
        {
            g_u8CalenderBuf[0] =((sum / 10) << 4) | (sum % 10);   
            DateDisp(0, 0, g_u8CalenderBuf[0]);
        }
    }   
}

void    DateDisp(uint8_t raw, uint8_t col, uint8_t dat)   // 指定場所ã®æ–‡å­—ã‚’æ›´æ–°ã™ã‚‹ã€‚
{
    lcd_locate(raw, col);
    lcd_putc((dat >> 4) + 0x30);
    lcd_putc((dat & 0x0f) + 0x30);  
}

SIGNAL(TIMER1_COMPA_vect) // 0.25秒ã”ã¨ã«å‰²è¾¼ç™ºç”Ÿ
{
    g_uIntFlg.BIT.time = 1;   
}

SIGNAL(USART_RX_vect) // å—信割込ã€ãƒ‡ãƒ¼ã‚¿å—信完了ã¯ãƒ¡ã‚¤ãƒ³ãƒ«ãƒ¼ãƒ—ã§g_u8Count= 24ã§åˆ¤æ–­ã™ã‚‹ã€‚
{
    if ( UDR0 == 0x7e)  // 0x7eã§å—信開始
    {
        g_uIntFlg.BIT.rx7E = 1;
        g_u8Count = 0;
    }
    if ( g_uIntFlg.BIT.rx7E == 1) // UDR0ã‹ã‚‰å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ー
    {
        g_u8RxBuff[g_u8Count++] = UDR0;
    }
}