JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1705 MCC AQM0802A表示テスト

2022-04-02 12:12:28 | MPLAB X MCC
 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の接続を変更するだけで、動作します。