


---------------------------------------------------------------------
#define MISO 12 // データの入力ピン(74HC165-QH)
#define SCK 13 // クロック出力ピン(74HC165-CK)
#define SL 10 // レジスタロードピン(74HC165-SL)
byte ShiftData ;
// 74HC165のデータを読込む(受信する)関数
// DataPin :データの入力ピン
// clockPin:クロック出力ピン
// loadPin :レジスタロードピン
byte ShiftIn(int dataPin,int clockPin,int loadPin)
{
unsigned char x ;
int i ;
x = 0 ;
digitalWrite(loadPin,LOW) ; // 入力端子(A-H)の情報をレジスタに読込めと指示する
digitalWrite(loadPin,HIGH) ;
x = x | (digitalRead(dataPin) << 7) ;// H端子の内容を受信する
for (i=6 ; i>=0 ; i--) { // G端子〜A端子まで繰り返す
digitalWrite(clockPin,HIGH) ; // 1ビットシフト指示を出す
digitalWrite(clockPin,LOW) ;
x = x | (digitalRead(dataPin) << i) ; // シフトされた内容を受信する
}
return x ;
}
// 電源起動時とリセットの時だけのみ処理する関数
void setup() {
// シリアル通信の初期化
Serial.begin(9600) ;
// 74HC165のピン情報初期化
pinMode(MISO, INPUT) ;
pinMode(SCK, OUTPUT) ;
pinMode(SL, OUTPUT) ;
digitalWrite(SL,HIGH) ;
digitalWrite(SCK,LOW) ;
// 3秒後に開始
delay(3000) ;
// 74HC165入力端子のデータを読込み表示を行う
ShiftData = ShiftIn(MISO,SCK,SL) ;
Serial.println(ShiftData, BIN);
}
// 繰り返し実行されるメインの処理関数
void loop() {
byte dt ;
// 74HC165入力端子のデータを読込む
dt = ShiftIn(MISO,SCK,SL) ;
if ( dt != ShiftData ) {
// データに変化が有れば表示する
ShiftData = dt ;
Serial.println(dt, BIN) ;
}
}
---------------------------------------------------------------------
ArduinoIDEのシリアルモニター画面を起動させましょう。
---------------------------------------------------------------------
void loop() {
byte dt ;
digitalWrite(SS, LOW) ; // 入力端子(A-H)の情報をレジスタに読込めと指示する
digitalWrite(SS, HIGH) ;
dt = SPI.transfer(0xff) ; // 端子の内容を受信する
Serial.println(dt,BIN) ;
while(1) ; // 処理中断
}
---------------------------------------------------------------------
この時、DIP-SWのパターンが"11110101"とするとdtの受信内容は"11101010"と表示されます、
digitalWrite(SS, LOW) ;
digitalWrite(SS, HIGH) ;
(ここでQH:MISOの内容をdt1に読込んでおく)
dt = SPI.transfer(0xff) ; // 端子の内容を受信する
(dt1を8ビット目として、dtの上位7ビットを取り出し、dt1とdtを合体させる)
Serial.println(dt,BIN) ;
といった感じにプログラミングを行う必要が有ります。

---------------------------------------------------------------------
#include <xc.h>
#include "skMonitorLCD.h" // LCDモニター用
#define _XTAL_FREQ 16000000 // delay用に必要(クロック16MHzを指定)
#define QH RA0 // データの入力ピン(74HC165-QH)
#define CK RA5 // クロック出力ピン(74HC165-CK)
#define SL RA4 // レジスタロードピン(74HC165-SL)
char shiftData ;
// コンフィギュレーション1の設定
#pragma config FOSC = INTOSC // 内部クロック使用する(INTOSC)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(OFF)
// コンフィギュレーション2の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
// 74HC165のデータを読込む(受信する)関数
char ShiftIn()
{
unsigned char x ;
int i ;
x = 0 ;
SL = 0 ; // 入力端子(A-H)の情報をレジスタに読込めと指示する
SL = 1 ;
x = x | (QH << 7) ; // H端子の内容を受信する
for (i=6 ; i>=0 ; i--) { // G端子〜A端子まで繰り返す
CK = 1 ; // 1ビットシフト指示を出す
CK = 0 ;
x = x | (QH << i) ; // シフトされた内容を受信する
}
return x ;
}
// メインの処理
void main()
{
char dt ;
OSCCON = 0b01111010 ; // 内部クロックは16MHzとする
ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISA = 0b00000001 ; // RA0ピン以外を全て出力に割当てる(RA3は入力専用)
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
SL = 1 ;
// LCDモニターを使用する為の初期化処理 *1)
MonitorInit() ;
__delay_ms(3000) ; // 3秒後に開始する
shiftData = ShiftIn() ; // 74HC165入力端子のデータを読込む
MonitorPutc(0x11) ; // モニターの表示位置を決める
MonitorPutb(shiftData) ; // 2進数で表示する
while (1) {
dt = ShiftIn() ;
if (dt != shiftData) {
// 入力端子のデータが変化したら表示する
shiftData = dt ;
MonitorPutc(0x11) ;
MonitorPutb(dt) ;
}
}
}
---------------------------------------------------------------------

追記(*3) 2016/01/20
MPLAB X用に記事変更(*2) 2015/10/30
記事見直し(*1) 2014/09/23
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.