====== 簡易オシロ(グラフィック液晶表示)(PIC16F876) ====== ===== 概要 ===== 秋月電子通商で購入した「LCDグラフィック・ディスプレイモジュール)バックライト付 」を利用した簡易オシロを作成しました。 * SUNLIKE社グラフィックLEDモジュールです。 * 122x32ドット * 漢字パターンを送れば、漢字・記号・図形を自由に表示できます。 * 5V単一電源 * H8マイコン・PICマイコンなどに直結できます。 * 制御ICはEPSONS1D1520準拠 * 液晶サイズ:60.5(W)x18.5(H) * 接続端子:20ピン(2x10) ===== 動作原理 ===== PICのA/D変換機能でアナログデータを取り込みそれを単純に液晶に表示させるだけのものです。 但し、PICのA/Dの分解能は10ビットなので5ビット分右にシフトして5ビット(32)にします。 このモジュールは、液晶駆動クロック(2kHz~3kHz)を外部から供給する必要があります。 今回はPICのPWM機能を使って供給しました。なので回路図としてはとてもシンプルです。 ===== 回路図 ===== {{:imgpaste:202004:admin-20200430-174516.png}} ===== ソースコード ===== //********************************************************************** #define LcdA0 PORTA.F2 #define LedPower PORTA.F4 #define LcdCS1 PORTA.F5 #define LcdCS2 PORTC.F0 #define LcdCL PORTC.F1 #define LcdRD PORTC.F3 #define LcdWR PORTC.F4 #define LcdRES PORTC.F5 #define LcdData PORTB static unsigned char temp; //********************************************************************** void gLcdBusy(unsigned char cs) { TRISB = 0b11111111; LcdA0 = 0; if (cs == 1) LcdCS1 = 0; else LcdCS2 = 0; while (1) { LcdRD = 0; temp = LcdData; LcdRD = 1; if (temp.F7 == 0) break; } if (cs == 1) LcdCS1 = 1; else LcdCS2 = 1; TRISB = 0b00000000; } void gLcdCmd(unsigned char cs, unsigned char cmd) { gLcdBusy(cs); LcdA0 = 0; if (cs == 1) LcdCS1 = 0; else LcdCS2 = 0; LcdData = cmd; LcdWR = 0; LcdWR = 1; if (cs == 1) LcdCS1 = 1; else LcdCS2 = 1; } void gLcdData(unsigned char cs, unsigned char data) { gLcdBusy(cs); LcdA0 = 1; if (cs == 1) LcdCS1 = 0; else LcdCS2 = 0; LcdData = data; LcdWR = 0; LcdWR = 1; if (cs == 1) LcdCS1 = 1; else LcdCS2 = 1; } void gLcdClr(unsigned char mode) { unsigned char cnt, data; data = (mode == 1) ? 0xFF : 0x00; // gLcdCmd(1, 0b10111000); // ページアドレス設定<0> gLcdCmd(2, 0b10111000); // ページアドレス設定<0> gLcdCmd(1, 0b00000000); // カラムアドレス設定<0> gLcdCmd(2, 0b00000000); // カラムアドレス設定<0> for(cnt = 0; cnt < 61; cnt++) { gLcdData(1, data); gLcdData(2, data); } gLcdCmd(1, 0b10111001); // ページアドレス設定<1> gLcdCmd(2, 0b10111001); // ページアドレス設定<1> gLcdCmd(1, 0b00000000); // カラムアドレス設定<0> gLcdCmd(2, 0b00000000); // カラムアドレス設定<0> for(cnt = 0; cnt < 61; cnt++) { gLcdData(1, data); gLcdData(2, data); } gLcdCmd(1, 0b10111010); // ページアドレス設定<2> gLcdCmd(2, 0b10111010); // ページアドレス設定<2> gLcdCmd(1, 0b00000000); // カラムアドレス設定<0> gLcdCmd(2, 0b00000000); // カラムアドレス設定<0> for(cnt = 0; cnt < 61; cnt++) { gLcdData(1, data); gLcdData(2, data); } gLcdCmd(1, 0b10111011); // ページアドレス設定<3> gLcdCmd(2, 0b10111011); // ページアドレス設定<3> gLcdCmd(1, 0b00000000); // カラムアドレス設定<0> gLcdCmd(2, 0b00000000); // カラムアドレス設定<0> for(cnt = 0; cnt < 61; cnt++) { gLcdData(1, data); gLcdData(2, data); } } void gLcdDotSet(unsigned char x, unsigned char y) // x(0...121), y(0...31) { unsigned char cs, pa, ca, dt; if (x < 61) cs = 1; else cs = 2; // switch (y / 8) { case 0: pa = 0b10111000; break; case 1: pa = 0b10111001; break; case 2: pa = 0b10111010; break; case 3: pa = 0b10111011; break; } gLcdCmd(cs, pa); // ca = x - ((cs - 1) * 61); gLcdCmd(cs, ca); // switch (y / 8) { case 0: dt = y; break; case 1: dt = y - 8; break; case 2: dt = y - 16; break; case 3: dt = y - 24; break; } dt = 0b00000001 << dt; gLcdData(cs, dt); } void gLcdInit() { LcdA0 = 1; LcdCS1 = 1; LcdCS2 = 1; LcdRD = 1; LcdWR = 1; LcdRES = 0; gLcdCmd(1, 0b10101111); // 表示ON gLcdCmd(2, 0b10101111); // 表示ON gLcdClr(0); // 画面クリア } //********************************************************************** void initPwm() { CCP1CON = 0b00001100; CCP2CON = 0b00001100; PR2 = 0x7F; T2CON = 0b00000110; CCPR1L = 0x00; CCPR2L = 0x3F; } //********************************************************************** void main() { unsigned char cnt, x, y; unsigned int ad0; // ポートの設定 TRISA = 0b00001001; TRISB = 0b00000000; TRISC = 0b01000000; ADCON1 = 0b00001110; // initPwm(); // gLcdInit(); for (cnt = 0; cnt < 5; cnt++) { Delay_ms(300); gLcdClr(1); // 画面クリア Delay_ms(300); gLcdClr(0); // 画面クリア } // while (1) { for (x = 0; x < 122; x++) { ad0 = Adc_Read(0); ad0 = (ad0 >> 5) & 0b00011111; gLcdDotSet(x, ad0); } Delay_ms(100); gLcdClr(0); // 画面クリア } } //********************************************************************** ===== 動作確認 ===== 100Hzの正弦波(半波)を入力してみました。 {{:imgpaste:202004:admin-20200430-174618.png?500}} {{:imgpaste:202004:admin-20200430-174627.png?500}} このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]] This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]