今回はマイコン側のプログラムの話。
作りたかったのは、PCから'd'という文字を受け取ると下ボタンに0Vをかける
ようなプログラム。
また、0Vをかける時間の設定もPCから行いたい。
書いたプログラムは下。
#include <pic.h>
__CONFIG(0x3F72);
#define MY_SPBRG 25
#define XON 17
#define XOFF 19
#define _XTAL_FREQ 4000000
unsigned char x;//XON,XOFFを格納
unsigned char buf[16];//バッファ
unsigned char wp = 0;//書き込み位置
unsigned char rp = 0;//読み出し位置
unsigned char n;//データ数
int delay = 10;//ディレイ繰り返し数
int SET = 0;//ディレイ繰り返し数設定用
void initialize(void);
void KEY_DOWN(void);
void main(void)
{
int i;
ADCON1=0x07;//AD変換オフ。
TRISA=0;
TRISB=0;
TRISC = 0b11000000;
TRISD=0;
TRISE=0;
//ポートの初期化
PORTA = 0xFF;
PORTB = 0xFF;
RE0 = 1;
initialize();
GIE = 1;//受信開始
TXREG = XON;
while(1) KEY_DOWN();
}
void initialize(void)
{
SPBRG = MY_SPBRG;
TXSTA = 0b00100100;
RCSTA = 0b10010000;
RCIE = 1;
PEIE = 1;
}
//受信割り込み 相手からXON/XOFFを受信する
void interrupt entry(void)
{
unsigned char c;
if(RCIF)
{
c = RCREG;
if(c==XON||c==XOFF)
{
x = c;
return;
}
buf[wp++] = c;//バッファに受信データを格納
n++;
if(wp==16) wp = 0;
}
}
void KEY_DOWN(void)
{
int i;
while(n==0);//データ受信を待つ
RCIE = 0;//受信割り込み禁止
switch(buf[rp])
{
case 'u':
RA0 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RA0 = 1;
break;
case 'l':
RA1 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RA1 = 1;
break;
case 'd':
RA2 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RA2 = 1;
break;
case 'r':
RA3 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RA3 = 1;
break;
case 'A':
RB3 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RB3 = 1;
break;
case 'B':
RB4 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RB4 = 1;
break;
case 'X':
RB5 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RB5 = 1;
break;
case 'Y':
RB6 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RB6 = 1;
break;
case 'L':
RA4 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RA4 = 1;
break;
case 'R':
RA5 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RA5 = 1;
break;
case 'S':
RB7 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RB7 = 1;
break;
case 's':
RE0 = 0;
for(i=1;i<=delay;i++)__delay_ms(100);
RE0 = 1;
break;
case 'Z'://ディレイ繰り返し数設定モード
SET = 1;
goto A;
break;
}
switch(SET)
{
case 1:
delay = 0;
delay += buf[rp]*100;
SET++;
break;
case 2:
delay +=buf[rp]*10;
SET++;
break;
case 3:
delay += buf[rp];
SET = 0;//ディレイ繰り返し数設定モードを抜ける
break;
}
A:
rp++;
n--;
if(rp==16) rp = 0;
RCIE = 1;
}