====== LCDモニター(3.3V駆動) ====== ===== 概要 ===== 以前にも、LCDモニターを製作しました。 しかし、5V駆動のため、接続相手も5V駆動である必要がありました。 最近は、3.3V駆動の回路も多いので、3.3Vで駆動するLCDモニターを製作しました。 <仕様> * 電源は、3.3V駆動とします。 * 通信速度は、4800bps、9600bps、19200bps、38400bpsの選択を可能とします。 * 動作モードは、受信モードと送信モードの2種類とします。 * 送信モードの出力は、2系統用意します。 ===== 動作原理 ===== <起動時処理> * LCDに、負電圧(約2V)を供給するために、内蔵のCCPをPWMモードで起動します。(10kHz、duty50%) * 通信速度をSW1とSW2で選択します。 * 9600bps→SW1=1、SW2=1 * 19200bps→SW1=0、SW2=1 * 38400bps→SW1=1、SW2=0 * 4800bps→SW1=0、SW2=0 * 起動モードをSW3で選択します。 * 受信モード→SW3=1 * 送信モード→SW3=0 <受信処理> * データを受信します。 * データが、CR(Carriage Return)またはLF(Line Feed)であれば、カーソルを1行目の1文字目に戻します。 * データが、FF(Form Feed)であれば、画面を消去して、カーソルを1行目の1文字目に戻します。 * それ以外のデータであれば、画面に順次表示していきます。 * 表示方向は、次のようになります。 * 1行目(上段)の1文字目(左端)から16文字目(右端)に向かって表示します。 * 2行目(下段)の1文字目(左端)から16文字目(右端)に向かって表示します。 * その後、1行目(上段)の1文字目(左端)に戻ります。 <送信処理> * 英字の“A"~“Z"のデータを送信し、1秒スリープします。 * 英字の“a"~“z"のデータを送信し、1秒スリープします。 * 数字の“0"~“9"のデータを送信し、1秒スリープします。 * これらの処理を繰り返します。\\ ※送信出力は、2系統あります。 * 内蔵モジュールによる出力(Txピン) * ソフトウエアによる出力(RB1ピン)→4800bpsと9600bpsのみに対応しています。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200430-130644.png}} ===== ソースコード ===== //********************************************************************** /*   「LCDモニター(3.3V駆動)」  ■通信速度   ・9600bps  → SW1=1、SW2=1   ・19200bps → SW1=0、SW2=1   ・38400bps → SW1=1、SW2=0   ・4800bps  → SW1=0、SW2=0  ■動作モード   ・受信モード → SW3=1     ※受信したデータを16文字2行の32の表示エリアに      順次表示していきます。     ※データが、CRまたはLFの時には、画面をクリアせずに、カーソル      を1行目の1文字目に戻します。     ※ データが、FFの時には、画面をクリアし、 カーソルを1行目の      1文字目に戻します。   ・送信モード → SW3=1     ※テストデータの送信を繰り返します。      :英字(大文字)“A”~“Z”      :英字(小文字)“a”~“z”      :数字     “0”~“9” */ //********************************************************************** #define SW1 PORTA.F3 #define SW2 PORTA.F4 #define SW3 PORTA.F5 #define CR 0x0D #define LF 0x0A #define FF 0x0C #define LED PORTA.F2 #define ON 1 #define OFF 0 //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.CCP1Y = duty_ratio & 0b00000001; CCP1CON.CCP1X = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** void recv() { static unsigned short rd, cnt; // cnt = 0; // while (1) { LED = OFF; if (Usart_Data_Ready() == 0) continue; LED = ON; rd = Usart_Read(); // if ((rd == CR) || (rd == LF)) { Lcd_Custom_Cmd(LCD_FIRST_ROW); cnt = 0; continue; } if (rd == FF) { Lcd_Custom_Cmd(LCD_FIRST_ROW); Lcd_Custom_Cmd(LCD_CLEAR); cnt = 0; continue; } // switch (cnt) { case 0: Lcd_Custom_Cmd(LCD_FIRST_ROW); Lcd_Custom_Chr_Cp(rd); break; case 16: Lcd_Custom_Cmd(LCD_SECOND_ROW); Lcd_Custom_Chr_Cp(rd); break; default: Lcd_Custom_Chr_Cp(rd); break; } // if (cnt < 31) { cnt++; } else { cnt = 0; } } } //********************************************************************** void send() { static unsigned short cnt; // while (1) { //'A'.....'Z' LED = ON; Usart_Write(FF); Soft_Uart_Write(FF); for (cnt = 0; cnt < 26; cnt++) { Usart_Write(cnt + 'A'); Soft_Uart_Write(cnt + 'A'); Delay_ms(10); } LED = OFF; Delay_ms(1000); //'a'.....'z' LED = ON; Usart_Write(FF); Soft_Uart_Write(FF); for (cnt = 0; cnt < 26; cnt++) { Usart_Write(cnt + 'a'); Soft_Uart_Write(cnt + 'a'); Delay_ms(10); } LED = OFF; Delay_ms(1000); //'0'.....'9' LED = ON; Usart_Write(FF); Soft_Uart_Write(FF); for (cnt = 0; cnt < 10; cnt++) { Usart_Write(cnt + '0'); Soft_Uart_Write(cnt + '0'); Delay_ms(10); } LED = OFF; Delay_ms(1000); } } //********************************************************************** void main() { OSCCON = 0b01110000; CMCON = 0b00000111; ANSEL = 0b00000000; TRISA = 0b00111000; TRISB = 0b00000100; //LCDのマイナス電源用 Pwm_Init(10000); //10kHz Pwm_Change_DutyEx((PR2 * 4) / 2); //50% Pwm_Start(); // Lcd_Custom_Config(&PORTA, 1, 0, 7, 6, &PORTB, 4, 6, 7); // Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); LED = ON; Lcd_Custom_Out(1, 1, "Lcd Monitor v3"); if ((SW1 == 1) && (SW2 == 1)) { Lcd_Custom_Out(2, 9, " 9600bps"); } if ((SW1 == 0) && (SW2 == 1)) { Lcd_Custom_Out(2, 9, "19200bps"); } if ((SW1 == 1) && (SW2 == 0)) { Lcd_Custom_Out(2, 9, "38400bps"); } if ((SW1 == 0) && (SW2 == 0)) { Lcd_Custom_Out(2, 9, " 4800bps"); } // if ((SW1 == 1) && (SW2 == 1)) { Usart_Init(9600); Soft_Uart_Init(PORTB, 0, 1, 9600, 0); } if ((SW1 == 0) && (SW2 == 1)) { Usart_Init(19200); Soft_Uart_Init(PORTB, 0, 1, 19200, 0); } if ((SW1 == 1) && (SW2 == 0)) { Usart_Init(38400); Soft_Uart_Init(PORTB, 0, 1, 38400, 0); } if ((SW1 == 0) && (SW2 == 0)) { Usart_Init(4800); Soft_Uart_Init(PORTB, 0, 1, 4800, 0); } Delay_ms(500); Lcd_Custom_Cmd(LCD_CLEAR); LED = OFF; // if (SW3 == 1) { recv(); } else { send(); } } //********************************************************************** ===== 動作確認 ===== 左側のPICは送信モードで起動しています。(LCDは接続していません) 右側のPICは受信モードで起動しています。 {{:imgpaste:202004:htmikan-20200430-130807.png?500}} 左側:PIC同士は、黄色の線のみで接続されています。 右側:PWM信号(約10kHz)から、コンデンサとダイオードを使用して、負電圧を生成しています。 {{:imgpaste:202004:htmikan-20200430-130903.png}}{{:imgpaste:202004:htmikan-20200430-130906.png}} 送信側から、英字の“A"~“Z"のデータを、受信側へ送信しています。 {{:imgpaste:202004:htmikan-20200430-130915.png?500}} 送信側から、英字の“a"~“z"のデータを、受信側へ送信しています。 {{:imgpaste:202004:htmikan-20200430-130930.png?500}} 送信側から、数字の“0"~“9"のデータを、受信側へ送信しています。 {{:imgpaste:202004:htmikan-20200430-130942.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]]