atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
yskwiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
yskwiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
yskwiki
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • yskwiki
  • AVR
  • ATTiny2313でキャラクタ液晶を使う

yskwiki

ATTiny2313でキャラクタ液晶を使う

最終更新:2012年09月07日 23:05

yskwiki

- view
管理者のみ編集可
  • はじめに
  • LCD接続
  • ソースコード
  • 今後やりたいこと

はじめに

買ったまま長いこと塩漬けになってたキャラクタ液晶(SC1602BS*B)を使ってみました。配線がごちゃごちゃしてるので、写真は載せませんw
LCDキャラクタディスプレイモジュール(16×2行バックライト無) 1個 ¥500(税込)(2012/09/07時点)
  • http://akizukidenshi.com/catalog/g/gP-00040/
2012.09.07 新規作成、初版

LCD接続

ATTiny2313とLCDの接続はこんな感じにしました。
ピン 名称 接続先 ピン 名称 接続先
1 VDD 5V 8 DB1 open
2 GND GND 9 DB2 open
3 Cont. 可変抵抗 10 DB3 open
4 RS PB6 11 DB4 PB0
5 R/W PB5 12 DB5 PB1
6 EN PB4 13 DB6 PB2
7 DB0 open 14 DB7 PB3
このLCDは14本のピンのうち8本(DB0〜DB7)がデータ入出力用となっていますが、8bitモードと4bitモードがあり、4bitモードの場合は4本のピン(DB4〜DB7)をデータ入出力用として使用します。早くアクセスした場合は8bitモードを使用するんでしょうが、今回は使用ピン数の少ない4bitモードにします。

ソースコード

C版(1つのファイルにまとめてあります)
tn2313_lcd_test_c.c
関数 引数 説明
uint8_t lcd_read(uint8_t rs) rs:MODE_CMD(コマンドリード),MODE_DAT(データリード) LCDリード
戻り値はリード値(8bit)
★void lcd_pol() - BusyFlag解除待ち
★void lcd_write (uint8_t rs, uint8_t val) rs:MODE_CMD(コマンドライト),MODE_DAT(データライト)
val:ライトする値(下位4bitのみ使用)
LCDライト
void lcd_cmd(uint8_t cmd) cmd:コマンドの値 コマンド実行
void lcd_data(uint8_t data) data:文字 文字を1つライト
void lcd_clear() - 液晶をクリア
void lcd_init() - 液晶を初期化
void lcd_putstr(char *str) *str:文字列の先頭アドレス *str位置から'\0'までライト
以下はマクロとして定義
#define LcdMoveto1stLine(n) n:位置 カーソルを1行目のn桁目に移動
lcd_cmd(0x80+n)のalias
#define LcdMoveto2ndLine(n) n:位置 カーソルを2行目のn桁目に移動
lcd_cmd(0xC0+n)のalias
★の関数は基本的に直接呼び出すことは無いと思います。

10MHz用に作ってあるので、他の(特に10MHzよりも速い)周波数で動かす場合は、時間を調整する必要があります。10MHzより遅い周波数で動かす場合は特に変更しなくても動作すると思いますが、初期化時間が長くなります。
  • 要変更箇所
    • delay_100us()関数:引数*100us待機する関数。動作周波数に合わせて変更する必要があります。
    • lcd_read()/lcd_write()関数:制御信号(RS,R/W,EN)のタイミングを調整する必要があります。

LCD用の関数内ではAVR依存の記述は無いと思うので、defineとdelay_100us()関数を変更すればPICでも動くと思います。僕はPICのライタを持ってないので試せませんがw

  • ソースコードコピペ
#include <stdint.h>
#include <avr/io.h>
#include <compat/deprecated.h>// for cbi(), sbi()
#include <util/delay_basic.h> // for _delay_loop_2()
#include <stdlib.h>           // for itoa()

//--------------------------------------------------
// [6:4]をRS/RW/EN、
// [3:0]をLCDへのデータ出力に使用します。
// 汎用性はありません。
#define RS      PB6
#define RW      PB5
#define EN      PB4
#define LCDIN   PINB
#define LCDPORT PORTB
#define LCDDDR  DDRB

//--------------------------------------------------
// about 100us @10MHz
void delay_100us(uint8_t n) {
    int i;
    for(i=n; i!=0; i--){ _delay_loop_2(249); }
}

//==================================================LCDここから
//==============================H
//#ifndef __AVR_LCDLIB_H__
//#define __AVR_LCDLIB_H__
//--------------------------------------------------
// busy flag
#define BF  7

#define NOP()   asm("nop"::)
#define NOP2()  {NOP();NOP();} // rjmp PC+1<-これどうやるの?

