STM32F401でのLCDモジュール(AQM0802)の使い方

マイコンボードなので、LCDディスプレイをつないで表示を行っていこうと思う。
今回使うLCDモジュールはAQM0802である。
秋月で買えるモジュールキットがあるので、それを使っていく。
秋月電子→http://akizukidenshi.com/catalog/g/gK-06795/

CubeMXでピンの設定を行う

STM32F401-NucleoでI2C通信を行えるピンは「D14」と「D15」がSDAとSCLに対応している。
調べるとD14は「PB9」、D15が「PB8」になる。


最初にピンの設定で、「PB8」は「I2C1_SCL」を選択、「PB9」は「I2C1_SDA」を選択する。
選択すると黄色の状態になる。

左側のタブから「Connectivity」→「I2C1」をクリックする。

「Disable」を「I2C」に変更する。



変更すると、黄色になっていた状態から緑色の状態になるので設定の完了である。

「ファイル(F)」→「保存(S)」でソースコードにピンの設定を自動反映させる。

main.cでプログラムを書いていく

まずは「USER CODE BIGEN Includes」に「<string.h>」をインクルードする。


/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
/* USER CODE END Includes */

「Private user code」にこれらのコードを記述する。

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//instructionの送信
int LCD_WriteInstraction(uint8_t data)
{
    uint8_t buf[] = { 0x00, data };
    int status = HAL_I2C_Master_Transmit(&hi2c1, 0x7c, buf, 2, 1000);
    HAL_Delay(1);
    return status == HAL_OK;
}

// LCD の初期化
void LCD_Init()
{
    LCD_WriteInstraction(0x38);     // Function set
    LCD_WriteInstraction(0x39);     // Function set
    LCD_WriteInstraction(0x14);     // Internal OSC frequency
    LCD_WriteInstraction(0x70);     // Contrast set
    LCD_WriteInstraction(0x56);     // Power/ICON/Contrast set
    LCD_WriteInstraction(0x6c);     // Follower control
    HAL_Delay(200);
    LCD_WriteInstraction(0x38);     // Function set
    LCD_WriteInstraction(0x0c);     // Display ON/OFF control
    LCD_WriteInstraction(0x01);     // Clear Display
    HAL_Delay(1);
}

// DDRAM への書き込み
int LCD_WriteData(uint8_t data)
{
    uint8_t buf[] = { 0x40, data };
    int status = HAL_I2C_Master_Transmit(&hi2c1, 0x7c, buf, 2, 1000);
    HAL_Delay(1);
    return status == HAL_OK;
}

// 文字列の出力
void Puts(const char *p)
{
    for ( ; *p ; p++)
    {
        LCD_WriteData(*p);
    }
}

// ----------------------------------------
// LCDの1行目表示
// ----------------------------------------
void lcdDisp1(const char *p)
{
 LCD_WriteInstraction(0x80 + 0x00);
    for ( ; *p ; p++)
    {
        LCD_WriteData(*p);
    }
}

// ----------------------------------------
// LCDの2行目表示
// ----------------------------------------
void lcdDisp2(const char *p)
{
 LCD_WriteInstraction(0x80 + 0x40);
    for ( ; *p ; p++)
    {
        LCD_WriteData(*p);
    }
}

// ----------------------------------------
// 数値の表示
// ----------------------------------------
void lcdprint(int num) {
 char buf[10] = "";
 sprintf( buf, "%d", num );
 lcdDisp2( buf );
}

// ----------------------------------------
// 文字列表示関数
// ----------------------------------------
void lcdPrint( char* cp ) {
 while(*cp!=0x00) {
  LCD_WriteInstraction(*cp);
  cp++;
 }
}

/* USER CODE END 0 */

Arduinoで作成したAQM0802のコードをSTM32用に改造したものである。

「HAL_I2C_Master_Transmit」という関数を使っている。
これがHALライブラリでI2C通信を行うための関数らしい。
基本的に他のHALライブラリの関数と使い方は似ているようだ。
2つ目にLCDのアドレスを記述しているので、ほかのI2C通信機器を使うときはそこを変えてあげればいいと思う。
「string.h」をインクルードした理由は、「sprintf()関数」を使えるようにするためである。

これでAQM0802を使うための準備ができたので、LCDに文字を表示するプログラムを書いていく。


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_I2C1_Init();
  LCD_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  char str1[]="Hello";
  char str2[]="World";
  lcdDisp1(str1);
  lcdDisp2(str2);
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

ピン設定を初期化を行っている場所で、LCDの初期化プログラムを記述しておいた。
あとはLCD表示用に作成した関数を使って表示をしている。

実行結果がこちら。



Arduinoで作成したプログラムは、STM32に流用することが出来ることが多い。
初めて使うようなセンサは、一度Arduinoで作成してからSTM32用に作っていくのが初心者には作りやすいと思う。







コメント

このブログの人気の投稿

STM32CubeIDEに日本語化プラグインを導入する

STM32F401でLチカをする(LED点灯)

STM32F401-Nucleoでシリアル通信をやってみる