I2C CPU=PIC16F886 IO=PCF8574AN LCD=AQM1602XA

他力本願 C言語第二弾です
Extention I/O PCF8574AN で得られたデータをLCD AQM1602XAに表示するだけです
今回参考にしたホームページは ツール・ラボ  さん、めっちゃ判りやすいです

ただ、やっていて未熟な故に未だ上手く行かない部分も有ります
・電源投入時 0x00  が 0x0 と表示される
・10進表示すると例えば 255 –>  16  と成るべきなのに 165  と成って仕舞う
 詰まり 5 が消えずに残ってしまうのです、ここをクリアとか空白を入れたのですが
 今度は文字化けが起きたりと未だ哀しいかな低次元を自覚しています

ソース、醜く幼稚で恥ずかしいです
/*
* File:   main.c
* Author: maru
* PCF8574AN_pic16f886_v007
* Created on 2019/01/09, 8:57
* 0 -> 1 -> 2...32768 -> -32768 -> -32767...-3 -> -2 -> -1 -> 0 の繰り返し
*/
//******************************************************************************
//コンフィギュレーション
// CONFIG1 MPLAB XIDEの Production -> Set Configration bits で設定してもこのプログラムでの宣言が優先される
//#pragma config FOSC = INTRC_NOCLKOUT //RA6 = I/O          //デフォルトではRA6 = fosc/4 output
#pragma config FOSC = INTRC_NOCLKOUT //RA6 = fosc/4 no-output
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config FCMEN = OFF
// CONFIG2
#pragma config WRT = OFF
#pragma config BOR4V = BOR40V
#pragma config LVP = ON
//******************************************************************************
//コンパイラ
#include 
#include 
#include 
#include 
//******************************************************************************
//マクロ
#define _XTAL_FREQ 8000000      //PIC16F886はINTOSC時最高8MHzまでしか出ない下のOSCCON = 0x70;と矛盾しては成らない
#define LCD_ADD 0x7C            //LCDスレーブアドレス W
#define S5851A_ADR 0x90         //温度センサースレーブアドレス W
#define PCF8574AN_ADR 0x70      //Extentioned IO スレーブアドレス W
#define PCF8574AN_ADR_R 0x73      //Extentioned IO スレーブアドレス W
#define ToHome 0b00000010
#define shiftLeft 0b00011000
#define shiftRight 0b00011100
#define clear 0b00000001
//******************************************************************************
static unsigned char I2C_rcv();
static void I2C_nacksnd() ;
static unsigned char I2C_ackchk();
char moji[] = " ";
char moji2[] = "PCF8574AN=0x ";
char moji3[] = "v007";      //この文字列を長くするとカウントアップがバグる、原因不明
char moji4[] = "      ";    //空白を書く、前の文字が残って邪魔をするから
unsigned char k;            // k = PCF8574ANから読み込んだデータ、char型 保存できる値は-127?127  //unsigned char型 保存できる値は 0-255です
//******************************************************************************
void TRIGGER(){
PORTAbits.RA0 = 1;    //for debug オシロスコープ・トリガ用 PORTA-RA0
__delay_us(10);
PORTAbits.RA0 = 0;
}
//-------------------------------
void I2C_Master_Init(const unsigned long c)
{
SSPCON  = 0b00101000;     //RC3/SCK/SCL  RC4/SDI/SDA として使用宣言
SSPCON2 = 0;
SSPADD = (_XTAL_FREQ/(4*c))-1;
SSPSTAT = 0b00000000 ;    // 標準速度モードに設定する(100kHz)
}
//-------------------------------
void I2C_Init()
{
SSPCON  = 0x28;     //RC3/SCK/SCL  RC4/SDI/SDA として使用宣言
SMP = 1;
CKE = 0;
SSPADD = 0x21;      //PICがスレーブの時の自分のスレーブアドレス、使わない
}
//-------------------------------
void I2C_Master_Wait()
{
while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));
}
//-------------------------------
void I2C_Master_Start()
{
I2C_Master_Wait();
SEN = 1;
}
//-------------------------------
void I2C_Master_RepeatedStart()
{
I2C_Master_Wait();
RSEN = 1;
}
//-------------------------------
//    void I2C_Master_Stop()
//    {
//      I2C_Master_Wait();
//      PEN = 1;
//    }
// ストップコンディション生成 ↑代替 maru
void I2C_Master_Stop() {
// SSP1CON2レジスタのPENビットを1に設定すると
// ストップコンディションが生成される
// 発行が完了するとSSP1IFが1になるのでwhile文で待つ
SSPIF = 0;
SSPCON2bits.PEN = 1;
while (SSPIF == 0) {}
SSPIF = 0;
return;
}
//-------------------------------
//    void I2C_Master_Write(unsigned d)
//    {
//      I2C_Master_Wait();
//      SSPBUF = d;
//    }
//代替↑
void I2C_Master_Write(unsigned d)
// SSP1BUFに送信したいデータをセットすると、そのデータが送信される
// 発行が完了するとSSP1IFが1になるのでwhile文で待つ
// ACK 待ちは無い、https://tool-lab.com/make/pic-practice-40/
{
I2C_Master_Wait();                  //これが無いと全く出鱈目に成る 
SSPIF = 0;
SSPBUF = d;
while (SSPIF == 0) {}
SSPIF = 0;
//   return;
}
//-------------------------------
// I2C ACK check
static unsigned char I2C_ackchk() {
unsigned char i2c_data;
if (ACKSTAT) {
i2c_data = 0xFF;
} else {
i2c_data = 0x00;
}
return(i2c_data);
}
//-------------------------------
// I2C Recive
//static unsigned char I2C_rcv() {
//	SSPIF = 0;
//	RCEN = 1;
//	while (RCEN) {}
//	return(SSPBUF);
//}
static unsigned char I2C_rcv() {
SSPIF = 0;
SSPCON2bits.RCEN = 1;
while (SSPIF == 0) {}
SSPIF = 0;
return SSPBUF;
}
//-------------------------------
// I2C NACK send
//static void I2C_nacksnd() {
//	ACKDT = 1;
//	ACKEN = 1;
//	while (ACKEN) {}
//	return;
//}
static void I2C_nacksnd() {
// ACKDTにNACKをセット(負論理なので1を設定)
SSPCON2bits.ACKDT = 1;
// NACK信号生成
SSPCON2bits.ACKEN = 1;
while (SSPCON2bits.ACKEN) {}
return;
}
//-------------------------------
void writeData(char t_data){
I2C_Master_Start();             //スタート・コンディション
I2C_Master_Write(LCD_ADD);      //0x7C スレーブアドレス
I2C_Master_Write(0x40);         //0x40  キャラクタを書くよって宣言
I2C_Master_Write(t_data);       //キャラクタの送信
I2C_Master_Stop();              //ストップ・コンディション
__delay_ms(10);
}
//-------------------------------
void writeCommand(char t_command){
I2C_Master_Start();
I2C_Master_Write(LCD_ADD);
I2C_Master_Write(0x00);
I2C_Master_Write(t_command);
I2C_Master_Stop();
__delay_ms(10);
}
//-------------------------------
void PICinit(){
OSCCON = 0x70;          //0x70=8MHz PIC16F886はINTOSC時最高8MHzまでしか出ない上の#define _XTAL_FREQ 8000000;と矛盾しては成らない
ANSEL  = 0b00000000;
ANSELH = 0b00000000;
TRISA  = 0b00000000;
TRISB  = 0b00000000;
TRISC  = 0b00011000;
PORTA  = 0b00000000;    //2進数で書いた場合
PORTB  = 0x00;          //16進数で書いた場合
}
//******************************************************************************
void LCD_Init(){            //LCDの初期化、秋月のマニュアル通り
//TRIGGER();                //for debug オシロスコープ・トリガ用 PORTA-RA0
I2C_Master_Init(100000);
__delay_ms(400);
//TRIGGER();                //for debug オシロスコープ・トリガ用 PORTA-RA0
writeCommand(0x38);       //このプロトコルは S 0x7C 0x00 0x38 A P と成っているから下のプロトコルも全部一個ずつ送信している
__delay_ms(20);
writeCommand(0x39);
__delay_ms(20);
writeCommand(0x14);
__delay_ms(20);
writeCommand(0x73);
__delay_ms(20);
writeCommand(0x52);
__delay_ms(20);
writeCommand(0x6C);
__delay_ms(250);
writeCommand(0x38);
__delay_ms(20);
writeCommand(0x01);
__delay_ms(20);
writeCommand(0x0C);
__delay_ms(20);
}
//-------------------------------
void LCD_str(char *c) {     //LCDに配列の文字を表示
unsigned char i,wk;
for (i=0 ; ; i++) {
wk = c[i];
if  (wk == 0x00) {break;}
writeData(wk);
}
}
//******************************************************************************
//S5851A_ADR 温度センサー部分
void S5851A_W(char t_data){
I2C_Master_Init(100000);
I2C_Master_Start();             //スタート・コンディション
I2C_Master_Write(S5851A_ADR);      //スレーブアドレス
I2C_Master_Write(0x01);         //
I2C_Master_Write(t_data);       //キャラクタの送信
I2C_Master_Stop();              //ストップ・コンディション
__delay_ms(10);
}
//******************************************************************************
//PCF8574AN Extentioned IO 部分
void PCF8574AN_W(){
I2C_Master_Init(100000);
I2C_Master_Start();             //スタート・コンディション
I2C_Master_Write(PCF8574AN_ADR);      //スレーブアドレス
I2C_Master_Write(0xAA);         //データ送信
I2C_Master_Stop();              //ストップ・コンディション
__delay_ms(10);
}
void PCF8574AN_W2(char LED){
I2C_Master_Init(100000);
I2C_Master_Start();             //スタート・コンディション
I2C_Master_Write(PCF8574AN_ADR);      //スレーブアドレス
I2C_Master_Write(LED);         //データ送信
I2C_Master_Stop();              //ストップ・コンディション
__delay_ms(10);
}
void PCF8574AN_W3(){
//    I2C_Master_Init(100000);                    //これだと遅い
I2C_Init();                               //これだと速い
I2C_Master_Start();                     //スタート・コンディション
I2C_Master_Write(PCF8574AN_ADR_R);      //スレーブアドレス read
I2C_Master_Wait();
I2C_ackchk();                           //ACKチェック、無くても普通に動く、スレーブアドレス違ってもスルーする
k = I2C_rcv();                          //スレーブアドレス側からのデータを受信する
//    I2C_rcv(k);                             //この文法では読めない
//    PORTA = (k);                          //ここに入れるのもOK
I2C_nacksnd();                          //NACk送信
I2C_Master_Stop();                       //ストップ・コンディション
__delay_ms(10);
}
//******************************************************************************
int main(void){
PICinit();                        //PICを初期化
LCD_Init();                       //LCD初期化
writeCommand(0x01);               //画面をクリア
__delay_ms(20);
writeCommand(0x02);               //ホームへカーソル移動
__delay_ms(2);                    // LCD側の処理待ち、LCDは全く読み込めないので見込み時間
int count = 0;                    //カウント初期値
int count2 = 0;                   //カウント初期値
__delay_ms(333);
writeCommand(0x80);               //1列目へ移動
LCD_str(moji3);                   //
__delay_ms(100);
writeCommand(0x80+0x40);          //2列目へ移動
LCD_str(moji2);                   //毎回「counter」と書き込むのは無駄なのでループ外へ出した
__delay_ms(100);
//-------------------------------
while(1){
// writeCommand(ToHome);            //画面左上へカーソルを移動
writeCommand(0x8C+0x40);          //カーソル移動
//  count++;                        //カウントアップ
//-------------------------------
//  sprintf(moji,"%d",count);       //mojiにcounter:countを10進で代入
sprintf(moji,"%x",k);             //LCD 16進表示、10進表示すると桁送りでゴミが残る
LCD_str(moji);                    //mojiを表示
//-------------------------------
//  count2++;
//  PCF8574AN_W2(count2);           //インクリメントした数値をPCF8574AN Extentioned IO に I2C送信
//-------------------------------
//受信したデータを LED出力する
TRIGGER();                        //オシロスコープ用
PCF8574AN_W3();                   // k に受信データを持って来る
//k = k & 0xFE;                   // RA0 はTRIGGER()で使用中だからマスクを掛ける
PORTA = (k);                      //LED出力、PORTBだとフリーズする原因不明
//-------------------------------
__delay_ms(10);                  //遅延
}
return 0;
//-------------------------------
}

