参考
↓クリック↓
↑クリック↑
x あまり正確でない
x 時間合わせは、別
x 過去ログを見ょ!!!
目的
低性能(小規模マイコン)で300円程度の液晶を使って時計を作って遊ぶ。
いろいろ
ちょつとだけ高速化
//定義
#define DW(aa,bb) PORTD=((bb==0)?PORTD&~(1<<aa):PORTD|(1<<aa))
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
結果
プログラム
//ssd1306_block_date_tate1_UNO_1
//インクルド
#include <Arduino.h>
#include <Wire.h> //I2C
//定義
//GPIO
#define GPIO_RESET_P 2 //RESET=1
#define GPIO_RS_P A3 //RS=0
#define GPIO_WR_P 3 //WR=1
#define GPIO_RD_P A2 //RD=1
#define GPIO_DB7 8
#define GPIO_DB6 7
#define GPIO_DB5 9
#define GPIO_DB4 6
#define GPIO_DB3 A0
#define GPIO_DB2 5
#define GPIO_DB1 A1
#define GPIO_DB0 4
// GPIO A4 I2Cで使用済み
// GPIO A5 I2Cで使用済み
#define GPIO1(s) digitalWrite(GPIO_RESET_P , s) //RESET
#define GPIO2(s) digitalWrite(GPIO_RS_P , s) //A0
#define GPIO3(s) digitalWrite(GPIO_WR_P , s) //WR
#define GPIO4(s) digitalWrite(GPIO_RD_P , s) //RD
//全体のカラー
int s_color = 0xFFFF; //ハイホワイト
//パターンRAM 16x20ドット
int s_dot[20][16];
//キャラクターパターンROM
//1234567890
uint8_t ch_data7[8 * (10 + 1)] = {
0x70, 0x88, 0x98, 0xa8, 0xc8, 0x70, 0x00, 0x00, //( 48) 0
0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x00, 0x00, //( 49) 1
0x70, 0x88, 0x08, 0x30, 0x40, 0xf8, 0x00, 0x00, //( 50) 2
0x70, 0x88, 0x30, 0x08, 0x88, 0x70, 0x00, 0x00, //( 51) 3
0x18, 0x28, 0x48, 0x88, 0xf8, 0x08, 0x00, 0x00, //( 52) 4
0xf8, 0x80, 0xf0, 0x08, 0x08, 0xf0, 0x00, 0x00, //( 53) 5
0x78, 0x80, 0xf0, 0x88, 0x88, 0x70, 0x00, 0x00, //( 54) 6
0xf8, 0x08, 0x10, 0x20, 0x20, 0x20, 0x00, 0x00, //( 55) 7
0x70, 0x88, 0x70, 0x88, 0x88, 0x70, 0x00, 0x00, //( 56) 8
0x70, 0x88, 0x78, 0x08, 0x88, 0x70, 0x00, 0x00, //( 57) 9
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00 //( 46) .
};
//キャラクターRAM 2x3文字
char st_p[3][2] = {
{'4', '6'},
{'4', '6'},
{'4', '6'}
};
//colorアトリビュートRAM 2x3文字
int c_att[3][2] = {
{0xF800, 0x07E0},
{0xF800, 0x07E0},
{0xF800, 0x07E0 }
};
//パラレルポートにデータをセットする。
void GPIO_8BIT(int s)
{
digitalWrite(GPIO_DB7, (s >> 7) & 0x01); //DB7
digitalWrite(GPIO_DB6, (s >> 6) & 0x01); //DB6
digitalWrite(GPIO_DB5, (s >> 5) & 0x01); //DB5
digitalWrite(GPIO_DB4, (s >> 4) & 0x01); //DB4
digitalWrite(GPIO_DB3, (s >> 3) & 0x01); //DB3
digitalWrite(GPIO_DB2, (s >> 2) & 0x01); //DB2
digitalWrite(GPIO_DB1, (s >> 1) & 0x01); //DB1
digitalWrite(GPIO_DB0, s & 0x01); //DB0
} //GPIO_8BIT
//コマンドの書き込み
void LCD_Write_CMD(int a)
{
GPIO2(0); //A0=0;
GPIO_8BIT(a);//P1=a; data
GPIO3(0);//WRB=0;
GPIO3(1);//WRB=1;
} //LCD_Write_CMD
//データ書き込み
void LCD_Write_Data(int a)
{
GPIO2(1);//A0=1;
GPIO_8BIT(a);//P1=a; data
GPIO3(0);//WRB=0;
GPIO3(1);//WRB=1;
} //LCD_Write_Data
//液晶の初期化処理
void ATM0177B5_ST7735S_Init(void)
{
//---------- ST7735S Reset Sequence --------//
GPIO1(1);//LCD_RESET=1;
delay(1); //Delay 1ms
GPIO1(0);//LCD_RESET=0;
delay(1); //Delay 1ms
GPIO1(1);//LCD_RESET=1;
delay(120); //Delay 120ms
//---------- ST7735S Reset Sequence --------//
LCD_Write_CMD(0x01);//SOFTWARE RESET
delay(50);
LCD_Write_CMD(0x11);//SLEEP OUT
delay(200);
LCD_Write_CMD(0x29);//display on
delay(100);
LCD_Write_CMD(0x3a);//Interface pixel format
LCD_Write_Data(0x05);//16bit mode
delay(100);
LCD_Write_CMD(0x36);//RGB-RGR format
LCD_Write_Data(0x08);//RGB mode
delay(100);
// y,x パターンRAMの初期化
for (int y = 0; y < 20; y++) {
for (int x = 0; x < 16; x++) {
s_dot[y][x] = 0;
}//for x
}//for y
} //ATM0177B5_ST7735S_Init
//全体のカラーの変更
void set_color(int color) {
s_color = color;
}//set_color
//キャラクターRAMの内容をパターンRAMに描画
void c_ram_refresh() {
int p; //一時領域
for (int jj = 0; jj < 3; jj++) { //行のループ
for (int ii = 0; ii < 2; ii++) { //列のループ
//キャラクターの描画
for (int y = 0; y < 6; y++) {
p = ch_data7[ ( ( st_p[jj][ii] - '0' ) * 8) + y ];
for (int x = 0; x < 5; x++) {
//s_dot[x + (ii * 6) + 1][(14 - (jj * 7)) - y]
s_dot[(jj * 7) + y][(ii * (6 + 1) ) + x + 2]
= ((p & 0x80) == 0) ? 0 : c_att[jj][ii];
p = p << 1;
}//for x
}//for y
}//for ii
}//for jj
}//c_ram_refresh
//定義
#define DW(aa,bb) PORTD=((bb==0)?PORTD&~(1<<aa):PORTD|(1<<aa))
//パターンRAMの内容を液晶に転送
void p_ram_refresh() {
//カラーの上位と下位と一時
int color_h;
int color_l;
int color_vel;
//画面の書き込み開始
LCD_Write_CMD(0x2C); //memory write
GPIO2(1);//A0=1;
delay(2);
for (int y = 0; y < 20; y++) {
for (int k = 0; k < 7; k++) {
for (int x = 0; x < 16; x++) {
for (int i = 0; i < 7; i++) {
color_vel = s_dot[y][x];
if ( color_vel != 0) {//ドットがあり
color_h = (color_vel >> 8) & 0xff;
color_l = color_vel & 0xff;
GPIO_8BIT( color_h );//P1=a; data
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
GPIO_8BIT( color_l );//P1=a; data
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
} else {//ドットがなし
GPIO_8BIT(0x00);//P1=a; data
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
}//end if
}//for 8
GPIO_8BIT(0x00);//P1=a; data
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
}//for 16
}//for 7
for (int i = 0; i < 128; i++) {//空白を1ライン引く
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
DW(GPIO_WR_P,0); //GPIO3(0);//WRB=0;
DW(GPIO_WR_P,1); //GPIO3(1);//WRB=1;
}//for i
}//for tt
}//p_ram_refresh
//リフレッシュ(画像の再表示)
void refresh() {
c_ram_refresh();//キャラクターRAMの反映
p_ram_refresh();//パターンRAMの反映
}//refresh
//初期化
void setup() {
//i2cの初期化処理
Wire.begin(); // 13 15 M5S3
//ポートのモード設定
//アウトプットモード
pinMode(GPIO_RESET_P, OUTPUT); //REST
pinMode(GPIO_RS_P, OUTPUT); //RS
pinMode(GPIO_WR_P, OUTPUT); //WR
pinMode(GPIO_RD_P, OUTPUT); //RD
pinMode(GPIO_DB0, OUTPUT); //DB0
pinMode(GPIO_DB1, OUTPUT); //DB1
pinMode(GPIO_DB2, OUTPUT); //DB2
pinMode(GPIO_DB3, OUTPUT); //DB3
pinMode(GPIO_DB4, OUTPUT); //DB4
pinMode(GPIO_DB5, OUTPUT); //DB5
pinMode(GPIO_DB6, OUTPUT); //DB6
pinMode(GPIO_DB7, OUTPUT); //DB7
//ポートの初期化
GPIO4(1);//RD=1
GPIO3(0);//WR=0
GPIO2(0);//RS=0
GPIO1(1);//RESET=1
delay(500); //0.5秒待つ
//液晶の初期化処理
ATM0177B5_ST7735S_Init();
} //setup
//メインループ
void loop() {
//RTCの開始 ↓
//RTC DS1307のアドレス
#define ADDR 0x68 // 2進数 1101000
// レジスタのアドレスを先頭にする
Wire.beginTransmission(ADDR);
Wire.write(0x00);
Wire.endTransmission();
delay(1);
// I2Cスレーブに8byteのレジスタデータを要求する
Wire.requestFrom(ADDR, 8);
// 8byteのデータを取得する
unsigned char data_read[16] = {0x88, 0x88, 0x88}; //データバッファー
int ii = 0;
while (Wire.available()) { // 要求より短いデータが来る可能性あり
data_read[ii++] = Wire.read(); // 1バイトを受信
}//while
//RTCの終了 ↑
//dbug [2]は、時間 [1]は、分
//unsigned char data_read[16];
//data_read[2] = 0x01; data_read[1] = 0x23; data_read[0] = 0x45;
//表示変換する
//1行目 時
st_p[0][0] = '0' + (data_read[2] >> 4); //0 時 上位
st_p[0][1] = '0' + (data_read[2] & 0xf); //1 時 下位
//2行目 分
st_p[1][0] = '0' + (data_read[1] >> 4); //2 分 上位
st_p[1][1] = '0' + (data_read[1] & 0xf); //3 分 下位
//3行目 秒
st_p[2][0] = '0' + (data_read[0] >> 4); //4 秒 上位
st_p[2][1] = '0' + (data_read[0] & 0xf); //5 秒 下位
refresh(); //画面の再表示
//delay(200); //0.2秒待つ
} //loop