#define DDR_READ    0xf0
#define DDR_WRITE   0xff
#define MODE_CMD    0
#define MODE_DAT    1

#define LcdDataMode()       sbi(LCDPORT, RS)
#define LcdCmdMode()        cbi(LCDPORT, RS)
#define LcdReadMode()       sbi(LCDPORT, RW)
#define LcdWriteMode()      cbi(LCDPORT, RW)
#define LcdAccsEnable()     sbi(LCDPORT, EN)
#define LcdAccsDisable()    cbi(LCDPORT, EN)
#define LcdMoveto1stLine(n) lcd_cmd(0x80+n)
#define LcdMoveto2ndLine(n) lcd_cmd(0xC0+n)

//--------------------------------------------------
uint8_t lcd_read(uint8_t rs);
void lcd_pol();
void lcd_write (uint8_t rs, uint8_t val);
void lcd_cmd(uint8_t cmd);
void lcd_data(uint8_t data);
void lcd_clear();
void lcd_init();
void lcd_putstr(char *str);

//#endif // __AVR_LCDLIB_H__
//==============================H
//==============================C
//--------------------------------------------------
// read LCDdata
uint8_t lcd_read(uint8_t rs) {
    uint8_t ret;
    // set DDR for read operation
    LCDDDR   = DDR_READ;
    LCDPORT &= 0xf0;
    if(rs==MODE_DAT) { LcdDataMode(); }
    else             { LcdCmdMode();  }
    LcdReadMode();
    //----------
    // 1st read
    LcdAccsEnable(); // this requires wait-time at least 220ns
    ret = 0;
    NOP2();
    ret = (LCDIN << 4);
    LcdAccsDisable();
    //----------
    NOP2();
    //----------
    // 2nd read
    LcdAccsEnable(); // this requires wait-time at least 220ns
    ret &= 0xf0;
    NOP2();
    ret|= (LCDIN & 0x0f);
    LcdAccsDisable();
    //----------
    return ret;
}

// polling
// wait until BusyFlag is cleared
void lcd_pol() {
    //uint8_t timeout = 100;
    //while((lcd_read(MODE_CMD) & _BV(BF)) && (timeout-- != 0)) {}
    while(lcd_read(MODE_CMD) & _BV(BF)) {}
}

//--------------------------------------------------
// write data(for only 4bit-mode)
void lcd_write (uint8_t rs, uint8_t val) {
    LCDDDR = DDR_WRITE;
    // set DDR for write operation
    if(rs==MODE_DAT) { LcdDataMode(); }
    else             { LcdCmdMode();  }
    LcdWriteMode();
    //----------
    // write
    LcdAccsEnable();
    LCDPORT = ((LCDPORT & 0xf0) | (val & 0x0f));
    LcdAccsDisable();
}

// command write
void lcd_cmd(uint8_t cmd) {
    // 4bit-modeなので、2回に分けてライト
    lcd_write(MODE_CMD, cmd>>4);
    lcd_write(MODE_CMD, cmd   );
    lcd_pol();
}

// data write
void lcd_data(uint8_t data) {
    // 4bit-modeなので、2回に分けてライト
    lcd_write(MODE_DAT, data>>4);
    lcd_write(MODE_DAT, data   );
    lcd_pol();
}

//--------------------------------------------------
// clear LCD
void lcd_clear() {
    lcd_cmd(0x01); // clear display
    //delay_100us(16);
}

// initialize LCD
void lcd_init() {
    // 最初のうちはbusy flagを利用できないので
    // 時間を指定して待機
    delay_100us(150);
    lcd_write(0, 0x03); delay_100us(41);
    lcd_write(0, 0x03); delay_100us(1);
    lcd_write(0, 0x03); delay_100us(1);
    lcd_write(0, 0x02); delay_100us(1);
    lcd_cmd(0x28); // set to 4bit-mode, 2line-mode
    lcd_cmd(0x08); // display off
    lcd_clear();   // clear display
    lcd_cmd(0x0C); // display on
    lcd_cmd(0x06); // entry mode is inc, cursor-move
}

// put string
void lcd_putstr(char *str) {
    // 終端文字'¥n'までライト
    while(*str != '¥0') { lcd_data(*(str++)); }
}

