YS電子工作ラボ


   キャラクタ液晶表示方法
    (4ビットパラレル制御)

                         (→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード


<はじめに>

   キャラクタ液晶に文字を表示できるようになっているといろいろな場合に役に立ちます。 電子機器の入出力表示だけでなく、開発段階でのデバックなどにも使えます。 仕様、価格、入手性から、キャラクタ液晶としてはアスキー文字やANK文字(半角カタカナなど)16文字x2列で表示できる秋月電子の
LCDキャラクタディスプレイモジュール(16x2行バックライト無)SC1602BS-Bがおすすめです。
 以下に、このキャラクタ液晶をPIC32MZで使用した例を紹介します。 使用している液晶表示ライブラリは後閑哲也さんがつくられたCCSコンパイラ用液晶表示ライブラリ 1lcd_lib.cをもとに、XC32コンパイラ対応等で変更したものです。




<仕様>
 ・PIC32MZが立ち上がったら以下をキャラクタ液晶に表示する。
  尚、キャラクタ液晶は秋月電子のLCDキャラクタディスプレイモジュール(16x2行バックライト無)SC1602BS-Bとする。
   1行目: "PIC32MZ HARMONY"
   2行目: "Now Running !!"
 ・その後、キャラクタ液晶は画面1と画面2を2sec毎に切り替えて表示する。  
   画面1 : 1行目: "Hellow World !!"
          2行目: "ASCII Moji N=XXX"
   画面2 : 1行目: "ミナサン コンニチワ !!"
          2行目: "ANK: Moji N=XXX"
        (注) XXXはの繰り返した回数、
 ・キャラクタ液晶制御は以下とする。
    4ビットパラレル制御
    データピン: DB4……RA9、DB5……RA10、DB6……RB11、DB7……RA1
    制御ピン : rs……RB6、stb……RB7、


<回路図>(→PDFファイル



<外観>
   PIC32MZ評価ボード MZ100-A001の マザーボードにQFPモジュールとキャラクタ液晶を取り付けたものです。



<動作結果> (プログラム動作中の動画がYouTubeで再生します → 動画

液晶画面1  液晶画面2 
   



<解説>
 キャラクタ液晶ライブラリの使い方について説明します。
  尚、解説では、画面1と画面2を2sec毎に表示する部分については省略してあります。

 ■ 適用液晶

  名称  型式 適用
電圧
バックライト  文字数
(ASCII、ANK文字)
 備考
LCDキャラクタディスプレーモジュール  SC1602BS-B  5v  無 16文字x2行  PIC32MZ評価ボードで使用
LCDキャラクタディスプレーモジュール   SC1602BSLB  5v  有 16文字x2行  
LCDキャラクタディスプレーモジュール   SC1602BBWB-XA-GB-G  5v ブルー背景白文字
バックライト付白抜き
16文字x2行  
④  LCDキャラクタディスプレーモジュール   SC1602BBWB-XA-LB-G  3.3v ブルー背景白文字
バックライト付白抜き
16文字x2行  


 ■ 液晶の各ピンへの接続要領
   4ビットパラレル制御を行い、また液晶からPICへのチェック信号はすべてOKとして確認制御を省略しますので 実際にPIC側から制御するピンは
  RS、E(STB)、DB4、DB5、DB6、DB7の6ピンだけとなります。 液晶のVddが5vでも 液晶の各ピンの入力 H レベルのスレッシュホールドレベルは
  2.2v ~ Vdd、 入力 L レベルのスレッシュホールドれべるは-0.3v ~ +0.6vなのでPICのポートと直結できます。
   尚、制御に使用するピンは 連続したポート(例えばRB0、RB1、RB2、RB3)である必要はありません。任意の6つの汎用I/OポートでOKです。

ピン番号   名称  内容 接続要領
 1  GND   GNDに接続します。 
 2  Vdd   Vdd(5.5v or 3.3v)に接続します。
 3  V0  コントラスト調整用ピン 可変抵抗により 0 ~ Vdd(5.5v or 3.3v)が印加できるように
します。
 4  RS  レジスタセットピン、コマンドモードorデータモードの設定 PICの汎用I/Oポートをデジタルの出力モードで接続します。 
 5  R/W  読み込みモード or 書き込みモードの設定  本ライブラリでは液晶への書き込みモードのみを
使用するので 常にGND(書き込みモード)に接続します。
 6  E(STB)  ストローブピン、データ送信のタイミングを示す  PICの汎用I/Oポートをデジタルの出力モードで接続します。
 7  DB0 下位4ビットデータ    本ライブラリでは、4ビットパラレルモードで制御を行うので
DB0-DB3は使用しません。したがって、すべてGNDに接続
します。
 8  DB1
 9  DB2
 10  DB3
 11  DB4 上位4ビットデータ    ・本ライブラリでは、この4ビットでコマンドとデータの送信を
行います。
・PICの汎用I/Oポートをデジタルの出力モードで接続します。
 12  DB5
 13  DB6
 14  DB7


   以下、接続例として Vdd = 5v PIC32MZ2048EFH100の制御電圧3.3v、 制御の各ピンが下記の場合の接続要領を下記回路図(→PDFファイル)に示します。
        RS……RB6、 E(STB)……RB7、DB4……RA9、DB5……RA10、DB6……RB11、DB7……RA1  






 ■ プロジェクトへの追加、インクルード
   キャラクタ液晶のライブラリは 1lcd_lib_XC32.h、と1lcd_lib_XC32.c に分かれています。
   
   ① 1lcd_lib_XC32.h と1lcd_lib_XC32.cを main.cがあるフォルダにコピーします。

   ② 1lcd_lib_XC32.h と1lcd_lib_XC32.cをプロジェクトに追加します。



   ③ ダウンロードした1lcd_lib_XC32.hは、PIC32MZ2048EFH100でRS……RB6、 E(STB)……RB7、DB4……RA9、DB5……RA10、
      DB6……RB11、DB7……RA1 の場合です。他のポートに変更する場合は MPLABXやエディタで所要(PICのポート名、
      ポートの出力モード設定、ポートのデジタルモード設定等)の修正を行います。下記の青線太字部を精読して、同様の要領で
      修正してください。
 当然のことながらアナログポート仕様がないポートを使用する場合はデジタルポート設定のコマンドは不要です。
       この1lcd_lib_XC32.hのファイルの中で全ポートの出力モード設定、ポートのデジタルモード設定等を行うのでMHC
      (MPLABX Harmony Configurator)での設定は必要ありません。

      また、システムクロックを変更する場合は、#define lcd_Clock 200000000 を変更してください。 たとえば200MHz → 100MHzに
      変更する場合は #define lcd_Clock 100000000  に変更してください。

       
//*************************************************************************
//インクルードファイル    1lcd_lib_XC32.h
//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ 
//1lcd_lib.cをもとに、XC32コンパイラ対応等で変更したものです。
//*************************************************************************
#include <p32xxxx.h>

#define lcd_Clock   200000000        //システムクロック     //単位はHzで指定


// LCDポート設定
#define	lcd_port_DB7	LATAbits.LATA1	//LCDのDB7(14番ピン)に接続されるPIC側ポート番号設定
#define	lcd_port_DB6	LATBbits.LATB11	//LCDのDB6(13番ピン)に接続されるPIC側ポート番号設定
#define	lcd_port_DB5	LATAbits.LATA10	//LCDのDB5(12番ピン)に接続されるPIC側ポート番号設定
#define	lcd_port_DB4	LATAbits.LATA9	//LCDのDB4(11番ピン)に接続されつPIC側ポート番号設定
#define	lcd_rs		LATBbits.LATB6	//LCDのrs(4番ピン)に接続されるPIC側ポート番号設定
#define	lcd_stb		LATBbits.LATB7	//LCDのstb(6番ピン)に接続されるPIC側ポート番号設定


//LCDポート: 出力モード設定
#define lcd_port_DB7_ConfigOut()   TRISAbits.TRISA1 = 0
#define lcd_port_DB6_ConfigOut()   TRISBbits.TRISB11 = 0
#define lcd_port_DB5_ConfigOut()   TRISAbits.TRISA10 = 0
#define lcd_port_DB4_ConfigOut()   TRISAbits.TRISA9 = 0
#define lcd_rs_ConfigOut()     TRISBbits.TRISB6 = 0
#define lcd_stb_ConfigOut()    TRISBbits.TRISB7 = 0


//LCDポート: デジタルモード設定
#define lcd_port_DB7_ConfigDigital()   ANSELAbits.ANSA1 = 0
#define lcd_port_DB6_ConfigDigital()   ANSELBbits.ANSB11 = 0
#define lcd_port_DB5_ConfigDigital()   ANSELAbits.ANSA10 = 0
#define lcd_port_DB4_ConfigDigital()   ANSELAbits.ANSA9 = 0
#define lcd_rs_ConfigDigital()   ANSELBbits.ANSB6 = 0
#define lcd_stb_ConfigDigital()   ANSELBbits.ANSB7 = 0



void lcd_out(volatile char code, volatile char flag);
void lcd_data(volatile char asci);
void lcd_cmd(volatile char cmd);
void lcd_clear(void);
void lcd_init(void);
void lcd_str(char *str);
   
       
 
//**************************************************************************
//インクルードファイル    1lcd_lib_XC32.c
//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ
// 1lcd_lib.cをもとに、XC32コンパイラ対応等で変更したものです。
//**************************************************************************

///////////////////////////////////////////////
//  液晶表示器制御ライブラリ for XC32コンパイラー
//  内蔵関数は以下
//  lcd_init()    ----- 初期化
//    lcd_cmd(cmd)  ----- コマンド出力
//    lcd_data(chr) ----- 1文字表示出力
//    lcd_clear()   ----- 全消去
//  lcd_str(str*) ----- 文字列表示	
//////////////////////////////////////////////

#include	"1lcd_lib_XC32.h"

void lcd_delay_us(volatile unsigned int usec)	//1μsec遅延関数
{
	volatile int count;

	count = (int)(lcd_Clock/20000000)*usec;

        do      //実測: at 200MH (Clock=200000000)
        {       //delay_us(1000)→1000.4μsec、 delay_us(100)→100.6μsec、delay_us(10)→10.5μsec、delay_us(1)→1.5μsec
                asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");asm("NOP");
                asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");

                count--;
        }while(count != 0);
        

}

void lcd_delay_ms(volatile unsigned int msec)	//1msec遅延関数
{
	volatile unsigned int i;
	
	for(i=0; i<msec; i++)
	lcd_delay_us(1000);
}


//////// データ出力サブ関数
void lcd_out(volatile char code, volatile char flag)
{
	if(code & 0b10000000)lcd_port_DB7 = 1;	//LCDのDB7への出力セット
	else lcd_port_DB7 = 0;
	if(code & 0b01000000)lcd_port_DB6 = 1;	//LCDのDB6への出力セット
	else lcd_port_DB6 = 0;
	if(code & 0b00100000)lcd_port_DB5 = 1;	//LCDのDB5への出力セット
	else lcd_port_DB5 = 0;
	if(code & 0b00010000)lcd_port_DB4 = 1;	//LCDのDB4への出力セット
	else lcd_port_DB4 = 0;

	if (flag == 0)
		lcd_rs = 1;			// 表示データの場合
	else
		lcd_rs = 0;			// コマンドデータの場合

        lcd_delay_us(3);		//3μsecウェイト
//	lcd_delay_us(1);		//1μsecウェイト
		
	lcd_stb = 1;			// strobe(E) ON (Enable)
        lcd_delay_us(3);		//3μsecウェイト
//	lcd_delay_us(1);		// 1μsec : strobe信号の幅

	lcd_stb = 0;			// reset strobe
}

//////// 1文字表示関数
void lcd_data(volatile char asci)
{
	lcd_out(asci, 0);		// 上位4ビット出力
	lcd_out(asci<<4, 0);	// 下位4ビット出力
	lcd_delay_us(50);		//50μsecウェイト
}

/////// コマンド出力関数
void lcd_cmd(volatile char cmd)
{
	lcd_out(cmd, 1);		// 上位4ビット出力
	lcd_out(cmd<<4, 1);		// 下位4ビット出力
	if((cmd & 0x03) != 0)	// clear Homeの場合
	lcd_delay_ms(2);	//	2msec待ち
	else
	lcd_delay_us(50);	//50μsecウェイト	
}

/////// 全消去関数
void lcd_clear(void)
{
	lcd_cmd(0x01);			// 初期化コマンド出力
}

/////// 文字列出力関数
void lcd_str(char* str)      
{
	while(*str)				//文字列終端の '\0'を検出するまで
	{
		lcd_data(*str);		// 1文字表示
		str++;				//ポインタをインクリメント				
	}       
}


/////// 初期化関数
void lcd_init(void)
{
      //LCDポート: 出力モード設定
    lcd_port_DB7_ConfigOut();
    lcd_port_DB6_ConfigOut();  
    lcd_port_DB5_ConfigOut();
    lcd_port_DB4_ConfigOut();
    lcd_rs_ConfigOut();
    lcd_stb_ConfigOut();

    //LCDポートデジタルポート設定
    lcd_port_DB7_ConfigDigital();
    lcd_port_DB6_ConfigDigital();
    lcd_port_DB5_ConfigDigital();
    lcd_port_DB4_ConfigDigital();
    lcd_rs_ConfigDigital();
    lcd_stb_ConfigDigital();
    
	lcd_delay_ms(20);		//20msecウェイト
	lcd_out(0x30, 1);		// 8bit mode set
	lcd_delay_ms(5);		//5msecウェイト
	lcd_out(0x30, 1);		// 8bit mode set
	lcd_delay_ms(1);		//1msecウェイト
	lcd_out(0x30, 1);		// 8bit mode set
	lcd_delay_ms(1);		//1msecウェイト
	lcd_out(0x20, 1);		// 4bit mode set
	lcd_delay_ms(1);		//1msecウェイト
	lcd_cmd(0x2E);			// DL=0 4bit mode
	lcd_cmd(0x08);			// display off C=D=B=0
	lcd_cmd(0x0D);			// display on C=D=1 B=0
	lcd_cmd(0x06);			// entry I/D=1 S=0
	lcd_cmd(0x02);			// cursor home
}

    ④ MHC設定
      Options

項目 Config設定 
MHC  
備考 デフォルトからの変更要領:
 FPLLIDIV: DIV3
 FPLLICLK: PLL_POSC
 POSCMOD: EC

システムクロック周波数: 200MHz
外部OSC: 24MHz
タイマ用ペリフェラルクロック
     周波数(PBCLK3): 100MHz


#pragma config FNOSC = SPLL
#pragma config POSCMOD = EC
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLICLK = PLL_POSC
#pragma config FPLLMULT = MUL_50
#pragma config FPLLODIV = DIV_2  


     Pin Settings

項目 ポート設定
MHC  
備考 デフォルトからの変更要領
 RG15/Function: GPIO_OUT
        (LED出力ポート設定)






    ⑤ app.cに青字のコードを追記します。
      1. ファイルをインクルードします。
        #include <stdio.h>
        #include "1lcd_lib_XC32.h"


        (注) sprintf()を使うのでstdio.hをインクルードしないとコンパイルで警告がでます。

      2. 表示文字列1行分のバッファを確保します。
        char Buf[32];
        (注) 17バイトが最少ですが 余裕がないと難解な不具合が発生することがあります。

      3.   ミナサン コンニチ ワ ! !の文字列Minasan_Konnichiwa[]をANK(Alphabet Numeric Kana: アンク)コードで定義します。
        char Minasan_Konnichiwa[]
        = {0xD0,0xC5,0xBB,0xDD,0x20,0xBA,0xDD,0xC6,0xC1,0xDC,0x20,0x21,0x21,0x20,0x20,0x20,0x00};
        //  ミ  ナ  サ  ン     コ  ン  ニ  チ   ワ ! !


      4.  μsec、msecの遅延関数 delay_us( )、delay_ms( )を定義します。

        void delay_us(volatile unsigned int usec) //1μsec遅延
        {
          volatile int count;
          count = (int)(delay_Clock/20000000)*usec;

         ……
         ……

      5. APP_Initialize ( )で、ライブラリファイルを初期化します。
        lcd_init(); // LCD初期化

      6. カーソルを非表示、ブリンクOFFにします。
        lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF
        (注)カーソルを表示して、ブリンクさせる場合は、lcd_cmd(0b00001111); とします。
          その他の液晶表示に関する各種コマンドは液晶に付属してくるデータシートを参照してください。

      7. 表示をクリアします。
        lcd_clear();
        (注)ここでは、lcd_init(); の直後なので無くてもかまいません。

      8. 表示の開始位置を1行目の先頭に設定します。
        lcd_cmd(0x80); //1目の先頭へ

      9. 表示したい文字をバッファーにコピーします。
        sprintf(Buf,"PIC32MZ HARMONY ");//

      10. バッファーの文字列を液晶に表示します。
        lcd_str(Buf);

      11. 表示の開始位置を2行目の先頭に設定します。
        lcd_cmd(0xC0); //2行目の先頭へ

      12. 表示したい文字をバッファーにコピーします。
        sprintf(Buf,"Now Running !! ");

      13. バッファーの文字列を液晶に表示します。
        lcd_str(Buf);

      14. LEDが点灯した場合
         液晶1行目にHellow World !!を表示します。
        また、液晶2行目には LED: ONと点灯回数XXをN=XXと 2秒間表示します。
       if(LED == 0)
       {
         Num++;

         LED = 1;
         PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, 15 ); //RG15: LED点灯
         // LATGbits.LATG15 = 1; //レジスタ直接

         lcd_cmd(0x80); //1目の先頭へ
         sprintf(Buf,"Hellow World !! ");//
         lcd_str(Buf); //液晶表示
         lcd_cmd(0xC0); //2行目の先頭へ
         sprintf(Buf,"LED:ON N=%d ",Num); //
         lcd_str(Buf); // 開始メッセージ1行目表示

         delay_ms(2000);

        }


       15. LEDが消灯した場合
         液晶1行目に ミナサン コンニチ ワ ! !を表示します。
        また、液晶2行目には LED: OFFと点灯回数XXをN=XXと 2秒間表示します。
       else
       {
         LED = 0;
         PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, 15 ); //RG15: LED消灯
         // LATGbits.LATG15 = 0;

         lcd_cmd(0x80); //1目の先頭へ
         sprintf(Buf,Minasan_Konnichiwa);//
         lcd_str(Buf); //液晶表示
         lcd_cmd(0xC0); //2行目の先頭へ
         sprintf(Buf,"LED:OFF N=%d ",Num); //
         lcd_str(Buf); // 開始メッセージ1行目表示

         delay_ms(2000);

       }

以下、app.c

        



     (参考)
      ★ プログラムの中で使っている整数を表示する。
        int Value = 56789;
        sprintf(Buf, "Num = %d",Value);

        <実行結果>
       

      ★ プログラムの中で使っている浮動小数(小数点5桁以下を四捨五入して、表示は小数点以下4桁まで)を表示する。
        float Value = 1.2345678;
        sprintf(Buf,"Value = %.4f", Value); //

        <実行結果>
       

      ★ カタカナを表示する。
        char Minasan_Konnichiwa[]
            = {0xD0,0xC5,0xBB,0xDD,0x20,0xBA,0xDD,0xC6,0xC1,0xDC,0x20,0x21,0x21,0x20,0x20,0x20,0x00};
            //  ミ   ナ   サ   ン     コ   ン   ニ   チ   ワ       !   !
        sprintf(Buf,Minasan_Konnichiwa);

         <実行結果>
        




      

    

          


/******************************************************************************* MPLAB Harmony Application Source File Company: Microchip Technology Inc. File Name: app.c Summary: This file contains the source code for the MPLAB Harmony application. Description: This file contains the source code for the MPLAB Harmony application. It implements the logic of the application's state machine and it may call API routines of other MPLAB Harmony modules in the system, such as drivers, system services, and middleware. However, it does not call any of the system interfaces (such as the "Initialize" and "Tasks" functions) of any of the modules in the system or make any assumptions about when those functions are called. That is the responsibility of the configuration-specific system files. *******************************************************************************/ // DOM-IGNORE-BEGIN /******************************************************************************* Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved. Microchip licenses to you the right to use, modify, copy and distribute Software only when embedded on a Microchip microcontroller or digital signal controller that is integrated into your product or third party product (pursuant to the sublicense terms in the accompanying license agreement). You should refer to the license agreement accompanying this Software for additional information regarding your rights and obligations. SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. *******************************************************************************/ // DOM-IGNORE-END // ***************************************************************************** // ***************************************************************************** // Section: Included Files // ***************************************************************************** // ***************************************************************************** #include "app.h" #include <stdio.h> #include "1lcd_lib_XC32.h" char Buf[32]; // ***************************************************************************** // ***************************************************************************** // Section: Global Data Definitions // ***************************************************************************** // ***************************************************************************** // ***************************************************************************** /* Application Data Summary: Holds application data Description: This structure holds the application's data. Remarks: This structure should be initialized by the APP_Initialize function. Application strings and buffers are be defined outside this structure. */ APP_DATA appData; // ***************************************************************************** // ***************************************************************************** // Section: Application Callback Functions // ***************************************************************************** // ***************************************************************************** /* TODO: Add any necessary callback functions. */ // ***************************************************************************** // ***************************************************************************** // Section: Application Local Functions // ***************************************************************************** // ***************************************************************************** /* TODO: Add any necessary local functions. */ // ***************************************************************************** // ***************************************************************************** // Section: Application Initialization and State Machine Functions // ***************************************************************************** // ***************************************************************************** /******************************************************************************* Function: void APP_Initialize ( void ) Remarks: See prototype in app.h. */ void APP_Initialize ( void ) { /* Place the App state machine in its initial state. */ appData.state = APP_STATE_INIT; /* TODO: Initialize your application's state machine and other * parameters. */ lcd_init(); // LCD初期化 lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); lcd_cmd(0x80); //1目の先頭へ sprintf(Buf,"PIC32MZ HARMONY ");// lcd_str(Buf); lcd_cmd(0xC0); //2行目の先頭へ sprintf(Buf,"Now Running !! "); // lcd_str(Buf); // 開始メッセージ1行目表示 } /****************************************************************************** Function: void APP_Tasks ( void ) Remarks: See prototype in app.h. */ void APP_Tasks ( void ) { /* Check the application's current state. */ switch ( appData.state ) { /* Application's initial state. */ case APP_STATE_INIT: { bool appInitialized = true; if (appInitialized) { appData.state = APP_STATE_SERVICE_TASKS; } break; } case APP_STATE_SERVICE_TASKS: { break; } /* TODO: implement your application state machine.*/ /* The default state should never be executed. */ default: { /* TODO: Handle error in application's state machine. */ break; } } } /******************************************************************************* End of File */
 


     ⑤ プロジェクトをビルトして、実行ファイルをPICに書き込みます。

      <実行結果>