MPLAB X XC8 MCC環境で、PIC16F1455におけるI2C接続LCD1602の表示テストをします。
PIC16F1455開発ボードにI2C接続のピンを増設し、ここにLCD1602を接続します。(プルアップ抵抗はLCD1602側についていますので、ボード上には付けていません。)
projectを作成し、MCCの設定をします。
まず、System Moduleの設定です。
クロックは、16MHzとしました。PLLは使いません。Clock Deviderも使いません。MSSPモジュールを導入し、I2Cに設定すると自動的にI2CのSCLがRC0に、SDAがRC1にセットされます。
Pin Moduleです。
MSSP Moduleの設定です。
I2C Masterに設定し、I2C Clockは100KHzとしました。
I2Cで割込みを使いますので、Interrupt Moduleで割込みにチェックを入れます。
この設定でGenerateします。
テストしたプログラムです。
プログラム自体はこれまで何度も使ったものですが、若干注意点があります。
まず、printf()関数を使うために、stdio.hをincludeします。
このままだとコンパイル時にエラーが出ますので、project propertiesを開き、XC8 Global OptionsでC standardをC90に設定します。
-----------------------------------------------------
/*
* PIC16F1455 MCC I2C LCD1602 TEST
* 2023.07.07
* JH7UBC Keiji Hata
*/
#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c_master_example.h"
#include <stdio.h>
#define I2C_LCD_addr 0x27
#define LCD_EN 0b00000100//Enable
#define LCD_BL 0b00001000//Back Light
#define LCD_CMD 0x00
#define LCD_CHR 0x01
#define LCD_LINE1 0x80
#define LCD_LINE2 0xC0
//I2C LCDに1byteのdataを書き込む
void I2C_write_data(uint8_t data){
I2C_Write1ByteRegister(I2C_LCD_addr, (data | LCD_EN | LCD_BL),(data | LCD_BL));
__delay_us(100);
}
//I2C LCDにコマンドまたは文字を送る
void LCD_write(uint8_t data, uint8_t mode){
//上位4bitを送る
I2C_write_data((data & 0xF0) | mode);
//下位4bitを送る
I2C_write_data(((data << 4) & 0xF0) | mode);
}
//I2C LCD 初期化
void LCD_init(){
__delay_ms(40);
LCD_write(0x33,LCD_CMD);//8bit mode set 2?
LCD_write(0x32,LCD_CMD);//8bit mode set 1?,4bit mode set
LCD_write(0x06,LCD_CMD);//Entry mode set
LCD_write(0x0C,LCD_CMD);//display ON,cursor OFF,blink OFF
LCD_write(0x28,LCD_CMD);//Function set 4bit mode,2line
LCD_write(0x01,LCD_CMD);//Clear display
__delay_ms(1);
}
void LCD_clear(){
LCD_write(0x01,LCD_CMD);
__delay_ms(1);
}
void LCD_home(){
LCD_write(0x02,LCD_CMD);
__delay_ms(1);
}
void LCD_cursor(uint8_t x,uint8_t y){
if(y == 0){
LCD_write(LCD_LINE1 + x,LCD_CMD);
}
if(y == 1){
LCD_write(LCD_LINE2 + x,LCD_CMD);
}
}
//1文字表示
void putch(char ch){
LCD_write(ch,LCD_CHR);
}
void main(void)
{
// initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();
LCD_init();
LCD_home();
printf("PIC16F1455");
uint8_t count = 0;
while (1)
{
LCD_cursor(1,1);
printf("%3d",count);
count ++;
__delay_ms(1000);
}
}
-----------------------------------------------------
PIX16D1455への書き込みが終わったらPICKit3を外し、LCD1602を接続して、電源を入れます。1行目にPIC16F1455と表示され、2行目にcountの値が1秒ごとにカウントアップされます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます