--------------------------------------------------------------------- #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.