ピン数の少ないPIC(PIC12F683、PIC16F88など)では、製作するものによっては、もう少しピン数を増やしたい場合が多々あります。
そこで、今回は、シリアル→パラレル変換ICを利用して、ピン数を増やすことが可能な、“拡張ポート“を製作してみました。
<仕様>
<PIC12F683に拡張ポートを接続した場合のポート数>
| PIC12F683単体 | PIC12F683+拡張ポート | |
|---|---|---|
| 入出力ポート | 5本 | 2本 |
| 入力ポート | 1本 | 1本 |
| 出力ポート | - | 8本 |
| 合計 | 6本 | 11本 |
<PIC16F88に拡張ポートを接続した場合のポート数>
| PIC16F88単体 | PIC16F88+拡張ポート | |
|---|---|---|
| 入出力ポート | 15本 | 12本 |
| 入力ポート | 1本 | 1本 |
| 出力ポート | - | 8本 |
| 合計 | 16本 | 21本 |
シリアル→パラレル変換ICには、新日本無線(JRC)の“NJU3711”を使用します。
NJU3711を制御するためには、次の4本の信号が必要ですが、CLR端子を“H(Vdd)“に固定接続すること
により、3本の制御信号で制御可能とします。
<拡張ポート制御ライブラリで提供する関数>
<動作確認用のプログラムの処理>
<NJU3711の特長>
動作確認用のプログラム
//********************************************************************** /* <拡張ポート(出力専用)制御ライブラリ> ※拡張ポート用のICには、NJU3711を使用します。 */ //********************************************************************** //■■■関数宣言■■■ extern void main(); extern void opening_demonstration(); //********************************************************************** //■■■インクルード■■■ #include "ex_port_lib_nju3711.h" //********************************************************************** //■■■マクロ定義■■■ //NJU3711 sbit STB at GP5_bit; sbit CLK at GP4_bit; sbit DAT at GP2_bit; sbit STB_Direction at TRISIO5_bit; sbit CLK_Direction at TRISIO4_bit; sbit DAT_Direction at TRISIO2_bit; //********************************************************************** //■■■メイン関数■■■ void main() { OSCCON = 0b01110000; CMCON0 = 0b00000111; ANSEL = 0b00000001; TRISIO = 0b00001011; // ex_port_Init(); // opening_demonstration(); // while (1) { switch (Adc_Read(0) / 114) { case 0: ex_port_out(0b11111111); break; case 1: ex_port_out(0b11111110); break; case 2: ex_port_out(0b11111100); break; case 3: ex_port_out(0b11111000); break; case 4: ex_port_out(0b11110000); break; case 5: ex_port_out(0b11100000); break; case 6: ex_port_out(0b11000000); break; case 7: ex_port_out(0b10000000); break; case 8: ex_port_out(0b00000000); break; } Delay_ms(100); } } //********************************************************************** //■■■オープニングデモ関数■■■ void opening_demonstration() { short cnt; // for (cnt = 0; cnt < 10; cnt++) { ex_port_out(0x00); Delay_ms(100); ex_port_out(0xFF); Delay_ms(100); } // for (cnt = 0; cnt < 8; cnt++) { ex_port_out_bit(cnt, 0); Delay_ms(100); } for (cnt = 0; cnt < 8; cnt++) { ex_port_out_bit(cnt, 1); Delay_ms(100); } } //**********************************************************************
拡張ポート制御ライブラリ
//********************************************************************** /* <拡張ポート(出力専用)制御ライブラリ> ※拡張ポート用のICには、NJU3711を使用します。 */ //********************************************************************** //■■■インクルード■■■ #include "ex_port_lib_nju3711.h" //********************************************************************** //■■■拡張ポート初期化関数■■■ char output_data_register; void ex_port_init() { short cnt; // STB_Direction = 0; CLK_Direction = 0; DAT_Direction = 0; // STB = 1; DAT = 0; CLK = 0; for (cnt = 0; cnt < 8; cnt++) { CLK = 1; CLK = 0; } STB = 0; STB = 1; output_data_register = 0; } //********************************************************************** //■■■拡張ポート出力関数■■■ void ex_port_out(char output_data) { short cnt; // output_data_register = output_data; for (cnt = 0; cnt < 8; cnt++) { if ((output_data & 0b10000000) != 0) { DAT = 1; } else { DAT = 0; } CLK = 1; CLK = 0; output_data = output_data << 1; } STB = 0; STB = 1; } //********************************************************************** //■■■拡張ポートビット出力関数■■■ void ex_port_out_bit(char pin, char sts) { switch (pin) { case 0: output_data_register.B0 = sts; break; case 1: output_data_register.B1 = sts; break; case 2: output_data_register.B2 = sts; break; case 3: output_data_register.B3 = sts; break; case 4: output_data_register.B4 = sts; break; case 5: output_data_register.B5 = sts; break; case 6: output_data_register.B6 = sts; break; case 7: output_data_register.B7 = sts; break; } ex_port_out(output_data_register); } //**********************************************************************