//==============================C
//==================================================LCDここまで
//--------------------------------------------------
int main() {
    uint8_t c=0;
    char    num[4]; // 数値文字列変換用領域の確保(3文字分+'¥0')
    lcd_init();
    lcd_clear();
    //----------
    lcd_putstr("LCD Test:");
    while(1) {
        // "LCD Test:"の後ろ(10文字目)に移動
        LcdMoveto1stLine(9);
        // 泥臭い方法で左詰め
        if(c<100) lcd_data(' ');
        if(c< 10) lcd_data(' ');
        lcd_putstr(itoa(c++, num, 10));
        // 2行目の先頭に移動
        LcdMoveto2ndLine(0);
        lcd_putstr("^^^^^^^^");
        //
        delay_100us(250);
        delay_100us(250);
    }
}

//--------------------------------------------------
// EOF

今後やりたいこと

  • アセンブラ版も作る
  • CGRAMを使って、自作の文字を表示させる

名前:
コメント:
「ATTiny2313でキャラクタ液晶を使う」をウィキ内検索
LINE
シェア
Tweet
添付ファイル
  • tn2313_lcd_test_c.c
yskwiki
記事メニュー

メニュー

  • トップページ
  • メニュー

AVR

  • AVR/ATTiny13Aでビデオ信号生成(NTSC) その1
  • AVR/ATTiny13Aでビデオ信号生成(NTSC) その2
  • AVR/ATTiny2313でキャラクタ液晶を使う

ARM

  • ARM/CMSIS日本語訳
  • ARM/RaspberryPi
  • ARM/SDK-NUC120

FPGA

  • FPGA/Altera/DE0

その他メモ

  • パーツメモ


リンク

  • プラグイン紹介





- : - : -
記事メニュー2

更新履歴

取得中です。


ここを編集
最近更新されたページ
  • 4692日前

    ARM/RaspberryPi
  • 4713日前

    メニュー
  • 4713日前

    パーツメモ
  • 4728日前

    ARM/SDK-NUC120
  • 4732日前

    FPGA/Altera/DE0
  • 4732日前

    AVR/ATTiny2313でキャラクタ液晶を使う
  • 4733日前

    ARM/CMSIS日本語訳
  • 4736日前

    AVR/ATTiny13Aでビデオ信号生成(NTSC) その2
  • 4736日前

    AVR/ATTiny13Aでビデオ信号生成(NTSC) その1
  • 4738日前

    トップページ
もっと見る
最近更新されたページ
  • 4692日前

    ARM/RaspberryPi
  • 4713日前

    メニュー
  • 4713日前

    パーツメモ
  • 4728日前

    ARM/SDK-NUC120
  • 4732日前

    FPGA/Altera/DE0
  • 4732日前

    AVR/ATTiny2313でキャラクタ液晶を使う
  • 4733日前

    ARM/CMSIS日本語訳
  • 4736日前

    AVR/ATTiny13Aでビデオ信号生成(NTSC) その2
  • 4736日前

    AVR/ATTiny13Aでビデオ信号生成(NTSC) その1
  • 4738日前

    トップページ
もっと見る
ウィキ募集バナー
急上昇Wikiランキング

急上昇中のWikiランキングです。今注目されている話題を見てみよう!

  1. ~新人狼OnlineWiki~
  2. 発車メロディーwiki
  3. スーパーロボット大戦DD 攻略wiki 【SRWDD】
  4. 任天堂大辞典wiki
  5. イナズマイレブン 染岡さんと愉快な仲間たち wiki
  6. 英傑大戦wiki
  7. ワールドトリガー@wiki
  8. SDガンダム Gジェネレーションオーバーワールド 攻略Wiki
  9. SDガンダム ジージェネレーションクロスレイズ 攻略Wiki
  10. イニミニマニモ? @ ウィキ
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  6. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  7. 検索してはいけない言葉 @ ウィキ
  8. オレカバトル アプリ版 @ ウィキ
  9. Fate/Grand Order @wiki 【FGO】
  10. Abiotic Factor 日本語攻略Wiki
もっと見る
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. まどドラ攻略wiki
  2. MadTown GTA (Beta) まとめウィキ
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. Dark War Survival攻略
  6. PEAK (landfall) 攻略 @ ウィキ
  7. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  8. ソードランページ @ 非公式wiki
  9. 魔法少女ノ魔女裁判 攻略・考察Wiki
  10. AviUtl2のWiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. MOZU - ストグラ まとめ @ウィキ
  2. 参加者一覧 - ストグラ まとめ @ウィキ
  3. ヴァン ダーマー - ストグラ まとめ @ウィキ
  4. ギャング - ストグラ まとめ @ウィキ
  5. ジャムリーヌ バルサミコス - ストグラ まとめ @ウィキ
  6. 暦家 - ストグラ まとめ @ウィキ
  7. 四神(中国神話) - アニヲタWiki(仮)
  8. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  9. FOG - ストグラ まとめ @ウィキ
  10. Super Subaru - ストグラ まとめ @ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.