理系フリマがある
x 過去ログを見よ
x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!
目的
ソフトウェアI2Cで遊ぶ
結果
文字の「0」を出力する時のイメージ
プログラム
//Soft_I2C_AQM0802A_DEMO1_M5S3
//定義
//A5
#define SCK_0 15
#define SCK_0_HIGH() digitalWrite(SCK_0, HIGH)
#define SCK_0_LOW() digitalWrite(SCK_0, LOW)
//A4
#define SDA_0 13
#define SDA_0_HIGH() digitalWrite(SDA_0, HIGH)
#define SDA_0_LOW() digitalWrite(SDA_0, LOW)
// 1000us 1kh
// 100us 10kh
// 10us 100kh
#define myDelay() delayMicroseconds(100);
//i2cバッファー
char data_read[4];
//初期レジスター
char INIT_com[] = {
0x0, 0x38, //1
0x0, 0x39, //2
0x0, 0x4, //3
0x0, 0x14, //4
0x0, 0x70, //5
0x0, 0x56, //6
0x0, 0x6C, //7
0x0, 0x38, //8
0x0, 0xC //9
};
//画面のクリアレジスター
char INIT_cls[] = {0x0, 0x1};
//i2c書き込みルーチン
void i2c_lcd_w(char *buff1) {
int add_p = 0x7C;
int data_p = ( (buff1[0] < 0) ? 256 + buff1[0] : buff1[0] );
int data_q = ( (buff1[1] < 0) ? 256 + buff1[1] : buff1[1] );
int ii;
//待ち
SDA_0_HIGH();
SCK_0_HIGH();
myDelay();
myDelay();
myDelay();
//START
SDA_0_LOW();
myDelay();
SCK_0_LOW();
myDelay();
for (ii = 0; ii < 8; ii++) {
SCK_0_LOW();
if ( ((add_p << ii) & 0x80) == 0 ) {
SDA_0_LOW();
} else {
SDA_0_HIGH();
}//endif
myDelay();
SCK_0_HIGH();
myDelay();
}//for
//ack
SCK_0_LOW();
SDA_0_HIGH();
myDelay();
SCK_0_HIGH();
myDelay();
for (ii = 0; ii < 8; ii++) {
SCK_0_LOW();
if ( ((data_p << ii) & 0x80) == 0 ) {
SDA_0_LOW();
} else {
SDA_0_HIGH();
}//endif
myDelay();
SCK_0_HIGH();
myDelay();
}//for
//ack
SCK_0_LOW();
SDA_0_HIGH();
myDelay();
SCK_0_HIGH();
myDelay();
for (ii = 0; ii < 8; ii++) {
SCK_0_LOW();
if ( ((data_q << ii) & 0x80) == 0 ) {
SDA_0_LOW();
} else {
SDA_0_HIGH();
}//endif
myDelay();
SCK_0_HIGH();
myDelay();
}//for
//ack
SCK_0_LOW();
SDA_0_HIGH();
myDelay();
SCK_0_HIGH();
myDelay();
//STOP
SCK_0_LOW();
SDA_0_LOW();
myDelay();
SCK_0_HIGH();
myDelay();
SDA_0_HIGH();
myDelay();
}//i2c_lcd_w
void ns_putc(char ch)
{
data_read[0] = '@';
data_read[1] = ch;
//I2Cに送信
i2c_lcd_w(data_read);
}//ns_putc
void ns_puts(const char *str1)
{
//文字の中身がゼロか
while (*str1) {
//一文字出力
ns_putc(*str1 ++);
}//while
}//ns_puts
//カーソルの移動
void setCursor(int col, int rows)
{
data_read[0] = 0x0;
data_read[1] = 0x80 + (rows * 0x40) + col ; //カーソルを移動
//I2Cに送信
i2c_lcd_w(data_read);
}//setCursor
void Soft_I2C_begin() {
pinMode(SCK_0, OUTPUT_OPEN_DRAIN);
pinMode(SDA_0, OUTPUT_OPEN_DRAIN);
digitalWrite(SCK_0, HIGH);
digitalWrite(SDA_0, HIGH);
}//Soft_I2C_begin
//初期化関数
void setup()
{
//I2Cの初期化
Soft_I2C_begin();
//液晶の初期化
for (int ii = 0; ii < 9; ii++) {
i2c_lcd_w(&INIT_com[ii << 1]); // ii << 1 = ii * 2
}//for
//画面のクリア
i2c_lcd_w(INIT_cls);
//表示
setCursor(0, 0); ns_puts("HELLO");
setCursor(0, 1); ns_puts("WORLD");
}//setup
//メインループ
void loop()
{}//loop