忍者ブログ

Azukish

消えゆく世界と流れる未来に最後の灯を since 2006/4/3

2024/04/29

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

2020/05/08

MSP-EXP430FR2433でLCDのSC1602SBを動かす

今日も懲りずにMSP430FR2433の記事。
みんな大好きSC1602SBです。


下記のコードがすべて。

#include <msp430.h> 

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    // GPIO
    P1DIR |= BIT0 | BIT1 | BIT2 | BIT3;
    P2DIR |= BIT0 | BIT2;
    P1OUT = 0;
    P2OUT = 0;

    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;
    __delay_cycles(50000);
    wp(0b0011);     // init 1st
    wp(0b0011);     // init 2nd
    wp(0b0011);     // init 3rd
    wp(0b0010);     // 4bit transition-1
    wp(0b0010);     // 4bit transition-2
    wp(0b1000);     // 2lines

    wp(0b0000);     // Display On/Cursor On/Position Off
    wp(0b1110);

    wp(0b0000);     // Clear Display
    wp(0b0001);

    wp(0b0000);     // Return Home
    wp(0b0010);

    P2OUT |= BIT0;  // Start writing to DDRAM
    __delay_cycles(10000);
    wp(0b1011);     // ア
    wp(0b0001);
    wp(0b1011);     // ス
    wp(0b1101);
    wp(0b1101);     // ゛
    wp(0b1110);
    wp(0b1011);     // キ
    wp(0b0111);
    P2OUT &= ~BIT0;
    wp(0b1100);     // Move to 2nd line 3rd char at DDRAM
    wp(0b0010);
    P2OUT |= BIT0;  // Start writing to DDRAM
    __delay_cycles(10000);
    wp(0b1011);     // ア
    wp(0b0001);
    wp(0b1011);     // ス
    wp(0b1101);
    wp(0b1101);     // ゛
    wp(0b1110);
    wp(0b1011);     // キ
    wp(0b0111);
    P2OUT &= ~BIT0;
	return 0;
}

// int to Parallel
int wp (int bits) {
    P1OUT = (char)bits;
    __delay_cycles(100);
    P2OUT |= BIT2;
    __delay_cycles(100);
    P2OUT &= ~BIT2;
    __delay_cycles(50000);
    return 0;
}

解説は不要かも知れないけれど一応記述する。
全部GPIOで動かすため、プログラムコードさえ変えれば何だって良い。
まず、P1.0-P1.3をそれぞれデータピンの4-7につなぐ。今回は4ビットモードで動かす。
この時に0-3ではないことに注意する。
P2.0をSRピンに、P2.2をENABLEピンにつなぐ。
WRピンは今回は使わない(使うと電圧レベルの違いからやばいかも)ため、GNDに落としておく。
Voピンは適当に100ΩでもつないでGNDに落とす。

プログラム内容的には、まずはじめの4ビットx3で8ビットモードで初期化。これはおまじない。
次の4ビットでおまじない的に4ビットモードにする。
次の8ビットで4ビットモードかつ2行表示の動作モードに入れる。
ここでの初期化がうまくいかないと、1行だけ真っ黒になったりする(実際なった)。

1行飛んでディスプレイの有効化かつカーソルの有効化、ブリンクはオフる。

1行飛んでディスプレイを初期化。

1行飛んで、カーソルを0(左上位置)に戻す。

あとは文字を羅列するだけ。好きな文字を並べよ。

大抵はピン配置のミスでやらかすので、それだけ気をつけて行う。


なお、SC1602は特殊インターフェースになっている。
Arduinoの標準LCDのライブラリが割と参考になる。
要は(データシートの表記とは違うみたいだが)、各ビットのピンに予め入力するデータを突っ込んでおいて、ENABLEを一発トグルするとデータが読み込まれる。
この時にSRがHであればRAMに書き込まれ、Lであれば設定項目に入力される。

また、4ビットモードは4ビットを2回送って8ビットにするモードであり、8ビットモードは8本のピンを使って 8ビットのデータを送るモードである。
往々にしてこれ系のマイコンボードはピン数が足りなくなる傾向にあるので(このLCDだけでも6本もGPIOを消費する!)、4ビットモードを推奨する。
あるいはSPIかI2Cのできるものが良いですね。

2020/5/8追記:
ついでにASCII文字と日本語の文字が表示できるような関数を作ってみた。
ASCII文字はSendAlphabets()で文字列の送信が可能。
日本語は、幼音以外はある程度表現可能。
「ゃゅょ」はxまたはlからのyで表現できる。
「っ」は子音2つまたは=で表現できる。
// sending character to display
int sendChar (unsigned char bits) {
    wp((char)(bits>>4));
    wp((char)(bits));
    return 0;
}

// ASCII
int sendAlphabets(unsigned char *str) {
    int i=0;
    for (; i<strlen(str); i++)
        sendChar(str[i]);
}

// Japanese
int sendJapaneses(unsigned char *str) {
    int i=0;
    unsigned char c0=0xb1;
    unsigned char c=c0;
    unsigned char daku=0;
    for (; i<strlen(str); i++) {
        if (str[i]==str[i+1]) {
            switch (str[i]) {
                case 'a':
                case 'i':
                case 'u':
                case 'e':
                case 'o':
                case 'n':
                    break;
                default:
                    sendChar(0xaf);
                    c=c0;
                    continue;
            }
        }
        switch (str[i]) {
        // 特殊
            case '/':
                c++;
            case ',':
                c++;
            case ')':
                c++;
            case '(':
                c++;
            case '.':
                c-=16;
                sendChar(c);
                c=c0;
                break;
            case '=':
                sendChar(0xaf);
                break;
            case '-':
                sendChar(0xb0);
                c=c0;
                break;
            case '\'':
                sendChar(0xdf);
                c=c0;
                break;
            case '\"':
                sendChar(0xde);
                c=c0;
                break;
        // 子音
            case 'x':
            case 'l':
                c=0xa7;
                break;
            case 'w':
                c+=5;
            case 'r':
                c+=3;
            case 'y':
                if (c==0xa7) {
                    c=0xac;
                    break;
                }
                c+=5;
            case 'm':
                c+=5;
            case 'b':
            case 'p':
            case 'h':
                c+=5;
            case 'n':
                if (str[i-1]=='n') {
                    sendChar(0xdd);
                    c=c0;
                    break;
                }
                c+=5;
            case 'd':
            case 't':
                c+=5;
            case 'z':
            case 's':
                c+=5;
            case 'g':
            case 'k':
                c+=5;
                break;
        // 母音
            case 'o':
                if (str[i-1]=='w') {
                    sendChar(0xa6);
                    c=c0;
                    break;
                }
                c++;
            case 'e':
                c++;
            case 'u':
                c++;
            case 'i':
                c++;
            default:
                sendChar(c);
                switch (str[i-1]){
                    case 'p':
                        sendChar(0xdf);
                        break;
                    case 'g':
                    case 'z':
                    case 'd':
                    case 'b':
                        sendChar(0xde);
                        break;
                }
                c=c0;
        }
    }
}

拍手

コメント













カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

アーカイブ

AD

Azkishはamazon.co.jpを宣伝しリンクすることによって サイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。