2026年 07月 16日
[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_03381934.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03381934.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_03383090.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03383090.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_06295937.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_06295937.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_03384574.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03384574.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_03384987.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_03384987.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_06300566.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_06300566.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_07102909.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07102909.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_07103562.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07103562.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_07104018.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07104018.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_07104605.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_07104605.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09314756.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09314756.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09321626.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09321626.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09323406.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09323406.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09325154.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09325154.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09332367.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09332367.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09334108.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09334108.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09335774.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09335774.png)
![[マイクラ統合版] 家具アドオン [ガイドブック日本語翻訳] (7/16)_a0034780_09342155.png](https://pds.exblog.jp/pds/1/202607/16/80/a0034780_09342155.png)
2026年 07月 11日
[マイクラ統合版] 2026/7 期間限定 無料ウィークエンド開始! [アドオン] (7/11)
![[マイクラ統合版] 2026/7 期間限定 無料ウィークエンド開始! [アドオン] (7/11)_a0034780_12432616.png](https://pds.exblog.jp/pds/1/202607/11/80/a0034780_12432616.png)
2026年 07月 08日
[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_16274440.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_16274440.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_16312360.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_16312360.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_16594152.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_16594152.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_17075349.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_17075349.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_17171062.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_17171062.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_20024348.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_20024348.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_18191749.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18191749.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_18234119.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18234119.png)
設置したアイテムをその場で「前後に」移動する。
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_18294485.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18294485.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_18370561.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18370561.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_18435239.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18435239.png)
![[マイクラ統合版] XPクリスタルバンク [330円アドオン] (7/8)_a0034780_18502810.png](https://pds.exblog.jp/pds/1/202607/08/80/a0034780_18502810.png)
2026年 06月 22日
[PC-G850V] ポケコンでI2C通信 - Gemini Cソース 校正 (6/22)
// 保持時間用のウェイト関数(長めにとっています)
int i2c_wait(int c) {
int a,i; // コンパイラ最適化防止のvolatileがないのでa+=i;returnで代用
a=0;
for(i = 0; i < c; i++) a+=i;
return a;
}
// I2C スタート条件を出力する関数
void i2c_start() {
int rtn;
// 1. 初期状態:両方のピンを入力に設定し、プルアップ抵抗で確実に「Hi」にする
pioset(0x03); // bit0(SDA)=1, bit1(SCL)=1 を入力に
rtn=i2c_wait(5);
// 2. 先に「出力」に切り替えてから、SDA(4ピン)を「Lo」に落とす
// SCLは入力(Hi)を維持したまま、SDAだけが「Hi → Lo」になります(スタート条件)
pioset(0x02); // bit0(SDA)=0(出力), bit1(SCL)=1(入力のままHi)
rtn=i2c_wait(5);
pioput(0x00); // bit0(SDA)=0(Loに落とす)
rtn=i2c_wait(5);
// 3. 次にSCL(5ピン)も「出力」に切り替えて「Lo」に落とす
// これで両方のピンがLoに固定され、データ送信の準備が整います
pioset(0x00); // bit1(SCL)も0(出力)にする
rtn=i2c_wait(5);
pioput(0x00); // bit1(SCL)=0(Loに落とす)
rtn=i2c_wait(5);
}
// 1バイトデータを送信し、液晶からのACK(0=成功, 1=失敗)を返す関数
// ※事前のスタート条件により、SCL=Lo, SDA=Lo (両方出力) から始まる前提です
int i2c_write_byte(unsigned char data) {
int i,w;
int ack_bit;
int rtn;
unsigned char bit_val;
// --- 1〜8ビット目のデータ送信ループ ---
for(i = 0; i < 8; i++) {
// MSBファースト(最上位ビットから順に)データを取り出す
// 送るビットが1ならHi(0x01)、0ならLo(0x00)
if((data & 0x80))
bit_val = 0x01;
else
bit_val = 0;
// bit_val = (data & 0x80) ? 0x01 : 0x00;→三項演算子がないので
data <<= 1; // 次のビットのために左シフト
// SCL=Loの状態で、SDAの出力を変更する
pioput(bit_val);
rtn=i2c_wait(5);
// SCLをHiにして液晶にデータを読み込ませる
// (SCLを1にするために、入力(開放)ではなく、出力のままHiにするのが確実です)
// ※bit1(SCL)を1にするため、SDAの状態(bit0)と合わせる
pioput(bit_val | 0x02);
rtn=i2c_wait(5);
// SCLをLoに戻す
pioput(bit_val);
rtn=i2c_wait(5);
}
// --- 9ビット目:液晶からのACK(応答)を確認する処理 ---
// 1. まずSDA(4ピン/bit0)を入力モードに切り替えて、液晶が自由にSDAをLoにできるようにする
// SCL(5ピン/bit1)は出力モード(0)のまま維持します
pioset(0x02); // bit0=1(入力), bit1=0(出力)
rtn=i2c_wait(5);
// 2. クロック(SCL)をHiにする
pioput(0x02); // bit1(SCL)=1
rtn=i2c_wait(5);
// 3. この「SCLがHi」のタイミングで、液晶がSDAをLoに引き下げているかをpiogetで確認する
// bit0(SDA)が0(Lo)なら液晶が正常にデータを受け取った合図(ACK)です
w = pioget();
if ((w & 0x01) == 0) {
ack_bit = 0; // ACK成功(正常)
} else {
ack_bit = 1; // NACK失敗
}
// 4. クロック(SCL)をLoに戻す
pioput(0x00); // bit1(SCL)=0
rtn=i2c_wait(5);
// 5. 次の通信に備えて、SDA(4ピン)を再び出力モード(0)に戻しておく
pioset(0x00); // 両方出力モードへ
rtn=i2c_wait(5);
return ack_bit; // 0なら液晶が正しく認識しています
}
// I2C ストップ条件を出力する関数
void i2c_stop() {
int rtn;
// 1. 最初は両方「Lo(出力)」の状態で、ピンが確実にLoであることを確認する
pioset(0x00); // 両方出力モード
rtn=i2c_wait(5);
pioput(0x00); // 両方Lo
rtn=i2c_wait(5);
// 2. まずSCL(5ピン)だけを「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする
// SDAはLo(出力)を維持したまま、SCLだけが先に「Hi」になります
pioset(0x02); // 注0x01->0x02 // bit0(SDA)=0(出力のまま), bit1(SCL)=1(入力にしてHiへ)
rtn=i2c_wait(5);
// 3. 最後にSDA(4ピン)も「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする
// 「SCLがHi」の状態で、SDAが「Lo → Hi」へ立ち上がります(ストップ条件成立)
pioset(0x03); // bit0(SDA)=1(入力にしてHiへ), bit1(SCL)=1(入力のまま)
rtn=i2c_wait(5);
}
// 1つのレジスタにデータを書き込む補助関数
void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {
i2c_start();
i2c_write_byte(slave_addr << 1); // スレーブアドレス+Writeビット(0)
i2c_write_byte(reg_addr); // 操作したいレジスタ番号
i2c_write_byte(data); // 設定データ
i2c_stop();
}
// バックライトを単独で光らせる関数
// r, g, b には 0(消灯) 〜 255(最大輝度) を指定します。
void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {
// 1. バックライトICの初期化(スレーブアドレス: 0x62)
// MODE1(レジスタ0x00) と MODE2(レジスタ0x01) を通常動作モードに設定
i2c_write_reg(0x62, 0x00, 0x00); // MODE1 を 0x00 に
i2c_write_reg(0x62, 0x01, 0x00); // MODE2 を 0x00 に
// 2. LEDの出力状態を設定(レジスタ0x08)
// 各LEDピンを「PWMによる個別輝度制御モード」に割り当てます
i2c_write_reg(0x62, 0x08, 0xAA); // LEDOUT を 0xAA に
// 3. 各色の輝度を設定(各色専用のPWMレジスタ)
// ※Grove LCDの仕様上、レジスタ2=青, 3=緑, 4=赤 に割り当てられています
i2c_write_reg(0x62, 0x04, r); // レジスタ0x04 = RED
i2c_write_reg(0x62, 0x03, g); // レジスタ0x03 = GREEN
i2c_write_reg(0x62, 0x02, b); // レジスタ0x02 = BLUE
}
// 液晶専用のミリ秒単位の長いウェイト関数
void delay_ms(int ms) {
int i, j; // volatileを削除
for(i = 0; i < ms; i++) {
for(j = 0; j < 80; j++); // 環境に合わせて1ミリ秒になるよう調整してください
}
}
// 液晶(0x3E)に「コマンド」を1バイト送る補助関数
void lcd_command(unsigned char cmd) {
i2c_start();
i2c_write_byte(0x3E << 1); // スレーブアドレス+Write(0) = 0x7C
i2c_write_byte(0x00); // コントロールバイト(0x00 = 次のバイトはコマンド)
i2c_write_byte(cmd); // コマンド本体
i2c_stop();
delay_ms(2); // 液晶の処理待ち(基本2ms空ければ安全です)
}
// 液晶文字側(0x3E)の初期化関数
void init_lcd_display() {
// 1. 電源立ち上がり直後の安定待ち
delay_ms(2);
// 2. ファンクションセット(基本設定)
// 0x38 = 8ビットモード, 2行表示, 5x8ドットフォント
lcd_command(0x38);
delay_ms(5); // 少し長めに待つ
// 3. ディスプレイON/OFF制御
// 0x0C = ディスプレイON, カーソルOFF, カーソル点滅OFF
// ※このコマンドが成功すると、薄い四角いブロック(背景)が消えます
lcd_command(0x0C);
// 4. 画面クリア
// 0x01 = ディスプレイ表示クリア(画面を真っ白にする)
lcd_command(0x01);
delay_ms(8); // クリア処理は時間がかかるため長めに待つ
// 5. エントリーモードセット
// 0x06 = 文字を書いた後、カーソルを自動で右に移動(画面スライドなし)
lcd_command(0x06);
}
// 液晶(0x3E)に文字を1文字表示する関数
void lcd_putchar(char ascii_code) {
i2c_start();
i2c_write_byte(0x3E << 1); // スレーブアドレス(0x7C)
i2c_write_byte(0x40); // コントロールバイト(0x40 = 次のバイトは文字データ)
i2c_write_byte(ascii_code); // 表示したい文字のASCIIコード
i2c_stop();
i2c_wait(5); // 液晶の書き込み待ち
}
// 連続して文字列を表示する関数
void lcd_print(char *str) {
while(*str) {
lcd_putchar(*str++);
}
}
main()
{
int rtn;
FILE* fp;
// 文字列モード:/の後は行末または/まで文字とみなす(1)//は/ 0は16進2桁やStart(S)/Stop(E)
int smode;
// HEX文字1文字目(1)
int hmode;
int i;
char instr[256];
char *r; // fgets用
char c; // 1文字ワーク
unsigned char w,hex; // ワーク、HEX1バイトワーク
// 11ピンをパラレルでオープンする
fp = fOpen("pio","a+"); //←タグの関係でoが全角大文字だが半角小文字にする
// バックライトを「白色(最大輝度)」で単独点灯させる
set_backlight_rgb(255, 255, 255);
// 液晶文字側(0x3E)の初期化関数
init_lcd_display();
// 液晶(0x3E)に文字を1文字表示する関数
lcd_putchar((char)'A');
while(1)
{
// 入力待ち
printf(">");
r = fgets(instr,sizeof(instr),stdin);
if(*r==0) exit(1); // エラー終了
if(instr[0]==0x0A) exit(1); // Enterのみでループ終了
// 文字列判定
i=0;
smode = 0; // /以降全てstrとする(1)
hmode = 0; // 数字2文字(2文字必須)でHEX(上位4ビット)を表す1文字目
hex = 0; // 1文字目の値
while(i<strlen(instr)-1) // 0A(改行)の前までループ
{
c = instr[i];
//printf("i=%02d:%02X:%02d\n",i,c,strlen(instr)+1);
if(smode == 1)
{
if(c=='/')
{
// "//"以外の場合
if(instr[i-1] != '/')
{
// /…/でsmode 解除(例/ABC/の、後の/)
smode = 0;
hmode = 0;
hex = 0;
i++;
continue;
}
// 文字として/を送りたい場合//と書く
}
rtn=i2c_write_byte(c);
if(rtn==1) exit(1); // NAK or Err
hmode = 0;
hex = 0;
i++;
continue;
}
// smode == 0
if(c=='S')
{
i2c_start();
i++;
}
else if(c=='E')
{
i2c_stop();
i++;
}
else if(c=='/')
{
smode = 1;
i++;
}
else
{
w=c-(0x30*(c<'A'))-(0x37*(c>'9'));
if((w<0)+(w>15)==0)
{
// 0-9,A-F
hex=hex*16+w;
if(hmode == 1)
{
rtn=i2c_write_byte(hex);
if(rtn==1) exit(1); // NAK or Err
hmode = 0;
hex = 0;
i++;
}
else
{
hmode = 1;
i++;
}
}
else
{
// 無視してhmodeもリセット
hmode = 0;
hex = 0;
i++;
}
} // else
} // while
} // while(1)
// 終了4ピン(SDA)、5ピン(SCL)を入力にし、プルアップ抵抗の力でHiに解放する
pioset(3);
fclose(fp); // 忘れずにcloseする
}
1010 int i2c_wait(int c) {
1020 int a,i;
1030 a=0;
1040 for(i = 0; i < c; i++) a+=i;
1050 return a;
1060 }
1070 void i2c_start() {
1080 int rtn;
1090 pioset(0x03);
1100 rtn=i2c_wait(5);
1110 pioset(0x02);
1120 rtn=i2c_wait(5);
1130 pioput(0x00);
1140 rtn=i2c_wait(5);
1150 pioset(0x00);
1160 rtn=i2c_wait(5);
1170 pioput(0x00);
1180 rtn=i2c_wait(5);
1190 }
1200 int i2c_write_byte(unsigned char data) {
1210 int i,w;
1220 int ack_bit;
1230 int rtn;
1240 unsigned char bit_val;
1250 for(i = 0; i < 8; i++) {
1260 if((data & 0x80))
1270 bit_val = 0x01;
1280 else
1290 bit_val = 0;
1300 data <<= 1;
1310 pioput(bit_val);
1320 rtn=i2c_wait(5);
1330 pioput(bit_val | 0x02);
1340 rtn=i2c_wait(5);
1350 pioput(bit_val);
1360 rtn=i2c_wait(5);
1370 }
1380 pioset(0x02);
1390 rtn=i2c_wait(5);
1400 pioput(0x02);
1410 rtn=i2c_wait(5);
1420 w = pioget();
1430 if ((w & 0x01) == 0) {
1440 ack_bit = 0;
1450 } else {
1460 ack_bit = 1;
1470 }
1480 pioput(0x00);
1490 rtn=i2c_wait(5);
1500 pioset(0x00);
1510 rtn=i2c_wait(5);
1520 return ack_bit;
1530 }
1540 void i2c_stop() {
1550 int rtn;
1560 pioset(0x00);
1570 rtn=i2c_wait(5);
1580 pioput(0x00);
1590 rtn=i2c_wait(5);
1600 pioset(0x02);
1610 rtn=i2c_wait(5);
1620 pioset(0x03);
1630 rtn=i2c_wait(5);
1640 }
1650 void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {
1660 i2c_start();
1670 i2c_write_byte(slave_addr << 1);
1680 i2c_write_byte(reg_addr);
1690 i2c_write_byte(data);
1700 i2c_stop();
1710 }
1720 void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {
1730 i2c_write_reg(0x62, 0x00, 0x00);
1740 i2c_write_reg(0x62, 0x01, 0x00);
1750 i2c_write_reg(0x62, 0x08, 0xAA);
1760 i2c_write_reg(0x62, 0x04, r);
1770 i2c_write_reg(0x62, 0x03, g);
1780 i2c_write_reg(0x62, 0x02, b);
1790 }
1800 void delay_ms(int ms) {
1810 int i, j;
1820 for(i = 0; i < ms; i++) {
1830 for(j = 0; j < 80; j++);
1840 }
1850 }
1860 void lcd_command(unsigned char cmd) {
1870 i2c_start();
1880 i2c_write_byte(0x3E << 1);
1890 i2c_write_byte(0x00);
1900 i2c_write_byte(cmd);
1910 i2c_stop();
1920 delay_ms(2);
1930 }
1940 void init_lcd_display() {
1950 delay_ms(2);
1960 lcd_command(0x38);
1970 delay_ms(5);
1980 lcd_command(0x0C);
1990 lcd_command(0x01);
2000 delay_ms(8);
2010 lcd_command(0x06);
2020 }
2030 void lcd_putchar(char ascii_code) {
2040 i2c_start();
2050 i2c_write_byte(0x3E << 1);
2060 i2c_write_byte(0x40);
2070 i2c_write_byte(ascii_code);
2080 i2c_stop();
2090 i2c_wait(5);
2100 }
2110 void lcd_print(char *str) {
2120 while(*str) {
2130 lcd_putchar(*str++);
2140 }
2150 }
2160 main()
2170 {
2180 int rtn;
2190 FILE* fp;
2200 int smode;
2210 int hmode;
2220 int i;
2230 char instr[256];
2240 char *r;
2250 char c;
2260 unsigned char w,hex;
2270 fp = fOpen("pio","a+"); //←タグの関係でoが全角大文字だが半角小文字にする2280 set_backlight_rgb(255, 255, 255);
2290 init_lcd_display();
2300 lcd_putchar((char)'A');
2310 while(1)
2320 {
2330 printf(">");
2340 r = fgets(instr,sizeof(instr),stdin);
2350 if(*r==0) exit(1);
2360 if(instr[0]==0x0A) exit(1);
2370 i=0;
2380 smode = 0;
2390 hmode = 0;
2400 hex = 0;
2410 while(i<strlen(instr)-1)
2420 {
2430 c = instr[i];
2440 if(smode == 1)
2450 {
2460 if(c=='/')
2470 {
2480 if(instr[i-1] != '/')
2490 {
2500 smode = 0;
2510 hmode = 0;
2520 hex = 0;
2530 i++;
2540 continue;
2550 }
2560 }
2570 rtn=i2c_write_byte(c);
2580 if(rtn==1) exit(1);
2590 hmode = 0;
2600 hex = 0;
2610 i++;
2620 continue;
2630 }
2640 if(c=='S')
2650 {
2660 i2c_start();
2670 i++;
2680 }
2690 else if(c=='E')
2700 {
2710 i2c_stop();
2720 i++;
2730 }
2740 else if(c=='/')
2750 {
2760 smode = 1;
2770 i++;
2780 }
2790 else
2800 {
2810 w=c-(0x30*(c<'A'))-(0x37*(c>'9'));
2820 if((w<0)+(w>15)==0)
2830 {
2840 hex=hex*16+w;
2850 if(hmode == 1)
2860 {
2870 rtn=i2c_write_byte(hex);
2880 if(rtn==1) exit(1);
2890 hmode = 0;
2900 hex = 0;
2910 i++;
2920 }
2930 else
2940 {
2950 hmode = 1;
2960 i++;
2970 }
2980 }
2990 else
3000 {
3010 hmode = 0;
3020 hex = 0;
3030 i++;
3040 }
3050 }
3060 }
3070 }
3080 pioset(3);
3090 fclose(fp);
3100 }
2026年 06月 16日
[PC-G850V] ポケコンでI2C通信 実機動作 + Cソース (6/16)
// 保持時間用のウェイト関数(長めにとっています)
int i2c_wait(int c) {
int a,i; // コンパイラ最適化防止のvolatileがないのでa+=i;returnで代用
a=0;
for(i = 0; i < c; i++) a+=i;
return a;
}
// I2C スタート条件を出力する関数
void i2c_start() {
int rtn;
// 1. 初期状態:両方のピンを入力に設定し、プルアップ抵抗で確実に「Hi」にする
pioset(0x03); // bit0(SDA)=1, bit1(SCL)=1 を入力に
rtn=i2c_wait(5);
// 2. 先に「出力」に切り替えてから、SDA(4ピン)を「Lo」に落とす
// SCLは入力(Hi)を維持したまま、SDAだけが「Hi → Lo」になります(スタート条件)
pioset(0x02); // bit0(SDA)=0(出力), bit1(SCL)=1(入力のままHi)
pioput(0x00); // bit0(SDA)=0(Loに落とす)
rtn=i2c_wait(5);
// 3. 次にSCL(5ピン)も「出力」に切り替えて「Lo」に落とす
// これで両方のピンがLoに固定され、データ送信の準備が整います
pioset(0x00); // bit1(SCL)も0(出力)にする
pioput(0x00); // bit1(SCL)=0(Loに落とす)
rtn=i2c_wait(5);
}
// 1バイトデータを送信し、液晶からのACK(0=成功, 1=失敗)を返す関数
// ※事前のスタート条件により、SCL=Lo, SDA=Lo (両方出力) から始まる前提です
int i2c_write_byte(unsigned char data) {
int i,w;
int ack_bit;
int rtn;
unsigned char bit_val;
// --- 1〜8ビット目のデータ送信ループ ---
for(i = 0; i < 8; i++) {
// MSBファースト(最上位ビットから順に)データを取り出す
// 送るビットが1ならHi(0x01)、0ならLo(0x00)
if((data & 0x80))
bit_val = 0x01;
else
bit_val = 0;
// bit_val = (data & 0x80) ? 0x01 : 0x00;→三項演算子がないので
data <<= 1; // 次のビットのために左シフト
// SCL=Loの状態で、SDAの出力を変更する
pioput(bit_val);
rtn=i2c_wait(5);
// SCLをHiにして液晶にデータを読み込ませる
// (SCLを1にするために、入力(開放)ではなく、出力のままHiにするのが確実です)
// ※bit1(SCL)を1にするため、SDAの状態(bit0)と合わせる
pioput(bit_val | 0x02);
rtn=i2c_wait(5);
// SCLをLoに戻す
pioput(bit_val);
rtn=i2c_wait(5);
}
// --- 9ビット目:液晶からのACK(応答)を確認する処理 ---
// 1. まずSDA(4ピン/bit0)を入力モードに切り替えて、液晶が自由にSDAをLoにできるようにする
// SCL(5ピン/bit1)は出力モード(0)のまま維持します
pioset(0x02); // bit0=1(入力), bit1=0(出力)
rtn=i2c_wait(5);
// 2. クロック(SCL)をHiにする
pioput(0x02); // bit1(SCL)=1
rtn=i2c_wait(5);
// 3. この「SCLがHi」のタイミングで、液晶がSDAをLoに引き下げているかをpiogetで確認する
// bit0(SDA)が0(Lo)なら液晶が正常にデータを受け取った合図(ACK)です
w = pioget();
if ((w & 0x01) == 0) {
ack_bit = 0; // ACK成功(正常)
} else {
ack_bit = 1; // NACK失敗
}
// 4. クロック(SCL)をLoに戻す
pioput(0x00); // bit1(SCL)=0
rtn=i2c_wait(5);
// 5. 次の通信に備えて、SDA(4ピン)を再び出力モード(0)に戻しておく
pioset(0x00); // 両方出力モードへ
rtn=i2c_wait(5);
return ack_bit; // 0なら液晶が正しく認識しています
}
// I2C ストップ条件を出力する関数
void i2c_stop() {
int rtn;
// 1. 最初は両方「Lo(出力)」の状態で、ピンが確実にLoであることを確認する
pioset(0x00); // 両方出力モード
pioput(0x00); // 両方Lo
rtn=i2c_wait(5);
// 2. まずSCL(5ピン)だけを「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする
// SDAはLo(出力)を維持したまま、SCLだけが先に「Hi」になります
pioset(0x02);/* 0x01->0x02 */ // bit0(SDA)=0(出力のまま), bit1(SCL)=1(入力にしてHiへ)
rtn=i2c_wait(5);
// 3. 最後にSDA(4ピン)も「入力」に切り替えて、プルアップ抵抗の力で「Hi」にする
// 「SCLがHi」の状態で、SDAが「Lo → Hi」へ立ち上がります(ストップ条件成立)
pioset(0x03); // bit0(SDA)=1(入力にしてHiへ), bit1(SCL)=1(入力のまま)
rtn=i2c_wait(5);
}
// 1つのレジスタにデータを書き込む補助関数
void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {
i2c_start();
i2c_write_byte(slave_addr << 1); // スレーブアドレス+Writeビット(0)
i2c_write_byte(reg_addr); // 操作したいレジスタ番号
i2c_write_byte(data); // 設定データ
i2c_stop();
}
// バックライトを単独で光らせる関数
// r, g, b には 0(消灯) 〜 255(最大輝度) を指定します。
void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {
// 1. バックライトICの初期化(スレーブアドレス: 0x62)
// MODE1(レジスタ0x00) と MODE2(レジスタ0x01) を通常動作モードに設定
i2c_write_reg(0x62, 0x00, 0x00); // MODE1 を 0x00 に
i2c_write_reg(0x62, 0x01, 0x00); // MODE2 を 0x00 に
// 2. LEDの出力状態を設定(レジスタ0x08)
// 各LEDピンを「PWMによる個別輝度制御モード」に割り当てます
i2c_write_reg(0x62, 0x08, 0xAA); // LEDOUT を 0xAA に
// 3. 各色の輝度を設定(各色専用のPWMレジスタ)
// ※Grove LCDの仕様上、レジスタ2=青, 3=緑, 4=赤 に割り当てられています
i2c_write_reg(0x62, 0x04, r); // レジスタ0x04 = RED
i2c_write_reg(0x62, 0x03, g); // レジスタ0x03 = GREEN
i2c_write_reg(0x62, 0x02, b); // レジスタ0x02 = BLUE
}
// 液晶専用のミリ秒単位の長いウェイト関数
void delay_ms(int ms) {
int i, j; // volatileを削除
for(i = 0; i < ms; i++) {
for(j = 0; j < 80; j++); // 環境に合わせて1ミリ秒になるよう調整してください
}
}
// 液晶(0x3E)に「コマンド」を1バイト送る補助関数
void lcd_command(unsigned char cmd) {
i2c_start();
i2c_write_byte(0x3E << 1); // スレーブアドレス+Write(0) = 0x7C
i2c_write_byte(0x00); // コントロールバイト(0x00 = 次のバイトはコマンド)
i2c_write_byte(cmd); // コマンド本体
i2c_stop();
delay_ms(5); // 液晶の処理待ち(基本2ms空ければ安全です)
}
// 液晶文字側(0x3E)の初期化関数
void init_lcd_display() {
// 1. 電源立ち上がり直後の安定待ち
delay_ms(2);
// 2. ファンクションセット(基本設定)
// 0x38 = 8ビットモード, 2行表示, 5x8ドットフォント
lcd_command(0x38);
delay_ms(5); // 少し長めに待つ
// 3. ディスプレイON/OFF制御
// 0x0C = ディスプレイON, カーソルOFF, カーソル点滅OFF
// ※このコマンドが成功すると、薄い四角いブロック(背景)が消えます
lcd_command(0x0C);
// 4. 画面クリア
// 0x01 = ディスプレイ表示クリア(画面を真っ白にする)
lcd_command(0x01);
delay_ms(5); // クリア処理は時間がかかるため長めに待つ
// 5. エントリーモードセット
// 0x06 = 文字を書いた後、カーソルを自動で右に移動(画面スライドなし)
lcd_command(0x06);
}
// 液晶(0x3E)に文字を1文字表示する関数
void lcd_putchar(char ascii_code) {
i2c_start();
i2c_write_byte(0x3E << 1); // スレーブアドレス(0x7C)
i2c_write_byte(0x40); // コントロールバイト(0x40 = 次のバイトは文字データ)
i2c_write_byte(ascii_code); // 表示したい文字のASCIIコード
i2c_stop();
i2c_wait(5); // 液晶の書き込み待ち
}
// 連続して文字列を表示する関数
void lcd_print(char *str) {
while(*str) {
lcd_putchar(*str++);
}
}
main()
{
FILE* fp;
// 11ピンをパラレルでオープンする
fp = fOpen("pio","a+");→(ここはタグの関係でoが全角大文字→半角小文字にする)
// バックライトを「白色(最大輝度)」で単独点灯させる
set_backlight_rgb(255, 255, 255);
// 液晶文字側(0x3E)の初期化関数
init_lcd_display();
// 液晶(0x3E)に文字を1文字表示する関数
lcd_putchar((char)'A');
// 4ピン(SDA)、5ピン(SCL)を入力にし、プルアップ抵抗の力でHiに解放する
pioset(3);
fclose(fp); // 忘れずにcloseする
}
1010 int i2c_wait(int c) {
1020 int a,i;
1030 a=0;
1040 for(i = 0; i < c; i++) a+=i;
1050 return a;
1060 }
1070 void i2c_start() {
1080 int rtn;
1090 pioset(0x03);
1100 rtn=i2c_wait(5);
1110 pioset(0x02);
1120 pioput(0x00);
1130 rtn=i2c_wait(5);
1140 pioset(0x00);
1150 pioput(0x00);
1160 rtn=i2c_wait(5);
1170 }
1180 int i2c_write_byte(unsigned char data) {
1190 int i,w;
1200 int ack_bit;
1210 int rtn;
1220 unsigned char bit_val;
1230 for(i = 0; i < 8; i++) {
1240 if((data & 0x80))
1250 bit_val = 0x01;
1260 else
1270 bit_val = 0;
1280 data <<= 1;
1290 pioput(bit_val);
1300 rtn=i2c_wait(5);
1310 pioput(bit_val | 0x02);
1320 rtn=i2c_wait(5);
1330 pioput(bit_val);
1340 rtn=i2c_wait(5);
1350 }
1360 pioset(0x02);
1370 rtn=i2c_wait(5);
1380 pioput(0x02);
1390 rtn=i2c_wait(5);
1400 w = pioget();
1410 if ((w & 0x01) == 0) {
1420 ack_bit = 0;
1430 } else {
1440 ack_bit = 1;
1450 }
1460 pioput(0x00);
1470 rtn=i2c_wait(5);
1480 pioset(0x00);
1490 rtn=i2c_wait(5);
1500 return ack_bit;
1510 }
1520 void i2c_stop() {
1530 int rtn;
1540 pioset(0x00);
1550 pioput(0x00);
1560 rtn=i2c_wait(5);
1570 pioset(0x02);
1580 rtn=i2c_wait(5);
1590 pioset(0x03);
1600 rtn=i2c_wait(5);
1610 }
1620 void i2c_write_reg(unsigned char slave_addr, unsigned char reg_addr, unsigned char data) {
1630 i2c_start();
1640 i2c_write_byte(slave_addr << 1);
1650 i2c_write_byte(reg_addr);
1660 i2c_write_byte(data);
1670 i2c_stop();
1680 }
1690 void set_backlight_rgb(unsigned char r, unsigned char g, unsigned char b) {
1700 i2c_write_reg(0x62, 0x00, 0x00);
1710 i2c_write_reg(0x62, 0x01, 0x00);
1720 i2c_write_reg(0x62, 0x08, 0xAA);
1730 i2c_write_reg(0x62, 0x04, r);
1740 i2c_write_reg(0x62, 0x03, g);
1750 i2c_write_reg(0x62, 0x02, b);
1760 }
1770 void delay_ms(int ms) {
1780 int i, j;
1790 for(i = 0; i < ms; i++) {
1800 for(j = 0; j < 80; j++);
1810 }
1820 }
1830 void lcd_command(unsigned char cmd) {
1840 i2c_start();
1850 i2c_write_byte(0x3E << 1);
1860 i2c_write_byte(0x00);
1870 i2c_write_byte(cmd);
1880 i2c_stop();
1890 delay_ms(5);
1900 }
1910 void init_lcd_display() {
1920 delay_ms(2);
1930 lcd_command(0x38);
1940 delay_ms(5);
1950 lcd_command(0x0C);
1960 lcd_command(0x01);
1970 delay_ms(5);
1980 lcd_command(0x06);
1990 }
2000 void lcd_putchar(char ascii_code) {
2010 i2c_start();
2020 i2c_write_byte(0x3E << 1);
2030 i2c_write_byte(0x40);
2040 i2c_write_byte(ascii_code);
2050 i2c_stop();
2060 i2c_wait(5);
2070 }
2080 void lcd_print(char *str) {
2090 while(*str) {
2100 lcd_putchar(*str++);
2110 }
2120 }
2130 main()
2140 {
2150 FILE* fp;
2160 fp = fOpen("pio","a+");→(ここはタグの関係でoが全角大文字→半角小文字にする)
2170 set_backlight_rgb(255, 255, 255);
2180 init_lcd_display();
2190 lcd_putchar((char)'A');
2200 pioset(3);
2210 fclose(fp);
2220 }
![[PC-G850V] ポケコンでI2C通信 実機動作 + Cソース (6/16)_a0034780_04234148.png](https://pds.exblog.jp/pds/1/202606/16/80/a0034780_04234148.png)
![[PC-G850V] ポケコンでI2C通信 実機動作 + Cソース (6/16)_a0034780_04234772.png](https://pds.exblog.jp/pds/1/202606/16/80/a0034780_04234772.png)
![[PC-G850V] ポケコンでI2C通信 実機動作 + Cソース (6/16)_a0034780_04482745.png](https://pds.exblog.jp/pds/1/202606/16/80/a0034780_04482745.png)
![[PC-G850V] ポケコンでI2C通信 実機動作 + Cソース (6/16)_a0034780_03010363.png](https://pds.exblog.jp/pds/1/202606/15/80/a0034780_03010363.png)

