今回は AliExpress で買った 128×64 のグラフィックLCD を使ってみました。使用した PIC は PIC16F18857 です。
400円ぐらいで安かったのはいいですが、データシートや型番が不明なので調査が必要です。
裏面のパーツを参考にネットで同じものを探してみると、どうやら ST7920 という IC が使われているようです。
接続方法は 8bitパラレル、4bitパラレル、SPI の3種類があるようですが、まずは 8bitパラレルでやってみます。
接続方法はこんな感じです。
V0ピンはコントラスト設定用のピンで可変抵抗を繋げるのですが、この LCD の裏面には元から可変抵抗がついているので何も繋がなくて大丈夫でした。
ちなみにこの可変抵抗は端で止まったりしないで1回転するので、気を付けて丁度よい所を探しましょう。
次にデータの送信関数はこのようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void ST7920_Inst(char inst){ RS = 0; RW = 0; E = 1; PORTA = inst; E = 0; __delay_us(36); } void ST7920_Data(char data){ RS = 1; RW = 0; E = 1; PORTA = data; E = 0; __delay_us(36); } |
LCD の DB0~DB7 を PIC の RA0~RA7 に接続することで PORTA レジスタで丸ごとアクセスできます。
遅延はデータシートでは 72us となっていましたが、半分の 36us でも動きました。
ところで、コマンドの一覧を見てみると、キャラクタLCD で見慣れたコマンドがたくさん並んでいます。
どうやらこの LCD はグラフィックLCD だけじゃなくて、キャラクタLCD としても使えるようです。しかも中国語の2バイト文字も対応しているらしい。
というわけで、グラフィックを表示させる前に文字を表示させることにします。
レジスタのアドレスと表示位置の関係は下図のようになっています。各アドレスは2バイトになっていて、半角の場合は上位と下位のそれぞれにデータを入力できます。
2バイト文字の文字コードはこちらのものが使用できました。平仮名もあるので大抵の日本語は表示できると思います。
ただし、あくまでも中国語の文字コードなので、中国語で使われていない漢字はなかったりします。
実際に表示させてみました。
プログラムはこちら(クリックで表示)
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
#pragma config FEXTOSC = OFF // External Oscillator mode selection bits (Oscillator not enabled) #pragma config RSTOSC = EXT1X // Power-up default value for COSC bits (EXTOSC operating per FEXTOSC bits) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (FSCM timer enabled) #pragma config MCLRE = ON // Master Clear Enable bit (MCLR pin is Master Clear function) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config LPBOREN = OFF // Low-Power BOR enable bit (ULPBOR disabled) #pragma config BOREN = OFF // Brown-out reset enable bits (Brown-out reset disabled) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices) #pragma config ZCD = OFF // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.) #pragma config PPS1WAY = ON // Peripheral Pin Select one-way control (The PPSLOCK bit can be cleared and set only once in software) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset) #pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS) #pragma config WDTE = OFF // WDT operating mode (WDT Disabled, SWDTEN is ignored) #pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required) #pragma config WDTCCS = SC // WDT input clock selector (Software Control) #pragma config WRT = OFF // UserNVM self-write protection bits (Write protection off) #pragma config SCANE = available// Scanner Enable bit (Scanner module is available for use) #pragma config LVP = OFF // Low Voltage Programming Enable bit (High Voltage on MCLR/Vpp must be used for programming) #pragma config CP = OFF // UserNVM Program memory code protection bit (Program Memory code protection disabled) #pragma config CPD = OFF // DataNVM code protection bit (Data EEPROM code protection disabled) #include <xc.h> #define _XTAL_FREQ 32000000 #define RS RB7 #define RW RB6 #define E RB5 #define RST RB4 void Init(); void ST7920_Inst(char inst); void ST7920_Data(char data); void ST7920_Init(){ RST = 0; RST = 1; __delay_ms(40); ST7920_Inst(0x30); //Function Set ST7920_Inst(0x30); ST7920_Inst(0x0C); //Display ON/OFF Control ST7920_Inst(0x01); //Display Clear __delay_ms(10); ST7920_Inst(0x06); //Entry Mode Set } void main(void) { Init(); ST7920_Init(); int t[] = {0xc0ed, 0xcfb5, 0xc4d0, 0xd7d3, 0xa4ce, 0xb5e7, 0xd7d3, 0xb9a4, 0xd7f7}; //"理系男子の電子工作" char* s1 = "Graphic LCD"; char* s2 = "by ST7920"; ST7920_Inst(0x80); //Line 0 Row 0 for(char i=0; i<5; i++){ ST7920_Data((t[i]>>8)&0xFF); ST7920_Data(t[i]&0xFF); } ST7920_Inst(0x92); //Line 1 Row 2 for(char i=5; i<9; i++){ ST7920_Data((t[i]>>8)&0xFF); ST7920_Data(t[i]&0xFF); } ST7920_Inst(0x88); //Line 2 Row 0 for(char i=0; i<12; i++){ ST7920_Data(s1[i]); } ST7920_Inst(0x9A); //Line 3 Row 2 for(char i=0; i<10; i++){ ST7920_Data(s2[i]); } while(1); } ////////////////////////////////////// void Init(){ ANSELA = 0; TRISA = 0; ANSELB = 0; TRISB = 0; ANSELC = 0; TRISC = 0; OSCCON1 = 0b01100000; //Oscillator HFINTOSC, divider 1 OSCFRQ = 0b00000111; //32MHz } void ST7920_Inst(char inst){ RS = 0; RW = 0; E = 1; PORTA = inst; E = 0; __delay_us(36); } void ST7920_Data(char data){ RS = 1; RW = 0; E = 1; PORTA = data; E = 0; __delay_us(36); } |
PIC を使っていて日本語を扱うのは初めてなのでなかなか面白いですね。まあこれ以上使わないんですけど。
続いてグラフィック機能を確認しましょう。グラフィック機能に関するコマンドは Extended Instruction として提供されているようです。
表示データはこのようになっています。
この IC は 128×64 ではなく 256×64 のセグメントに対応しているのですが、ここで気を付けなければならない点があります。
256×64 のセグメントのうち、実際に LCD に表示されるのは下図の部分になります。最初ここに気付かなくて嵌りました。
アドレスを設定する関数はこのようにしました。
1 2 3 4 5 6 7 8 |
void ST7920_SetGDRAM(char line, char row){ if(line >= 32){ line -= 32; row += 8; } ST7920_Inst(0x80 | line); ST7920_Inst(0x80 | row); } |
さて、このデータ形式ですが、実は白黒BMPファイルのデータをほぼそのまま使用することができます。(ただし BMPファイルは下から上に記録されることと白黒が逆転することに注意)BMPファイルのフォーマットはこちらに詳しく載っています。
ペイントなどでサイズを 128×64 に設定し、名前を付けて保存のところでファイルの種類をモノクロビットマップに設定します。
なお、BMPファイルのデータをコピーするには Stirling などのバイナリエディタが必要になります。
実際に画像を表示させてみました。
プログラムはこちらです。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
#pragma config FEXTOSC = OFF // External Oscillator mode selection bits (Oscillator not enabled) #pragma config RSTOSC = EXT1X // Power-up default value for COSC bits (EXTOSC operating per FEXTOSC bits) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (FSCM timer enabled) #pragma config MCLRE = ON // Master Clear Enable bit (MCLR pin is Master Clear function) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config LPBOREN = OFF // Low-Power BOR enable bit (ULPBOR disabled) #pragma config BOREN = OFF // Brown-out reset enable bits (Brown-out reset disabled) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices) #pragma config ZCD = OFF // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.) #pragma config PPS1WAY = ON // Peripheral Pin Select one-way control (The PPSLOCK bit can be cleared and set only once in software) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset) #pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS) #pragma config WDTE = OFF // WDT operating mode (WDT Disabled, SWDTEN is ignored) #pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required) #pragma config WDTCCS = SC // WDT input clock selector (Software Control) #pragma config WRT = OFF // UserNVM self-write protection bits (Write protection off) #pragma config SCANE = available// Scanner Enable bit (Scanner module is available for use) #pragma config LVP = OFF // Low Voltage Programming Enable bit (High Voltage on MCLR/Vpp must be used for programming) #pragma config CP = OFF // UserNVM Program memory code protection bit (Program Memory code protection disabled) #pragma config CPD = OFF // DataNVM code protection bit (Data EEPROM code protection disabled) #include <xc.h> #include "data.h" #define _XTAL_FREQ 32000000 #define RS RB7 #define RW RB6 #define E RB5 #define RST RB4 void Init(); void ST7920_Inst(char inst); void ST7920_Data(char data); void ST7920_SetGDRAM(char line, char row); void ST7920_Clear(); void ST7920_Init(){ RST = 0; RST = 1; __delay_ms(40); ST7920_Inst(0x30); //Function Set ST7920_Inst(0x30); ST7920_Inst(0x0C); //Display ON/OFF Control ST7920_Inst(0x01); //Display Clear __delay_ms(10); ST7920_Inst(0x06); //Entry Mode Set ST7920_Inst(0x34); //Extended Instruction ST7920_Inst(0x36); //Graphic Display ON ST7920_Clear(); } void main(void) { Init(); ST7920_Init(); for(char i=0; i<64; i++){ // Display image ST7920_SetGDRAM(63-i,0); for(char j=0; j<16; j++){ ST7920_Data(data[(i<<4)+j]); } } while(1); } ////////////////////////////////////// void Init(){ ANSELA = 0; TRISA = 0; ANSELB = 0; TRISB = 0; ANSELC = 0; TRISC = 0; OSCCON1 = 0b01100000; //Oscillator HFINTOSC, divider 1 OSCFRQ = 0b00000111; //32MHz } void ST7920_Inst(char inst){ RS = 0; RW = 0; E = 1; PORTA = inst; E = 0; __delay_us(36); } void ST7920_Data(char data){ RS = 1; RW = 0; E = 1; PORTA = data; E = 0; __delay_us(36); } void ST7920_SetGDRAM(char line, char row){ if(line >= 32){ line -= 32; row += 8; } ST7920_Inst(0x80 | line); ST7920_Inst(0x80 | row); } void ST7920_Clear(){ for(char i=0; i<32; i++){ ST7920_SetGDRAM(i,0); for(char j=0; j<32; j++) ST7920_Data(0); } } |
1 |
const char data[1024] = {0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x0F,0x80,0x20,0x00,0x00,0x07,0x0F,0xFE,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xF0,0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x03,0xFF,0xFF,0xFE,0x00,0x00,0x7F,0xFF,0xFF,0xF8,0x00,0x3F,0xFF,0xFF,0xFC,0x00,0x1F,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFE,0x00,0x3F,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0x87,0xFF,0xF0,0x3F,0xFF,0xFF,0xFC,0x1F,0xFF,0xE3,0xFF,0xFF,0xC0,0x01,0x80,0x1F,0x01,0xFF,0xFC,0x1F,0xFF,0xFF,0xF8,0x3F,0xFF,0x80,0xF8,0x03,0x80,0x01,0x80,0x3C,0x00,0x3F,0xFC,0x1F,0xFF,0xFF,0xF8,0x7F,0xFC,0x00,0x70,0x01,0x80,0x00,0x00,0x78,0x00,0x0F,0xFE,0x1F,0xFF,0xFF,0xF8,0xFF,0xF0,0x00,0x3C,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x1F,0xFF,0xFF,0xF9,0xFF,0x80,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x1F,0xFF,0xFF,0xF9,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x9F,0xFF,0xFF,0xFB,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xDF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x1F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x03,0x0F,0xFF,0xFF,0xFF,0xFF,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x03,0x8F,0xFF,0xFF,0xFF,0xFF,0xC1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x9F,0xFF,0xFF,0xFF,0xFF,0xE1,0x80,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x03,0xCF,0xFF,0xFF,0xFF,0xFF,0xF3,0xC0,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x03,0xC7,0xFF,0xFF,0xFF,0xFF,0xC7,0xC0,0x1C,0x00,0x00,0x00,0x00,0x01,0x00,0x3C,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xC0,0x3C,0x00,0x00,0x00,0x18,0x01,0x80,0x3E,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x7C,0x00,0x80,0x00,0x1C,0x01,0xC0,0x3F,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x7C,0x01,0x80,0x00,0x0E,0x01,0xE0,0x3F,0x07,0xFB,0xFF,0xFF,0xFF,0xFF,0xDF,0xC0,0xFC,0x03,0x80,0x18,0x0F,0x01,0xF0,0x3F,0x87,0xF9,0xFF,0xFF,0xFF,0xFF,0x3F,0xC1,0xFC,0x07,0x80,0x38,0xCF,0xC1,0xF8,0x3F,0x83,0xF1,0xFF,0xFF,0xFF,0xFE,0x3F,0xC3,0xFC,0x0F,0x80,0x70,0xCF,0xE1,0xFC,0x3F,0x81,0xF3,0xFF,0xFF,0xFF,0xFF,0x1F,0xA3,0xFC,0x1F,0x81,0xF0,0xE7,0xF1,0xFC,0x1F,0x00,0x77,0x9F,0xFF,0xFF,0xE3,0x9F,0xE1,0xF8,0x3F,0x03,0xF3,0xE7,0xF1,0xFE,0x07,0xFF,0xFF,0x03,0xFF,0xFF,0x03,0xFF,0xF1,0xF0,0x3F,0x07,0xE3,0xF7,0xF0,0xFE,0x0F,0xFF,0xFE,0x00,0x3F,0xF8,0x01,0xFF,0xFF,0xE0,0x7F,0x0F,0xE7,0xFF,0xF0,0x7C,0x3F,0x00,0x00,0x00,0x1F,0xF0,0x80,0xFF,0xFF,0xC0,0x7F,0x1F,0xE7,0xFF,0xF0,0x3D,0xF8,0x00,0x00,0x00,0x3F,0xFD,0x80,0x3F,0xF9,0xF0,0x7E,0x1F,0xFF,0x07,0xF0,0x3F,0xE0,0x00,0x00,0x01,0x6F,0xF7,0xE0,0x3F,0xF0,0x3C,0x7C,0x0F,0xFF,0x00,0xFC,0xFF,0x00,0x00,0x00,0x01,0x7F,0xFF,0xFA,0x3F,0xF0,0x0F,0xF0,0x0F,0xFE,0x00,0x1F,0xF8,0x00,0x00,0x00,0x07,0xF9,0xFF,0xFE,0x3F,0xF0,0x03,0xFC,0x1F,0xC0,0x00,0x07,0xC0,0x00,0x00,0x00,0x1F,0xF7,0xFF,0xFF,0xBF,0xF0,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5F,0xFF,0xFF,0xFE,0x3F,0xE0,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0x3F,0xE0,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x3F,0xFF,0xFF,0xFF,0x9F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xDF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; |
追記:
4bitパラレルでもやってみましたが、描画速度は変わりませんでした。どちらにせよ LCD にデータを送信するときの遅延が描画速度の決定要因になるようです。
8bitパラレルの場合との相違点はデータの送信関数と初期化ぐらいです。その他はそのままで使用できます。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
void ST7920_Inst(char inst){ //4bit RS = 0; RW = 0; E = 1; PORTA = (PORTA & 0x0F) | (inst & 0xF0); E = 0; E = 1; PORTA = (PORTA & 0x0F) | ((inst & 0x0F)<<4); E = 0; __delay_us(36); } void ST7920_Data(char data){ //4bit RS = 1; RW = 0; E = 1; PORTA = (PORTA & 0x0F) | (data & 0xF0); E = 0; E = 1; PORTA = (PORTA & 0x0F) | ((data & 0x0F)<<4); E = 0; __delay_us(36); } void ST7920_Init(){ RST = 0; RST = 1; __delay_ms(40); // ST7920_Inst(0x30); //Function Set // ST7920_Inst(0x30); //for 8bit ST7920_Inst(0x20); ST7920_Inst(0x20); //for 4bit ST7920_Inst(0x0C); //Display ON/OFF Control ST7920_Inst(0x01); //Display Clear __delay_ms(10); ST7920_Inst(0x06); //Entry Mode Set // ST7920_Inst(0x34); //Extended Instruction // ST7920_Inst(0x36); //for 8bit ST7920_Inst(0x24); ST7920_Inst(0x26); //for 4bit ST7920_Clear(); } |
SPI も試してみたのですが、残念ながら上手くいきませんでした。
それほどピンの数に困っている訳でもないので、今回の実験はここまでとしました。
はじめまして。私も中華LCD入手してST7920検索でここに参りました
>ただし、あくまでも中国語の文字コードなので、中国語で使われていない漢字はなかったりします。
の下にあるはずのコード、自分で考えろ!と怒られそうですが教えて下さい。
よろしくお願いします。文系でCは独学なのでよく分かってません勉強にさせて頂きます。
コメントありがとうございます。分かりにくくて申し訳ありませんが、「プログラムはこちら」をクリックすると表示されると思います。