//********************************************************************** /*   <ワイヤレスLCD(赤外線データ通信)> */ //********************************************************************** //■マクロ定義 #define BYTE unsigned short #define WORD unsigned int #define DWORD unsigned long // sbit SW at RA5_bit; #define EOF 0x00 // sbit LED at RB1_bit; #define ON 1 #define OFF 0 //LCD sbit LCD_RS at RB6_bit; sbit LCD_EN at RB7_bit; sbit LCD_D7 at RA1_bit; sbit LCD_D6 at RA0_bit; sbit LCD_D5 at RA7_bit; sbit LCD_D4 at RA6_bit; sbit LCD_RS_Direction at TRISB6_bit; sbit LCD_EN_Direction at TRISB7_bit; sbit LCD_D7_Direction at TRISA1_bit; sbit LCD_D6_Direction at TRISA0_bit; sbit LCD_D5_Direction at TRISA7_bit; sbit LCD_D4_Direction at TRISA6_bit; //********************************************************************** //■関数宣言 extern void main(); extern void Lcd_Server(); extern void Lcd_Client(); extern void Lcd_Init_Remote(); extern void Lcd_Out_Remote(char row, char column, char *text); extern void Lcd_Out_Cp_Remote(char *text); extern void Lcd_Chr_Remote(char row, char column, char out_char); extern void Lcd_Chr_Cp_Remote(char out_char); extern void Lcd_Cmd_Remote(char out_char); extern void Lcd_Send_Chr(unsigned short dt); extern void Lcd_Send_Str(unsigned short* pData); //********************************************************************** //■メイン関数 void main() { OSCCON = 0b01110000; TRISA = 0b11111111; TRISB = 0b00001100; // LED = OFF; // if (SW == 1) { Lcd_Client(); } else { Lcd_Server(); } } //********************************************************************** //■ワイヤレスLCDサーバ関数 void Lcd_Server() { char dt, cnt, buf[32]; // ANSEL = 0b00000000; // Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); for (cnt = 0; cnt < 16; cnt++) { Lcd_Chr(1, cnt + 1, 0xFF); Delay_ms(50); } for (cnt = 0; cnt < 16; cnt++) { Lcd_Chr(2, cnt + 1, 0xFF); Delay_ms(50); } Delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); // Uart1_Init(1200); // while(1) { cnt = 0; while (1) { if (Uart1_Data_Ready() != 1) { continue; } // dt = Uart1_Read(); if (dt != EOF) { buf[cnt] = dt; cnt++; } else { buf[cnt] = 0x00; LED = ~LED; break; } // if (cnt == 32) { cnt = 0; continue; } } // switch (buf[0]) { case 'A': Lcd_Out(buf[1], buf[2], &buf[3]); break; case 'B': Lcd_Out_Cp(&buf[1]); break; case 'C': Lcd_Chr(buf[1], buf[2], buf[3]); break; case 'D': Lcd_Chr_Cp(buf[1]); break; case 'E': Lcd_Cmd(buf[1]); break; } } } //********************************************************************** //■ワイヤレスLCDクライアント関数 void Lcd_Client() { char buf[16]; WORD ad; // ANSEL = 0b00001111; // Lcd_Init_Remote(); // while (1) { ad = Adc_Read(0); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(1, 1, buf); Lcd_Out_Cp_Remote("mV"); // ad = Adc_Read(1); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(1, 9, buf); Lcd_Out_Cp_Remote("mV"); // ad = Adc_Read(2); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(2, 1, buf); Lcd_Out_Cp_Remote("mV"); // ad = Adc_Read(3); ad = ad * 4.8828125; WordToStr(ad, buf); Lcd_Out_Remote(2, 9, buf); Lcd_Out_Cp_Remote("mV"); // Delay_ms(100); } } //********************************************************************** //■ワイヤレスLCD初期化関数 void Lcd_Init_Remote() { Pwm1_Init(38000); // 38kHz duty=50% Pwm1_Set_Duty(PR2 / 2); Pwm1_Stop(); } //********************************************************************** //■ワイヤレスLCD文字列出力(行列指定)関数 void Lcd_Out_Remote(char row, char column, char *text) { Lcd_Send_Chr('A'); Lcd_Send_Chr(row); Lcd_Send_Chr(column); Lcd_Send_Str(text); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCD文字列出力(カレント位置)関数 void Lcd_Out_Cp_Remote(char *text) { Lcd_Send_Chr('B'); Lcd_Send_Str(text); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCD文字出力(行列指定)関数 void Lcd_Chr_Remote(char row, char column, char out_char) { Lcd_Send_Chr('C'); Lcd_Send_Chr(row); Lcd_Send_Chr(column); Lcd_Send_Chr(out_char); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCD文字出力(カレント位置)関数 void Lcd_Chr_Cp_Remote(char out_char) { Lcd_Send_Chr('D'); Lcd_Send_Chr(out_char); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCDコマンド出力関数 void Lcd_Cmd_Remote(char out_char) { Lcd_Send_Chr('E'); Lcd_Send_Chr(out_char); Lcd_Send_Chr(EOF); } //********************************************************************** //■ワイヤレスLCDデータ送信(1文字)関数 void Lcd_Send_Chr(unsigned short dt) { short cnt; //start-bit Pwm1_Start(); Delay_us(833); Pwm1_Stop(); //data-bit(LSB.....MSB) for (cnt = 0; cnt < 8; cnt++) { if ((dt & 0b00000001) != 0) { Delay_us(833); } else { Pwm1_Start(); Delay_us(833); Pwm1_Stop(); } // dt >>= 1; } //stop-bit Delay_us(833); // Delay_ms(10); } //********************************************************************** //■ワイヤレスLCDデータ送信(文字列)関数 void Lcd_Send_Str(unsigned short* pData) { while (*pData != 0x00) { Lcd_Send_Chr(*pData); pData++; } } //**********************************************************************