sda0=0 --MOSI(SDO)
scl0=1 --MISO(SDI)
PIO_MODE = 0x00 --ピン入出力変数(触らないこと)
PIO_DATA = 0x00 --ピン状態変数(触らないこと)
HIGH = 0x1 --定数
LOW = 0x0 --定数
INPUT = 0x0 --定数
OUTPUT = 0x1 --定数
function delay(t)
sleep(t)
end
function digitalWrite(port,dat)
local mask = bit32.lshift(1,port)
local nmask = bit32.bnot (mask)
if(dat == LOW) then
PIO_DATA = bit32.band(PIO_DATA, nmask)
else
PIO_DATA = bit32.bor(PIO_DATA, mask)
end
return fa.pio(PIO_MODE,PIO_DATA)
end
function digitalRead(port)
local PIO_STATUS = 0
local mask = bit32.lshift(1,port)
PIO_STATUS, PIO_INFO = fa.pio(PIO_MODE, PIO_DATA)
if(bit32.btest (PIO_INFO,mask)) then
return HIGH, PIO_STATUS
end
return LOW, PIO_STATUS
--(IF文や他の関数に直接突っ込めるよう、第一引数にポート状態を置いてある)
end
function pinMode(port,mode)
local mask = bit32.lshift(1,port)
local nmask = bit32.bnot (mask)
if (mode == OUTPUT) then
PIO_MODE = bit32.bor(PIO_MODE, mask)
else
PIO_MODE = bit32.band(PIO_MODE, nmask)
end
return fa.pio(PIO_MODE,PIO_DATA)
end
dW = digitalWrite
dR = digitalRead
pM = pinMode
function I2C_START()
digitalWrite(sda0,LOW);
digitalWrite(scl0,LOW);
pinMode(scl0,INPUT);
pinMode(sda0,INPUT);
pinMode(scl0,INPUT);
pinMode(sda0,OUTPUT);
pinMode(scl0,OUTPUT);
pinMode(sda0,OUTPUT);
end
function I2C_STOP()
digitalWrite(sda0,LOW);
digitalWrite(scl0,LOW);
pinMode(scl0,INPUT);
pinMode(sda0,OUTPUT);
pinMode(scl0,INPUT);
pinMode(sda0,INPUT);
end
function I2C_ADR(a,x)
local t = bit32.lshift(a,1)
t = bit32.band(t,0xFE)
t = bit32.bor(t,x)
return I2C_WRITE(t);
end
function I2C_WRITE(d)
digitalWrite(sda0,LOW);
digitalWrite(scl0,LOW);
pinMode(scl0,OUTPUT);
for i=0,7 do
x = bit32.lshift(d,i)
if(bit32.btest(x,0x80)) then
pinMode(sda0,INPUT);
else
pinMode(sda0,OUTPUT);
end
pinMode(scl0,INPUT);
pinMode(scl0,OUTPUT);
end
pinMode(sda0,INPUT);
local ack = digitalRead(sda0);
pinMode(scl0,INPUT); --アクノリッジ
pinMode(scl0,OUTPUT);
return ack;
end
function I2C_READ(d)
local dat = 0;
digitalWrite(sda0,LOW);
digitalWrite(scl0,LOW);
pinMode(scl0,OUTPUT);
pinMode(sda0,INPUT);
for i=0,7 do
pinMode(scl0,INPUT); --変化確定
--読み出し処理を入れる
dat = bit32.bleft(dat,1);
if(digitalRead(sda0) == HIGH)then
dat = bit32.bor(dat,1)
end
pinMode(scl0,OUTPUT); --相手変化
end
pinMode(sda0,OUTPUT);--アクノリッジ送出
pinMode(scl0,INPUT); --アクノリッジ確定
pinMode(scl0,OUTPUT);
return dat;
end
function i2c_print(s)
local sl = string.len(s);
I2C_START();
I2C_ADR(0x3E,0); --READ/WRITE
I2C_WRITE(0x40);
for i=1,sl do
local c = string.byte(s,i);
I2C_WRITE(c);
end
I2C_STOP();
end
digitalWrite(sda0,LOW);
digitalWrite(scl0,LOW);
pinMode(sda0,INPUT);
pinMode(scl0,INPUT);
--初期化
I2C_START();
I2C_ADR(0x3E,0); --READ/WRITE
I2C_WRITE(0x00);
I2C_WRITE(0x38);
I2C_WRITE(0x39);
I2C_WRITE(0x14);
I2C_WRITE(0x70);
I2C_WRITE(0x56);
I2C_WRITE(0x6c);
I2C_STOP();
delay(100);
I2C_START();
I2C_ADR(0x3E,0); --READ/WRITE
I2C_WRITE(0x00);
I2C_WRITE(0x38);
I2C_WRITE(0x0d);
I2C_WRITE(0x01);
I2C_STOP();
--完了
delay(100);
i2c_print("I2C LCD");
--下段に移動
I2C_START();
I2C_ADR(0x3E,0); --READ/WRITE
I2C_WRITE(0x00);
I2C_WRITE(0xC0);
I2C_STOP();
i2c_print("FlashAir");
print("OK")
コメントをかく