MPLAB X + XC8 + MCCの環境で、PIC16F1705を使ったI2C LCD AQM0802Aの表示テストをします。回路図です。
電源は、乾電池2本(3V)ととし、PIC16F1705のI2Cポートはデフォルトで、RC0=SCL,RC1=SDAとします。AQM0802Aは、秋月電子のモジュールを使用します。

プロジェクトを作成し、MCCを立ち上げます。
System Moduleの設定です。
Clockは、INTOSC,FOSC,8MHz_HF,PLL Enableとして、32MHzで動作させています。

MSSPモジュールを導入します。
I2C,Masterモード,CLock=100000Hz(100KHz)としました。

Pin Moduleです。I2Cポートは、デフォルトで、RC0=SCL,RC1=SDAとなります。
AQM0802A Moduleには、プルアップ抵抗が内蔵されているのですが、一応ウィークプルアップ(WPU)を有効にしておきます。

Interruputは、デフォルトのままです。

プログラムです。1行目に「JH7UBC」を表示し、2行目に数字を0からカウントアップします。
printf関数を使うため、プロジェクトのPropertiesのXC8 Global OptionsのC standard をC90にします。
--------------------------------------------------------------------
/*
* PIC16F1705 MCC AQM0802A test
* 2022.4.2
* JH7UBC Keiji Hata
*/
#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c_master_example.h"
#define I2CLCD_AQM0802A 0x3e
//-------- send character ------------------------
void LCD_dat(uint8_t chr)
{
I2C_Write1ByteRegister(I2CLCD_AQM0802A, 0x40, chr);
__delay_us(30); // 30us
}
//-------- send command -------------------------
void LCD_cmd(uint8_t cmd)
{
I2C_Write1ByteRegister(I2CLCD_AQM0802A, 0x00, cmd);
if(cmd & 0xFC) // bit6 = 1
__delay_us(30); // 30us
else
__delay_ms(2); // 2ms Clear or Home
}
//-------- clear LCD--------------------------
void LCD_clr(){
LCD_cmd(0x01);
}
//--------- Home -----------------------------
void LCD_home(){
LCD_cmd(0x02);
}
//--------- Cursor X,Y -----------------------
void LCD_cursor(uint8_t x,uint8_t y){
if (y == 0)
LCD_cmd(0x80 + x);
if (y == 1)
LCD_cmd(0xc0 + x);
}
//-------- write 1 character to LCD ----------------
void putch(uint8_t ch){
LCD_dat(ch);
}
//-------- LCD initialize ---------------------------
void LCD_init(){
__delay_ms(40); //40ms wait
LCD_cmd(0x38); //8bit,2line
LCD_cmd(0x39); //IS=1 : extention mode set
LCD_cmd(0x14); //Internal OSC Frequency
LCD_cmd(0x70); //Contrast set
LCD_cmd(0x56); //Power/ICON/Contrast Control
LCD_cmd(0x6C); //Follower control
__delay_ms(200);//200ms wait
LCD_cmd(0x38); //IS=0 : extention mode cancel
LCD_cmd(0x0C); //Display ON
LCD_cmd(0x01); //Clear Display
__delay_ms(2); //wait more than 1.08ms
}
void main(void)
{
// initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();
LCD_init();
printf("JH7UBC");
uint8_t count = 0;
while (1)
{
LCD_cursor(2,1);
printf("%3d",count);
count++;
__delay_ms(1000);
}
}
--------------------------------------------------------------------
ブレッドボードです。

他のPinでI2Cを使いたい場合、MCCのPin ManagerでSCL,SDAに指定するPinを設定します。
例えば、RA0=SCL,RA1=SDAの場合は、下の図のように設定すればOKです。設定後、再びGenerateして、コンパイルしてPICにプログラムを書き込みます。
プログラムはそのままで、PICとAQM0802Aの接続を変更するだけで、動作します。