アセンブラばかりやってきたので不安で仕方のなかったことが有ります、何か・・・
・スレーブアドレスから得られたデータをレジスタに入れるという思想が
 C言語ではどう微妙に違うのか
・得られたデータをLEDやLCDに表示するときどう引き出して出力するのか
 その際、10進、16進の違いはどう表現するのか
・・・等でしたがアッサリ解決するのですね、C言語が高級言語だという理由
がなーーんとなく判って来ました、というかそれだけ自分のレベルが低いと。

==========================================================================
追加記事 2019/01/14(月)

PCF8574AN_pic16f886_v008
もう一つのPCF8574ANを使いLED出力させました
それとLCD表示が上手く行かない事が有る、という問題の解決です
具体的には電源ONで例えば入力データが0x00だったとき
LCD表示が0x    なのです、0xはわざわざキャラクタ書きしているので
出て来ますが本来のデータは 00 が出なければなりません
これはググって解決しました

sprintf(moji,”%x”,k);
↓↓↓
sprintf(moji,”%02x”,k);

これで良いんですね、いやぁC言語って凄いんですね、と素人は驚いています
動画です

ソースです
パクリばっかりで整理整頓が出来て居ません諸先輩方の記事に感謝と
汚しの謝罪です、すみません。

/*
* File:   main.c
* Author: maru
* PCF8574AN_pic16f886_v008
* Created on 2019/01/09, 8:57
* 0 -> 1 -> 2...32768 -> -32768 -> -32767...-3 -> -2 -> -1 -> 0 の繰り返し
*/
//******************************************************************************
//コンフィギュレーション
// CONFIG1 MPLAB XIDEの Production -> Set Configration bits で設定してもこのプログラムでの宣言が優先される
//#pragma config FOSC = INTRC_NOCLKOUT //RA6 = I/O          //デフォルトではRA6 = fosc/4 output
// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)電源オン時、要リセット、しないとBootしない
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)
// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
//******************************************************************************
//コンパイラ
#include 
#include 
#include 
#include 
//******************************************************************************
//マクロ
#define _XTAL_FREQ 8000000      //PIC16F886はINTOSC時最高8MHzまでしか出ない下のOSCCON = 0x70;と矛盾しては成らない
#define LCD_ADD 0x7C            //LCDスレーブアドレス W
#define S5851A_ADR 0x90         //温度センサースレーブアドレス W
#define PCF8574AN_ADR 0x70      //Extentioned IO スレーブアドレス W
#define PCF8574AN_ADR_R 0x73      //Extentioned IO スレーブアドレス W
#define ToHome 0b00000010
#define shiftLeft 0b00011000
#define shiftRight 0b00011100
#define clear 0b00000001
//******************************************************************************
static unsigned char I2C_rcv();
static void I2C_nacksnd() ;
static unsigned char I2C_ackchk();
char moji[] = " ";
char moji2[] = "PCF8574AN=0x ";
char moji3[] = "v007";      //この文字列を長くするとカウントアップがバグる、原因不明
char moji4[] = "      ";    //空白を書く、前の文字が残って邪魔をするから
unsigned char k;            // k = PCF8574ANから読み込んだデータ、char型 保存できる値は-127?127  //unsigned char型 保存できる値は 0-255です
unsigned char LED;
//******************************************************************************
void TRIGGER(){
PORTAbits.RA0 = 1;    //for debug オシロスコープ・トリガ用 PORTA-RA0
__delay_us(10);
PORTAbits.RA0 = 0;
}
//-------------------------------
void I2C_Master_Init(const unsigned long c)
{
SSPCON  = 0b00101000;     //RC3/SCK/SCL  RC4/SDI/SDA として使用宣言
SSPCON2 = 0;
SSPADD = (_XTAL_FREQ/(4*c))-1;
SSPSTAT = 0b00000000 ;    // 標準速度モードに設定する(100kHz)
}
//-------------------------------
void I2C_Init()
{
SSPCON  = 0x28;     //RC3/SCK/SCL  RC4/SDI/SDA として使用宣言
SMP = 1;
CKE = 0;
SSPADD = 0x21;      //PICがスレーブの時の自分のスレーブアドレス、使わない
}
//-------------------------------
void I2C_Master_Wait()
{
while ((SSPSTAT & 0x04) || (SSPCON2 & 0x1F));
}
//-------------------------------
void I2C_Master_Start()
{
I2C_Master_Wait();
SEN = 1;
}
//-------------------------------
void I2C_Master_RepeatedStart()
{
I2C_Master_Wait();
RSEN = 1;
}
//-------------------------------
//    void I2C_Master_Stop()
//    {
//      I2C_Master_Wait();
//      PEN = 1;
//    }
// ストップコンディション生成 ↑代替 maru
void I2C_Master_Stop() {
// SSP1CON2レジスタのPENビットを1に設定すると
// ストップコンディションが生成される
// 発行が完了するとSSP1IFが1になるのでwhile文で待つ
SSPIF = 0;
SSPCON2bits.PEN = 1;
while (SSPIF == 0) {}
SSPIF = 0;
return;
}
//-------------------------------
//    void I2C_Master_Write(unsigned d)
//    {
//      I2C_Master_Wait();
//      SSPBUF = d;
//    }
//代替↑
void I2C_Master_Write(unsigned d)
// SSP1BUFに送信したいデータをセットすると、そのデータが送信される
// 発行が完了するとSSP1IFが1になるのでwhile文で待つ
// ACK 待ちは無い、https://tool-lab.com/make/pic-practice-40/
{
I2C_Master_Wait();                  //これが無いと全く出鱈目に成る 
SSPIF = 0;
SSPBUF = d;
while (SSPIF == 0) {}
SSPIF = 0;
//   return;
}
//-------------------------------
// I2C ACK check
static unsigned char I2C_ackchk() {
unsigned char i2c_data;
if (ACKSTAT) {
i2c_data = 0xFF;
} else {
i2c_data = 0x00;
}
return(i2c_data);
}
//-------------------------------
// I2C Recive
//static unsigned char I2C_rcv() {
//	SSPIF = 0;
//	RCEN = 1;
//	while (RCEN) {}
//	return(SSPBUF);
//}
static unsigned char I2C_rcv() {
SSPIF = 0;
SSPCON2bits.RCEN = 1;
while (SSPIF == 0) {}
SSPIF = 0;
return SSPBUF;
}
//-------------------------------
// I2C NACK send
//static void I2C_nacksnd() {
//	ACKDT = 1;
//	ACKEN = 1;
//	while (ACKEN) {}
//	return;
//}
static void I2C_nacksnd() {
// ACKDTにNACKをセット(負論理なので1を設定)
SSPCON2bits.ACKDT = 1;
// NACK信号生成
SSPCON2bits.ACKEN = 1;
while (SSPCON2bits.ACKEN) {}
return;
}
//-------------------------------
void writeData(char t_data){
I2C_Master_Start();             //スタート・コンディション
I2C_Master_Write(LCD_ADD);      //0x7C スレーブアドレス
I2C_Master_Write(0x40);         //0x40  キャラクタを書くよって宣言
I2C_Master_Write(t_data);       //キャラクタの送信
I2C_Master_Stop();              //ストップ・コンディション
__delay_ms(10);
}
//-------------------------------
void writeCommand(char t_command){
I2C_Master_Start();
I2C_Master_Write(LCD_ADD);
I2C_Master_Write(0x00);
I2C_Master_Write(t_command);
I2C_Master_Stop();
__delay_ms(10);
}
//-------------------------------
void PICinit(){
OSCCON = 0x70;          //0x70=8MHz PIC16F886はINTOSC時最高8MHzまでしか出ない上の#define _XTAL_FREQ 8000000;と矛盾しては成らない
ANSEL  = 0b00000000;
ANSELH = 0b00000000;
TRISA  = 0b00000000;
TRISB  = 0b00000000;
TRISC  = 0b00011000;
PORTA  = 0b00000000;    //2進数で書いた場合
PORTB  = 0x00;          //16進数で書いた場合
}
//******************************************************************************
void LCD_Init(){            //LCDの初期化、秋月のマニュアル通り
//TRIGGER();                //for debug オシロスコープ・トリガ用 PORTA-RA0
I2C_Master_Init(100000);
__delay_ms(400);
//TRIGGER();                //for debug オシロスコープ・トリガ用 PORTA-RA0
writeCommand(0x38);       //このプロトコルは S 0x7C 0x00 0x38 A P と成っているから下のプロトコルも全部一個ずつ送信している
__delay_ms(20);
writeCommand(0x39);
__delay_ms(20);
writeCommand(0x14);
__delay_ms(20);
writeCommand(0x73);
__delay_ms(20);
writeCommand(0x52);
__delay_ms(20);
writeCommand(0x6C);
__delay_ms(250);
writeCommand(0x38);
__delay_ms(20);
writeCommand(0x01);
__delay_ms(20);
writeCommand(0x0C);
__delay_ms(20);
}
//-------------------------------
void LCD_str(char *c) {     //LCDに配列の文字を表示
unsigned char i,wk;
for (i=0 ; ; i++) {
wk = c[i];
if  (wk == 0x00) {break;}
writeData(wk);
}
}
//******************************************************************************
//S5851A_ADR 温度センサー部分
void S5851A_W(char t_data){
I2C_Master_Init(100000);
I2C_Master_Start();             //スタート・コンディション
I2C_Master_Write(S5851A_ADR);      //スレーブアドレス
I2C_Master_Write(0x01);         //
I2C_Master_Write(t_data);       //キャラクタの送信
I2C_Master_Stop();              //ストップ・コンディション
__delay_ms(10);
}
//******************************************************************************
//PCF8574AN Extentioned IO 部分
void PCF8574AN_W(){                     //PCF8574AN Extentioned IO WRITE
I2C_Master_Init(100000);
I2C_Master_Start();                   //スタート・コンディション
I2C_Master_Write(PCF8574AN_ADR);      //スレーブアドレス
I2C_Master_Write(0xAA);               //データ送信
I2C_Master_Stop();                    //ストップ・コンディション
__delay_ms(10);
}
void PCF8574AN_W2(char LED){            //PCF8574AN Extentioned IO WRITE
I2C_Master_Init(100000);
I2C_Master_Start();                   //スタート・コンディション
I2C_Master_Write(PCF8574AN_ADR);      //スレーブアドレス
I2C_Master_Write(LED);                //データ送信
I2C_Master_Stop();                    //ストップ・コンディション
__delay_ms(10);
}
void PCF8574AN_R(){                      //PCF8574AN Extentioned IO READ
//    I2C_Master_Init(100000);              //これだと遅い
I2C_Init();                             //これだと速い
I2C_Master_Start();                     //スタート・コンディション
I2C_Master_Write(PCF8574AN_ADR_R);      //スレーブアドレス read
I2C_Master_Wait();
I2C_ackchk();                           //ACKチェック、無くても普通に動く、スレーブアドレス違ってもスルーする
k = I2C_rcv();                          //スレーブアドレス側からのデータを受信する
//    I2C_rcv(k);                           //この文法では読めない
//    PORTA = (k);                          //ここに入れるのもOK
I2C_nacksnd();                          //NACk送信
I2C_Master_Stop();                      //ストップ・コンディション
__delay_ms(10);
}
//******************************************************************************
int main(void){
PICinit();                        //PICを初期化
LCD_Init();                       //LCD初期化
writeCommand(0x01);               //画面をクリア
__delay_ms(20);
writeCommand(0x02);               //ホームへカーソル移動
__delay_ms(2);                    // LCD側の処理待ち、LCDは全く読み込めないので見込み時間
int count = 0;                    //カウント初期値
int count2 = 0;                   //カウント初期値
__delay_ms(333);
writeCommand(0x80);               //1列目へ移動
LCD_str(moji3);                   //
__delay_ms(100);
writeCommand(0x80+0x40);          //2列目へ移動
LCD_str(moji2);                   //毎回「counter」と書き込むのは無駄なのでループ外へ出した
__delay_ms(100);
//-------------------------------
while(1){
//受信したデータを LED出力する
TRIGGER();                        //オシロスコープ用
PCF8574AN_R();                   // k に受信データを持って来る
//k = k & 0xFE;                   // RA0 はTRIGGER()で使用中だからマスクを掛ける
PORTA = (k);                      //LED出力、PORTBだとフリーズする原因不明
//-------------------------------
// writeCommand(ToHome);            //画面左上へカーソルを移動
writeCommand(0x8C+0x40);          //カーソル移動
//  count++;                        //カウントアップ
//-------------------------------
//  PCF8574AN入力で得られたデータをLCDに出力表示する
sprintf(moji,"%02x",k);           //LCD 16進表示、2桁表示、左寄せしない、MSBがゼロでも文字無しとしないでゼロ表示させる。ex) NG = 0x 1 Good = 0x01 %=文字変換 0=左寄せしないでゼロ表示、2=2桁表示
LCD_str(moji);                    //mojiを表示
//-------------------------------
//  count2++;
//  PCF8574AN_W2(count2);           //インクリメントした数値をPCF8574AN Extentioned IO に I2C送信
//-------------------------------
// PCF8574AN入力で得られたデータを別のPCF8574ANに出力、LED表示する
k = ~k;                           //LEDが逆論理で発光するので逆論理に変更
PCF8574AN_W2(k);                  //
//-------------------------------
__delay_ms(10);                  //遅延
}
return 0;
//-------------------------------
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です