PICマイコンでI2Cを使って、 LCD 1602A を表示してみる。

  • IT
  • マイコン

PICマイコンでI2C制御の LCD を使用して文字を表示してみました。

I2C制御のプログラムと、簡単な説明については、この記事で書いています。

今回使用するプログラムは、その記事のものを使用しています。

使用機器

埋め込みコンテンツ

LCD 制御ヘッダープログラム(lcd_lib.h)

I2Cのアドレスは、0x3Fで動きました。動かない場合は、0x27とかに変えてみてください。

製品によってアドレスの値が異なるので、説明書を読んで調べてください。

#define LCD_ADD 0x3F //動かなければここのアドレスを変更する

#define En 0b00000100
#define Rs 0b00000001

void lcd_init();
void lcd_backlight();
void lcd_cmd(uint8_t cmd);
void lcd_clear();
void lcd_set_cursor(uint8_t col, uint8_t row);
void lcd_print(char *str);

void command(uint8_t val, uint8_t mode);

LCD 制御プログラム(lcd_lib.c)

/*
 * File:   lcd_lib.c
 * Author: dexte
 *
 * Created on October 4, 2020, 2:52 PM
 */

#include <xc.h>
#include "mcc_generated_files/device_config.h"

#include "i2c.h"
#include "lcd_lib.h"

#define ROW 2
#define COL 16

uint8_t _backlightval;

void lcd_cmd(uint8_t cmd){
    i2c_start();
    i2c_write(LCD_ADD  ROW){
        row = ROW - 1;
    }
    uint8_t cmd = 0x80 | (col + row_offsets[row]);
    command(cmd, 0);
}

void lcd_print(char *str) {
    while (*str) {
        uint8_t cmd = *str++;
        command(cmd, Rs);
    }
}

void command(uint8_t val, uint8_t mode){
    uint8_t highnib = (val & 0xf0) | _backlightval | mode;
	uint8_t lownib = ((val << 4) & 0xf0) | _backlightval | mode;

	lcd_cmd(highnib);
    lcd_cmd(highnib | En);
    lcd_cmd(highnib & ~En);

    __delay_us(100);

	lcd_cmd(lownib);
    lcd_cmd(lownib | En);
    lcd_cmd(lownib & ~En);
}

メインプログラム(main.c)


#include "mcc_generated_files/mcc.h"

#include "i2c.h"
#include "lcd_lib.h"

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    WPUB = 0x24;
    OPTION_REGbits.nWPUEN = 0;

    SSP2ADD = 0x13;
    SSP2CON1 = 0x28;
    SSP2CON2 = 0x0;
    SSP2STAT = 0;

    lcd_init();
    lcd_backlight();
    lcd_set_cursor(0, 0);

    lcd_print("HIZ");

    __delay_ms(1000);

    lcd_set_cursor(3, 0);
    lcd_print("12:00");

    while(1){}
}

埋め込みコンテンツ