2025年12月18日木曜日

aqm1602 on pic16f18857(gokan IOT pedia)

 /***********IOT 3.2.1yori*******************************

 *  I2C接続のセンサとLCDを使う mccだけでOK すばらしい

 *  温湿度、気圧の表示

 *****************************************/

#include "mcc_generated_files/mcc.h"

#include "mcc_generated_files/examples/i2c1_master_example.h"

//#include "mcc_generated_files/weather.h"

// 変数定義

uint8_t Flag;

double temp, humi, pres;

char Line1[17], Line2[17]; // aqm1602は16x2 17は多すぎ

char Line1[]="0123456789012345";

char Line2[]="0000000000000000";

// 液晶表示器 コントラスト用定数

//#define CONTRAST  0x18    // for 5.0V

#define CONTRAST  0x25        // for 3.3V  bme280併用時はこれで

// 関数プロト

void lcd_data(char data);

void lcd_cmd(char cmd);

void lcd_init(void);

void lcd_str(char * ptr);

/***** タイマ0割り込み処理関数******/

void TMR0_Process(void){

    Flag = 1;

}

/***** メイン関数 ******/

void main(void)

{

    SYSTEM_Initialize();                    // システム初期化

    TMR0_SetInterruptHandler(TMR0_Process);

    INTERRUPT_GlobalInterruptEnable();

    INTERRUPT_PeripheralInterruptEnable();    

    lcd_init();                             // LCD初期化

    /****** メインループ ************/

    while (1)

    {    

        if(Flag == 1){

            Flag = 0;

            /** センサデータ読み出し **/

            //Weather_readSensors();

            //temp = Weather_getTemperatureDegC();

           // humi = Weather_getHumidityRH();            

            //pres = Weather_getPressureKPa() * 10;

            // 表示データ編集

           

           // sprintf(Line1, "T=%2.1fC  H=%2.1f%%", temp, humi);

           //              sprintf(Line2, "P=%4.1f hPa", pres);

            // LCD表示

            lcd_cmd(0x80);                      // 1行目

            lcd_str(Line1);

            lcd_cmd(0xC0);                      // 2行目

            lcd_str(Line2);

        }

    }

}

/****** 液晶表示器ライブラリ ***************/

/******************************

* 液晶へ1文字表示データ出力

*******************************/

void lcd_data(char data){

    I2C1_Write1ByteRegister(0x3E, 0x40, data); 

    __delay_us(30);                             // 処理待ち遅延

}

/*******************************

* 液晶へ1コマンド出力

*******************************/

void lcd_cmd(char cmd){

    I2C1_Write1ByteRegister(0x3E, 0x00, cmd);

    /* ClearかHomeのとき長遅延 */

    if((cmd == 0x01)||(cmd == 0x02))

        __delay_ms(2);                  // 2msec待ち

    else

        __delay_us(30);                 // 30μsec待ち

}

/*****************************

* 液晶表示器 文字列表示関数

*****************************/

void lcd_str(char * ptr){

    while(*ptr != 0)                    // 文字列最後まで

        lcd_data(*ptr++);               // 文字表示実行

}

/*******************************

*  液晶表示器 初期化関数

*******************************/

void lcd_init(void){

    __delay_ms(150);                    // ハード初期化待ち

    lcd_cmd(0x38);                      // 8bit 2line Normal mode

    lcd_cmd(0x39);                      // 8bit 2line Extend mode

    lcd_cmd(0x14);                      // OSC 183Hz BIAS 1/5

    /* コントラスト設定 */

    lcd_cmd(0x70 + (CONTRAST & 0x0F));

    lcd_cmd(0x5C + (CONTRAST >> 4));

//    lcd_cmd(0x6B);                    // Follower for 5.0V

    lcd_cmd(0x6B);                      // Follwer for 3.3V

    __delay_ms(300);

    lcd_cmd(0x38);                      // Set Normal mode

    lcd_cmd(0x0C);                      // Display On

    lcd_cmd(0x01);                      // Clear Display

}


0 件のコメント:

コメントを投稿