/**
Generated main.c file from MPLAB Code Configurator(MCC)を使用した。
@Company
Microchip Technology Inc.
@File Name
main.c
@Summary
This is the generated main.c using PIC24 / dsPIC33 / PIC32MM MCUs.
@Description
This source file provides main entry point for system initialization
and application code development.
Generation Information :
Product Revision : PIC24 / dsPIC33 / PIC32MM MCUs - 1.166.1
Device : PIC24FV32KA302
The generated drivers are tested against the following:
Compiler : XC16 v1.41
MPLAB : MPLAB X v5.30
*
* 2020/04/04:最終編集後、変更しない。
*
* I2C でLCDを動かす
*
* LCD は、アイテンドの「基板付きI2CキャラクタLCDモジュール(16x2) [ATD1602CPB]」
* 参考にしたのは、以下のURL (2020/04/04現在)
* http://fujiharagiken.hatenablog.com/entry/2017/10/21/124650
*
* 参照は、「組込み系システム開発室by藤原技研M」のブログです。
*/
/*
(c) 2020 Microchip Technology Inc. and its subsidiaries. You may use this
software and any derivatives exclusively with Microchip products.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION
WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE
TERMS.
*/
/**
Section: Included Files
*/
// delay関数を使うのに必要。クロック周波数÷2が命令実行サイクル
#define FCY 16000000 // クロック周波数FOSC(32MHz)÷2
#include "mcc_generated_files/system.h"
#include "i2c1.h" // エラーが出るのでmcc_generated_files/より移動
// 以下もコンパイルは通るが警告>が出るので記述
#include <libpic30.h> // __delay_ms()に必要
#include <stdio.h> // sprintf()に必要
#include <string.h> // strlen()に必要
#include <ctype.h>
#include "p24FV32KA302.h" // ANSB TRISBbits. 等に必要
// =================================================
#define I2CLCD_AQM0802A 0x3E // 3FのLCDでも3Eと記述
/**
* コマンド書き込み
* @param device_address :I2Cデバイスのアドレス
* @param controlByte :コントロールバイト
* @param cmdData :コマンド
* @return
*/
uint8_t I2C1_write(uint8_t device_address, uint8_t controlByte, uint8_t cmdData) {
I2C1_MESSAGE_STATUS status = I2C1_MESSAGE_PENDING;
uint8_t write_buffer[2];
write_buffer[0] = controlByte;
write_buffer[1] = cmdData;
I2C1_MasterWrite(write_buffer, 2, device_address, &status);
int cnt = 0;
while (status == I2C1_MESSAGE_PENDING && cnt++ < 10) {
__delay_us(100);
}
return (status == I2C1_MESSAGE_COMPLETE);
}
/**
* LCDの指定アドレスに表示する
* @param str: 表示したい文字列
* @param num:表示バイト数
* @param LcdAddr LCDのDDRAM表示アドレス
*/
void WireLcdDisplay(char *str, int num, uint8_t LcdAddr) {
uint8_t dt[65]; //16文字まで対応 64文字に拡大
int i;
I2C1_MESSAGE_STATUS status = I2C1_MESSAGE_PENDING;
// Set DDRAM address コマンドをセットする
dt[0] = 0x40;
// 文字列をアスキーコードに変換して配列に格納する
for (i = 0; i < num; i++) {
dt[i + 1] = (uint8_t) str[i];
}
// Slaveへ制御コード:0x00
// コマンド:0x80 + DDRAMのアドレス
I2C1_write(I2CLCD_AQM0802A, 0x00, 0x80 | LcdAddr);
I2C1_MasterWrite(dt, num + 1, I2CLCD_AQM0802A, &status);
int cnt = 0;
while (status == I2C1_MESSAGE_PENDING && cnt++ < 10) {
__delay_us(100);
}
__delay_ms(1); // 追加して呼び出し側(main)に記述しない。
}
// これによって出力されるデータは以下の通りになります
// 【I2C1_writeによって出力されるデータ】
// 0x7C :LCDのアドレス
// 0x00 :コントロールバイト(RS=0:コマンド)※次はコマンドを送る
// 0x80 :コマンドバイト(SetDDRAMaddress + DDRAMアドレス)
//
// 【I2C1_MasterWriteによって出力されるデータ】
// 0x7C :LCDアドレス
// 0x40 :コントロールバイト(RS=1:データ)※次からデータを送る
// 表示データ(num個)
/**
* LCD の初期化処理
*/
void WireLcdInit(void) {
I2C1_MESSAGE_STATUS status = I2C1_MESSAGE_PENDING;
uint8_t sendData[ ] = {0x38, 0x39, 0x14, 0x70, 0x56, 0x6C, 0x38, 0x0C, 0x01};
I2C1_MasterWrite(sendData, sizeof (sendData) + 1, I2CLCD_AQM0802A, &status);
int cnt = 0;
while (status == I2C1_MESSAGE_PENDING && cnt++ < 10) {
__delay_us(100);
}
__delay_ms(1); // 追加して呼び出し側(main)に記述しない。
}
// これによって出力されるデータは以下の通りになります
// 【I2C1_MasterWriteによって出力されるデータ】
// 0x7C :LCDアドレス
// 0x38, 0x39, 0x14, 0x70, 0x56, 0x6C, 0x38, 0x0C, 0x01 :コマンド
/**
* LCD表示処理サンプル(事前にWireLcdInit ()を呼び出しておくこと)
*/
void LcdDisp(void) {
char str1[ ] = "Kitchen ";
char str2[ ] = "Timer ";
//------[ 表示(1行目)]------
WireLcdDisplay(str1, 8, 0x00);
//------[ 表示(2行目)]------
WireLcdDisplay(str2, 8, 0x40);
}
// =================================================
// 追加関数 jlb.jp
// 表示位置を指定して LCD に表示する
// ll = 行:0 or 1 ,cc 桁:0 to 15
// =================================================
void WireLcd_lxc_Print(uint8_t ll, uint8_t cc, char* txt) {
uint8_t ca, lc;
int ln = strlen(txt);
if (ln > 16) ln = 16;
ca = cc;
switch (ll) {
case 1:
lc = 0x40;
break;
default:
lc = 0x00;
}
if (ca > 15) ca = 15;
lc += ca;
WireLcdDisplay(txt, ln, lc);
}
// =================================================
// 追加関数 jlb.jp
// 画面表示をクリヤーする
//
// =================================================
void WireLcd_Clr(void) {
char sptext[17] = " ";
WireLcdDisplay(sptext, 16, 0x00);
WireLcdDisplay(sptext, 16, 0x40);
}
int gMode;
int gCount;
char temptxt[80];
/*
Main application
*/
int main(void) {
// initialize the device
SYSTEM_Initialize();
int loopCnt = 0;
ANSB = 0x0000; // PORTBアナログ入力なし 0 = デジタル入力バッファを有効にする
TRISBbits.TRISB5 = 0; // output PB5
__delay_ms(40);
WireLcdInit(); // LCD初期化
WireLcd_lxc_Print(0, 0, "teast JLB");
WireLcd_lxc_Print(1, 1, "2020/04/03 ");
__delay_ms(2000);
while (1) {
WireLcd_Clr(); // 画面表示をクリヤーする
if (loopCnt > 1000) {
loopCnt = 0;
} else {
loopCnt++;
}
if (LATBbits.LATB5 == 0) {
LATBbits.LATB5 = 1; // LED off (high)
WireLcd_lxc_Print(0, 0, "PB5 LED OFF"); // LCDにLEDの状態を文字で表示
} else {
LATBbits.LATB5 = 0; // LED on (low)
WireLcd_lxc_Print(0, 0, "LED On ABCD EFGHIJKxyz123");
}
sprintf(temptxt, "%4d", loopCnt);
WireLcd_lxc_Print(1, 3, temptxt); // 2行目の4桁目から表示
__delay_ms(500); // 500ms
}
return 1;
}
は、CPUの周波数や周辺デバイスを画面で設定していくと、コンフィグレーション・ビットだけでなく周辺デバイスのドライバ(的な物:ライブラリのような)ものまで吐き出してくれます。