//********************************************************************** /*    <簡易ターミナル(LCD&Keypad)> */ //********************************************************************** //■■■インクルード■■■ #include "lib_terminal.h" //********************************************************************** //■■■関数&データ宣言■■■ extern void main(); extern void init_lcd(); extern void init_keypad(); extern char get_keypad(); extern void init_usart(); extern char recv_data[], recv_flg; extern void command_proc(char * cmd); extern void test_mode(); //********************************************************************** //■■■マクロ定義■■■ //keypad char keypadPort at PORTB; //LCD sbit LCD_RS at RA5_bit; sbit LCD_EN at RA4_bit; sbit LCD_D7 at RA0_bit; sbit LCD_D6 at RA1_bit; sbit LCD_D5 at RA2_bit; sbit LCD_D4 at RA3_bit; sbit LCD_RS_Direction at TRISA5_bit; sbit LCD_EN_Direction at TRISA4_bit; sbit LCD_D7_Direction at TRISA0_bit; sbit LCD_D6_Direction at TRISA1_bit; sbit LCD_D5_Direction at TRISA2_bit; sbit LCD_D4_Direction at TRISA3_bit; //USART sbit TX_Direction at TRISC.B6; sbit RX_Direction at TRISC.B7; //SW sbit SW at RE3_bit; //other #define INPUT_MODE 1 #define OUTPUT_MODE 0 //********************************************************************** //■■■メイン関数■■■ void main() { char kd; //クロックを8MHzに設定します。 OSCCON.IRCF2 = 1; OSCCON.IRCF1 = 1; OSCCON.IRCF0 = 1; //A/D変換は使用しません。 ADCON1.PCFG3 = 1; ADCON1.PCFG2 = 1; ADCON1.PCFG1 = 1; ADCON1.PCFG0 = 1; // init_lcd(); init_keypad(); init_usart(); Lcd_Out(1, 1, "terminal v1.00"); Delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); // 割り込みを許可します。 INTCON.PEIE = 1; INTCON.GIE = 1; // if (SW == 0) { test_mode(); } while (1) { //データの受信と表示 if (recv_flg == 1) { command_proc(recv_data); recv_flg = 0; } //キーの取得と送信 if ((kd = get_keypad()) != 0) { UART1_Write(kd); } } } //********************************************************************** //■■■LCD初期化関数■■■ void init_lcd() { Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); } //********************************************************************** //■■■キーパッド初期化関数■■■ void init_keypad() { Keypad_Init(); } //********************************************************************** //■■■キー取得関数■■■ char kp_tbl[17] = {0,'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D',}; char get_keypad() { char kd; // kd = Keypad_Key_Click(); if (kd != 0) { Delay_ms(100); } return (kp_tbl[kd]); } //********************************************************************** //■■■USART初期化関数■■■ void init_usart() { TX_Direction = OUTPUT_MODE; //USART->TX RX_Direction = INPUT_MODE; //USART->RX UART1_Init(9600); PIE1.RCIE = 1; PIR1.RCIF = 0; } //********************************************************************** //■■■割り込み関数■■■ char recv_data[32], recv_flg = 0; char recv_temp[32], recv_pnt = 0; void interrupt() { char rd; // if (PIR1.RCIF == 1) { PIR1.RCIF = 0; // rd = UART1_Read(); if (rd == STX) { recv_pnt = 0; return; } if (rd == ETX) { strncpy(recv_data, recv_temp, recv_pnt); recv_data[recv_pnt] = 0x00; recv_flg = 1; recv_pnt = 0; return; } recv_temp[recv_pnt] = rd; recv_pnt++; } } //********************************************************************** //■■■コマンド処理関数■■■ void command_proc(char * cmd) { short row = 0, col = 0; // switch (cmd[0]) { case 'A': //行と列を指定してテキストを表示する。 row = atoi(&cmd[2]); col = atoi(&cmd[5]); Lcd_Out(row, col, &cmd[8]); return; case 'B': //カーソル位置からテキストを表示する。 Lcd_Out_Cp(&cmd[2]); return; case 'C': //コマンド処理を行います。 Lcd_Cmd(cmd[2]); return; } } //********************************************************************** //■■■テスト関数■■■ void test_mode() { char kd; // while (1) { //データの受信と表示 if (recv_flg == 1) { command_proc(recv_data); recv_flg = 0; } //キーの取得と送信 if ((kd = get_keypad()) != 0) { switch (kd) { case '*': terminal_cmd(_LCD_CLEAR); break; case '#': terminal_put_str_cp("terminal test!"); break; case 'A': terminal_cmd(_LCD_TURN_ON); break; case 'B': terminal_cmd(_LCD_TURN_OFF); break; case 'C': terminal_cmd(_LCD_FIRST_ROW); break; case 'D': terminal_cmd(_LCD_SECOND_ROW); break; default: terminal_put_char_cp(kd); break; } } } } //********************************************************************** char terminal_stub_get_char() { if (UART1_Data_Ready() == 1) { return (UART1_Read()); } return (0); } void terminal_stub_put_char(char c) { UART1_Write(c); } //**********************************************************************