#include <18f14k50.h>
#fuses INTRC_IO, NOWDT, PROTECT, PUT, BROWNOUT, BORV27
#fuses NOLVP, MCLR, NOIESO, NOFCMEN, NOPLLEN, CPUDIV1
//INTRC_IO:内部クロックを使用する ピンはIOで使用可能
//NOWDT:ウォッチドッグ・タイマーを使用しない
//PROTECT:コード・プロテクトする
//PUT:パワーアップ・タイマーを使用する
//BROWNOUT:ブラウンアウト・リセットを使用する
//BORV27:2.7Vでブラウンアウト・リセット
//NOLVP:低電圧(5V)プログラミングを使用しない
//MCLR:MCLRピンを有効にする
//NOIESO:クロックの内部外部切替を無効にする
//NOFCMEN:クロックの監視を無効にする
//NOPLLEN:4X HW PLLを無効にする
//CPUDIV1:クロック分周比1/1
//内部クロック8MHz(CPUDIV1)
#use delay(clock=8000000)
//USBモジュール無効
#byte UCON = 0xF64
#bit USBEN = UCON.3 //USBEN = 0
//USBプルアップ無効
#byte UCFG = 0xF61
#bit UPUEN = UCFG.4 //UPUEN = 0
//フォトカプラ(出力)
#define SW1 PIN_B7
#define SW2 PIN_C7
#define SW3 PIN_C6
#define SW4 PIN_C3
#define SW5 PIN_C4
#define SW6 PIN_C1
#define SW7 PIN_C5
#define SW8 PIN_C0
#define SW9 PIN_A4
#define SW10 PIN_A5
//SFC
#define PS PIN_B5 //出力(正論理)
#define CLK PIN_B6 //出力(正論理)
#define DAT1 PIN_B4 //入力(負論理)
//SFC DAT1 ON:0V OFF:5V
#define DAT1_ON 0
#define DAT1_OFF 1
void init(void);
int get_data(void);
/*********************************
* 初期化関数
*********************************/
void init(void)
{
setup_oscillator(OSC_8MHZ); //内部クロックを8MHzにする
setup_adc_ports(NO_ANALOGS); //全ピンをデジタルIOモードにする
setup_comparator(nc_nc_nc); //コンパレータは動作しない
//USBを使わない
USBEN = 0;
UPUEN = 0;
//フォトカプラ OFF
output_high(SW1);
output_high(SW2);
output_high(SW3);
output_high(SW4);
output_high(SW5);
output_high(SW6);
output_high(SW7);
output_high(SW8);
output_high(SW9);
output_high(SW10);
}
/*********************************
* メイン
*********************************/
void main(void)
{
long sfc_clk[11];
int data, lastdata;
init();
sfc_clk[0] = 0;
sfc_clk[1] = SW10; // Bボタン
sfc_clk[2] = SW5; // Yボタン
sfc_clk[3] = SW3; // SELECTボタン
sfc_clk[4] = SW8; // STARTボタン
sfc_clk[5] = SW1; // 上ボタン
sfc_clk[6] = SW2; // 下ボタン
sfc_clk[7] = SW6; // 左ボタン
sfc_clk[8] = SW7; // 右ボタン
sfc_clk[9] = SW9; // Aボタン
sfc_clk[10] = SW4; // Xボタン
data = 0;
lastdata = 0;
while (1) {
data = get_data();
if (data != lastdata) {
if (data != 0) {
output_low(sfc_clk[data]);
delay_ms(50);
output_high(sfc_clk[data]);
delay_ms(50);
}
lastdata = data;
}
}
}
/*********************************
* ボタンのデータを取得
*********************************/
int get_data(void)
{
int data;
int i;
//初期化
data = 0;
//読み込み開始
for (i = 0; i < 16; i++) {
//BボタンのみPSをONにする
if (i == 0) {
output_high(PS);
} else {
delay_cycles(3);
}
//CLKをONにする
output_high(CLK);
delay_cycles(12);
//BボタンのみPSをOFFにする
if (i == 0) {
output_low(PS);
} else {
delay_cycles(3);
}
//CLKをOFFにする
output_low(CLK);
//押されたボタンを判定する
if (input(DAT1) == DAT1_ON) {
data = i + 1;
}
}
if (data > 10) {
data = 0;
}
return data;
}