【遊戯王真DM】チートリモコンLiteを製作する~ソースコード一覧~【封印されし記憶】

1年前に、遊戯王真デュエルモンスターズ~封印されし記憶~のポケットステーションで強力なカードを入手するためのツール:チートリモコンを製作記事を作成した。
今回は、チートリモコンの設計を見直し、小型で操作性を向上したLite版を製作する。




<初代チートリモコン>
封印されし記憶を語る
概要編
ハードウェア編
ソフトウェア編①:動作確認
ソフトウェア編②:キー操作
ソフトウェア編③:チャタリング対策
ソフトウェア編④:NECフォーマット
ソースコード一覧
入手カード一覧


<チートリモコンLite>
回路図編
ソフトウェア編
基板実装編
ソースコード一覧 ←いまここ




下記ソースコードをそのままコピーすれば動くはずですが、内部発振を使っているため個体による誤差があります。
送信失敗するほど誤差があった場合はIrREMlib.cのNecGenTonの時間を調整してください。




pic16f1786_config.h

// PIC16F1786 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF     // Voltage Regulator Capacitor Enable bit (Vcap functionality is disabled on RA6.)
#pragma config PLLEN = ON       // PLL Enable (4x PLL enabled)
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF      // Low Power Brown-Out Reset Enable Bit (Low power brown-out is disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>


main.c

//#include <stdio.h>
//#include <stdlib.h>
#include "xc.h"
#include "pic16f1786_config.h"
#include "IrREMlib.h"

#define _XTAL_FREQ 32000000

// I/O
#define CUSTOM  ~PORTA
#define DATA    PORTC
#define SEND_SW RB0
#define LED_ON  LATB5 = 1;
#define LED_OFF LATB5 = 0;

int main() {
  unsigned char nec_custom = 0;
  unsigned char nec_data   = 0;

  // Clock Config
  OSCCONbits.IRCF = 0b1110; // 8MHz(x4 = 32MHz)

  // I/O Port Init
  ANSELA = 0x00; //全てデジタル
  ANSELB = 0x00; //全てデジタル
  TRISA  = 0xFF; //全て入力
  TRISB  = 0xDF; //RB5のみ出力
  TRISC  = 0xFF; //全て入力
  nWPUEN = 0;    //内部プルアップ有効化
  WPUA   = 0xFF; //全て内部プルアップ有り
  WPUB   = 0x01; //RB0のみ内部プルアップ有り
  WPUC   = 0xFF; //全て内部プルアップ有り
  LED_OFF;

  // Main Loop
  while(1){
    if(SEND_SW == 0){
      nec_custom = CUSTOM;
      nec_data   = DATA;
      do{
        NecSend(nec_custom, nec_data);
        __delay_ms(40);
      }
      while(SEND_SW == 0);
    }
  }

  return (EXIT_SUCCESS);
}


IrREMlib.h

#ifndef IRREMLIB_H
#define	IRREMLIB_H

// NEC Format
void NecSend(unsigned char custom, unsigned char data);

#endif


IrREMlib.c

#include "xc.h"

#define _XTAL_FREQ 32000000

#define LED_ON  LATB5 = 1
#define LED_OFF LATB5 = 0

void NecGenTon(void){
  int i;
  for(i=0; i<21; i++){
    LED_ON;
    __delay_us(8);
    LED_OFF;
    __delay_us(15);
    _delay(4);
  }
  __delay_us(5);
}

void NecGenToff(void){
//  LED_OFF;
  __delay_us(562);
}

void NecGenBitOn(void){
  NecGenTon();
  NecGenToff();
  NecGenToff();
  NecGenToff();
}

void NecGenBitOff(void){
  NecGenTon();
  NecGenToff();
}

void NecSend(unsigned char custom, unsigned char data){
  int i;
  //Leader Code
  for(i=0; i<16; i++){
    NecGenTon();
  }
  for(i=0; i<8; i++){
    NecGenToff();
  }
  //Custom Code
  for(i=0; i<8; i++){
    if(custom>>i & 1){
      NecGenBitOn();
    }
    else{
      NecGenBitOff();
    }
  }
  //Custom Code(invert)
  for(i=0; i<8; i++){
    if(custom>>i & 1){
      NecGenBitOff();
    }
    else{
      NecGenBitOn();
    }
  }
  //Data Code
  for(i=0; i<8; i++){
    if(data>>i & 1){
      NecGenBitOn();
    }
    else{
      NecGenBitOff();
    }
  }
  //Data Code(invert)
  for(i=0; i<8; i++){
    if(data>>i & 1){
      NecGenBitOff();
    }
    else{
      NecGenBitOn();
    }
  }
  //Stop Bit
  NecGenTon();
}