組み込み設計では、マイクロコントローラーで使用できるI / Oピンが十分にない可能性があります。これは、アプリケーションに複数のLEDが必要な場合や、複数の7セグメントディスプレイを使用したいが、マイクロコントローラーにI / Oピンが必要ないなどの理由が考えられます。ここに完璧なコンポーネント、シフトレジスタがあります。シフトレジスタはシリアルデータを受け入れ、パラレル出力を提供します。マイクロコントローラーに接続するのに必要なピンは3つだけで、そこから8つ以上の出力ピンを取得できます。人気のあるシフトレジスタの1つは74HC595です。それは持っている8ビット・ストレージ・レジスタおよび8ビットのシフトレジスタを。シフトレジスタの詳細については、こちらをご覧ください。
シリアルデータをシフトレジスタに提供し、それをストレージレジスタにラッチしてから、ストレージレジスタが8つの出力を制御します。より多くの出力が必要な場合は、別のシフトレジスタを追加するだけです。2つのシフトレジスタをカスケード接続することにより、追加の8出力、合計16ビット出力が得られます。
シフトレジスタ74HC595:
これがデータシートによる74HC595のピン配置図です-
HC595には16ピンがあります。データシートを見ると、ピンの機能がわかります-
ピン番号1から7および15までのQAからQHは、シフトレジスタからの8ビット出力として使用されますが、ピン14はシリアルデータの受信に使用されます。他のピンの使用方法やシフトレジスタの他の機能の利用方法に関する真理値表もあります。
74HC595とのインターフェース用のコードを作成するときは、この真理値表を適用して目的の出力を取得します。
ここで、74HC595をPIC16F877Aとインターフェースし、8個のLEDを制御します。74HC595シフトレジスタを他のマイクロコントローラと接続しました。
- 74HC595シリアルシフトレジスタとRaspberryPiのインターフェイス
- Arduino Unoでシフトレジスタ74HC595を使用する方法は?
- シフトレジスタを使用したLCDとNodeMCUのインターフェース
必要なコンポーネント:
- PIC16F877A
- 2個の33pFセラミックディスクコンデンサ
- 20Mhzクリスタル
- 4.7k抵抗
- 8個のLED
- 1k抵抗-1個(各LEDに個別の抵抗が必要な場合は8個1k抵抗が必要)
- 74HC595 ic
- 5Vウォールアダプター
- PICプログラミング環境
- ブレッドボードとワイヤー
回路図:
回路図では、シリアルデータピンを接続しています。マイクロコントローラのRB0、RB1、およびRB2ピンのクロックピンとストロボ(ラッチ)ピン。ここでは、8つのLEDに1つの抵抗を使用しました。真理値表に従って、74HC595のピン13をグランドに接続して出力を有効にしました。QHの我々は別のカスケードないので、ピンはオープンのままに74HC595をそれで。シフトレジスタのピン10をVCCに接続することにより、クリア入力フラグを無効にしました。
水晶発振器はマイクロコントローラのOSCピンに接続されています。PIC16F877Aには内部発振器がありません。このプロジェクトでは、shift regitsterを使用して、Q0からQ7までLEDを1つずつ点灯させます。
ブレッドボードに回路を構築しました-
コードの説明:
シフトレジスタでLEDを制御するための完全なコードは、記事の最後に記載されています。いつものように、PICマイクロコントローラーの構成ビットを設定する必要があります。
#pragma config FOSC = HS //オシレーター選択ビット(HSオシレーター) #pragma config WDTE = OFF //ウォッチドッグタイマーイネーブルビット(WDT無効) #pragma config PWRTE = OFF //パワーアップタイマーイネーブルビット(PWRT無効) # pragma config BOREN = ON //ブラウンアウトリセットイネーブルビット(BOR有効) #pragma config LVP = OFF //低電圧(シングルサプライ)インサーキットシリアルプログラミングイネーブルビット(RB3 / PGMピンにはPGM機能があり、ロー) -電圧プログラミングが有効) #pragma config CPD = OFF //データEEPROMメモリコード保護ビット(データEEPROMコード保護オフ) #pragma config WRT = OFF //フラッシュプログラムメモリ書き込みイネーブルビット(書き込み保護オフ。すべてのプログラムメモリはEECONコントロールによって書き込まれます) #pragma config CP = OFF //フラッシュプログラムメモリコード保護ビット(コード保護オフ)
その後、遅延に必要な水晶周波数と74HC595のピン配置宣言を行いました。
#include
次に、 system_init() 関数を宣言して、ピンの方向を初期化しました。
void system_init (void){ TRISB = 0x00; }
2つの異なる機能を使用してクロックパルスとラッチパルスを作成しました
/ ** この関数は時計を有効にします。 * / void clock(void){ CLK_595 = 1; __delay_us(500); CLK_595 = 0; __delay_us(500); }
そして
/ * *この関数はストローブし、出力トリガーを有効にします。 * / void strobe(void){ STROBE_595 = 1; __delay_us(500); STROBE_595 = 0; }
この2つの関数の後で、シリアルデータを74HC595に送信する data_submit(unsigned int data) 関数を宣言しました。
void data_submit(unsigned int data){ for(int i = 0; i <8; i ++){ DATA_595 =(data >> i)&0x01; 時計(); } strobe(); //最終的に送信されたデータ }
この機能では、8ビットのデータを受け入れ、2ビット演算子を使用して各ビットを送信左シフトとAND演算子を。まず、データを1つずつシフトし、0x01のAND演算子を使用して、データが0か1かを正確に調べます。各データは、クロックパルスによって記憶されていると、最終的なデータ出力は、ラッチ又はストローブパルスを使用して行います。このプロセスでは、データ出力は最初にMSB(最上位ビット)になります。
では メインの 機能我々はバイナリを提出し、出力ピン1による高1を作りました。
system_init(); //システムの準備 中while(1){ data_submit(0b00000000); __delay_ms(200); data_submit(0b10000000); __delay_ms(200); data_submit(0b01000000); __delay_ms(200); data_submit(0b00100000); __delay_ms(200); data_submit(0b00010000); __delay_ms(200); data_submit(0b00001000); __delay_ms(200); data_submit(0b00000100); __delay_ms(200); data_submit(0b00000010); __delay_ms(200); data_submit(0b00000001); __delay_ms(200); data_submit(0xFF); __delay_ms(200); } return; }
このようにして、シフトレジスタを使用して、より多くのセンサーを接続するために、マイクロコントローラーでより多くの空きI / Oピンを取得できます。