ヘッダーファイルで、PS、CLK、DATA線の割り付けピンのdefine定義を変更すれば、Q43以外にも使えます。
ライン名 | 18F27Q43ピン |
---|---|
PS | LATA5 |
CLK | LAT6 |
DATA | RA7 |
ボタン押下状況の取得コード
famicon.h
#ifndef FAMICON_H
#define FAMICON_H
#ifdef __cplusplus
extern "C" {
#endif
#include <xc.h>
#define PS LATAbits.LATA5
#define CLK LATAbits.LATA6
#define DATA1 PORTAbits.RA7
extern uint16_t famiconButtonState;
extern void famiconInit(void);
extern uint16_t getButton(void);
#ifdef __cplusplus
}
#endif
#endif /* FAMICON_H */
famicon.c
#include "famicon.h"
#include "I2C_LCD.h"
uint16_t famiconButtonState;
///@brief コントローラーの初期化
void famiconInit(void)
{
TRISAbits.TRISA7=1;//Data線
}
///@brief ボタン押下状況取得関数
///return ボタン押下16ビットデータ
uint16_t getButton(void)
{
uint16_t w_val;
uint8_t cnt;
w_val=0x0000;
cnt=0;
//最初の1ビット
PS=1;
CLK=1;
__delay_us(10);
PS=0;
CLK=0;
__delay_us(10);
w_val|=DATA1;
w_val<<=1;
cnt++;
//残り15ビットの取得
do{
CLK=1;
__delay_us(10);
CLK=0;
// __delay_us(5);
w_val|=DATA1;
if(cnt!=15)
{
w_val<<=1;
}
cnt++;
}while(cnt!=16);
//受信完了
w_val&=0xFFF0;//ボタンデータのみを、抽出
if(w_val!=0xFFF0)
{
if((w_val&0x8000)==0x0)
{
printf("B ");
}
if((w_val&0x4000)==0x0)
{
printf("Y ");
}
if((w_val&0x2000)==0x0)
{
printf("SELECT ");
}
if((w_val&0x1000)==0x0)
{
printf("START ");
}
if((w_val&0x0800)==0x0)
{
printf("UP ");
}
if((w_val&0x0400)==0x0)
{
printf("DOWN ");
}
if((w_val&0x0200)==0x0)
{
printf("LEFT ");
}
if((w_val&0x0100)==0x0)
{
printf("RIGHT ");
}
if((w_val&0x0080)==0x0)
{
printf("A ");
}
if((w_val&0x0040)==0x0)
{
printf("X ");
}
if((w_val&0x0020)==0x0)
{
printf("L ");
}
if((w_val&0x0010)==0x0)
{
printf("R ");
}
printf("%04x\r",w_val);
}
return w_val;
}