/**************************************(abc892_18426.c)***
* NEC/SONY赤外線リモコンの送受信 with 4x3Key
**********************************************************/
#include "mcc_generated_files/mcc.h"
#include "string.h"
#include "stdlib.h"
#include "i2cLCD_ST7032i.h"
#define MAXDATA 90 // 赤外線データー配列数
#define MAXADDR 10 // SONYアドレス配列数
//#define BFSIZE 20 // eusart.hで定義
#define SLVADR 0x40 // 4x3キーのI2Cアドレス
・・・(途中省略)
// 事前登録赤外線コード(SONY)
uint16_t sDt[] = { 0x0B0A, 0x0707, 0x0203, 0x0100, // 12bit例
0xB4E9, 0xBAEA, 0xB9AB, 0xB4AA, // 15bit例
0xC410, 0xC309, 0xC206, 0xC103 }; // 20bit例
uint16_t sAd[] = { 0x04B9, 0x0CB9, 0x14B9, 0x0A7A,
0x1C5A, 0x1D5A, 0x1E5A, 0x10FA }; // アドレス
// 事前登録赤外線コード(IOdata)
uint16_t IO2[] = { 0xE014, 0x7084, 0x4084, 0x1084,
0xA084, 0x8084, 0x5084, 0x2084,
0xF014, 0x9084, 0x6084, 0x3084 }; // IOdata例
・・・(途中省略)
/*-------------------------------------------
* Main application
*-------------------------------------------*/
void main(void)
{
uint8_t ird; // 赤外線データ
uint8_t sbt; // ビットセット用シフトバイト
uint8_t bct; // 有効ビットデータカウンタ
uint8_t sgf; // データ有効フラグ
uint16_t sDat; // SONY送信データ
uint16_t sAdr; // SONY送信アドレス
char *end; // 文字列切り出し処理用
uint16_t key; // キーユニットデータ
uint16_t keyLate; // 前回のキーデータ
uint16_t keyP; // キー位置データ(0-11)
uint8_t iMode = 1; // 赤外線モード(SONY=1)
SYSTEM_Initialize(); // デバイス初期化
LCD_init(); // LCD初期化
・・・(途中省略)
// ====== 赤外線信号の受信・送出ループ =====
while((p_PR < MAXDATA)) // バッファ満杯まで繰返
{
if(sFlg){ // usb受信データがあれば?
if(strchr(rBuf,'X') || strchr(rBuf,'x')){
sDat = (uint16_t)strtol(rBuf, &end, 16);
sAdr = (uint16_t)strtol(end, NULL, 16);
send_SONY(sDat,sAdr); // データを送信
}else{
uint8_t n = atoi(rBuf);
if(n > 0 & n < 4) send_IOdata(n-1);
}
sFlg = 0; // シリアルフラグクリア
printf("\n\r");
}
if(PORTCbits.RC4 == 0){ // 黄ボタンが押された?
if(iMode) IO_RC2_SetLow();
else IO_RC2_SetHigh();
iMode ^= 0x01;
__delay_ms(1000); // チャタリング対策
}
// ----- I2C受信データ(key)処理
I2C1_ReadNBytes(SLVADR, &key, 2); // キー入力I2C受信
if(key){ // 4x3キーが押された?
if(key != keyLate){ // 前回と異なるか?
keyP = key & 0x0F;
if(keyP < 12){ // データが有効か?
if(iMode){ // SONYモードか?
sDat = sDt[keyP];
if((sDat & 0x8000) && !(sDat & 0x0080)){
sAdr = sAd[((sDat >> 8) & 0x07)];
}else{
sAdr = 0;
}
send_SONY(sDat, sAdr); // SONYコード送信
}else{
send_IOdata((uint8_t)keyP); // IOdataコード送信
}
}
}
}
keyLate = key;
// ----- 赤外線信号受信 ----
・・・(途中省略)
Sony = 7; // -> SONY Mode
// IO_RC2_SetHigh(); // コメントに
・・・(途中省略)
Sony = 0; // -> NEC Mode
// IO_RC2_SetLow(); // コメントに
・・・(以下省略)
|