/*
スティックキー Ver2 2008年8月28日
バーチャロンのスティックの状態に応じて文字を出力する。
*/
#include <16f628a.h>
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR
#use delay(CLOCK = 4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1) //ハードウェアUART
#define UP_IL PIN_A4
#define DOWN_IL PIN_A5
#define LEFT_IL PIN_A3
#define RIGHT_IL PIN_A2
#define UP_IR PIN_A7
#define DOWN_IR PIN_A6
#define LEFT_IR PIN_A0
#define RIGHT_IR PIN_A1
#define TRIG_SW PIN_B7
#define DEBUG_SW PIN_B6
#define SHIFT_SW PIN_B4
#define CTRL_SW PIN_B5
const int roundnumh[9]={0,1,5,3,2,4,7,8,6}; //roundnumのテーブルバージョン
const int zeror[9]={'\n',0x1E,0x7F,0x1C,0x09,0x1F,0x1B,0x1D,'\b'};//LF,↑,DEL,→,TAB,↓,ESC,←,BS
int X,Y,R,L,S=0;
void main(){
port_b_pullups(FALSE); //分りづらいから全部プルダウンで。
while (TRUE){
delay_ms(100); //キーリピートのタイミング
if(input(TRIG_SW)==1){
//何らかの入力待ち
//上から時計回りに「1,4,3,5,2,8,6,7」となります。
R= input(UP_IR) + input(DOWN_IR)*2 + input(RIGHT_IR)*3 + input(LEFT_IR)*6;
R= roundnumh[R];
L= input(UP_IL) + input(DOWN_IL)*2 + input(RIGHT_IL)*3 + input(LEFT_IL)*6;
L= roundnumh[L]*8;
if(L==0){X=zeror[L];}
else{
S=(0x20*input(SHIFT_SW))+(0xC0*input(CTRL_SW));
if(S==0xE0){S=0x80;} //日本語
X=0x18+R+L+S;
}
if(input(DEBUG_SW)==1){
printf(",R=%X,L=%X,R+L=%X,X=%X,S=%X\r\n",R,L,R+L,X,S);
}
else{
putc(X);//文字の出力。
}
X,Y,R,L,S=0;//変数の初期化
}
}
}
|