19
電光掲示プレート PIC16F886 用プログラム HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.81 使用バージョン // dd42.c #include <htc.h> #define _XTAL_FREQ 4000000 #define PORTX PORTC #define PORTY PORTB __CONFIG(FOSC_INTRC_NOCLKOUT & MCLRE_OFF & BOREN_OFF & WDTE_OFF & LVP_OFF); __EEPROM_DATA(36,40,34,254,96,168,100,0); __EEPROM_DATA(0,240,2,2,4,248,0,0); __EEPROM_DATA(66,68,248,64,64,66,126,0); __EEPROM_DATA(0,0,254,2,4,8,16,0); __EEPROM_DATA(136,144,254,146,146,158,128,0); __EEPROM_DATA(2,252,0,120,0,0,254,0); __EEPROM_DATA(56,68,130,130,130,68,56,0); __EEPROM_DATA(56,68,130,130,130,130,68,0); __EEPROM_DATA(136,144,254,146,146,158,128,0); __EEPROM_DATA(2,252,0,120,0,0,254,0); __EEPROM_DATA(132,252,254,214,114,252,170,0); __EEPROM_DATA(32,126,180,126,0,254,90,0); __EEPROM_DATA(210,124,84,186,174,174,186,0); __EEPROM_DATA(34,34,36,248,36,34,34,0); __EEPROM_DATA(56,68,130,130,130,68,56,0); __EEPROM_DATA(56,68,130,130,130,130,68,0); __EEPROM_DATA(0,124,130,130,130,130,124,0); __EEPROM_DATA(0,0,0,66,254,2,0,0); __EEPROM_DATA(0,70,138,138,146,146,98,0); __EEPROM_DATA(0,68,130,146,146,146,108,0); __EEPROM_DATA(0,12,20,36,68,254,4,0); __EEPROM_DATA(0,244,162,162,162,162,156,0); __EEPROM_DATA(0,124,146,146,146,146,76,0); __EEPROM_DATA(0,128,128,134,152,160,192,0); __EEPROM_DATA(255,128,128,128,128,128,128,128); __EEPROM_DATA(64,255,64,64,64,64,64,64); __EEPROM_DATA(32,32,255,32,32,32,32,32); __EEPROM_DATA(16,16,16,255,16,16,16,16); __EEPROM_DATA(8,8,8,8,255,8,8,8); __EEPROM_DATA(4,4,4,4,4,255,4,4); __EEPROM_DATA(2,2,2,2,2,2,255,2); __EEPROM_DATA(1,1,1,1,1,1,1,255); const unsigned char rom4[64]= {36,42,34,34,226,58,160,0, 120,4,2,4,64,32,24,0, 0,252,2,2,2,4,0,0, 32,32,64,68,68,68,56,0, 64,72,114,210,82,76,0,0, 0,0,56,18,124,36,24,0, 16,162,162,162,164,24,0,0, 0,14,10,14,0,0,0,0}; const unsigned char rom5[64]= {68,74,254,80,18,82,44,0, 64,64,88,164,194,162,0,0, 34,44,242,34,28,32,24,0, 252,0,32,34,252,32,32,0, 64,72,114,210,82,76,0,0, 0,0,56,18,124,36,24,0, 16,162,162,162,164,24,0,0, 32,120,124,62,124,120,32,0}; const unsigned char rom6[64]= {4,8,214,248,215,8,16,0, 16,8,215,248,214,8,4,0, 4,8,214,248,215,8,16,0, 16,8,215,248,214,8,4,0, 4,8,215,248,215,8,4,0, 16,8,215,248,215,8,16,0, 32,16,215,248,215,16,32,0, 96,16,215,248,215,16,96,0}; const unsigned char rom7[64]= {30,16,14,0,12,18,12,0, 126,8,22,0,12,18,30,0, 0,94,0,0,0,2,0,0, 0,94,0,0,30,16,14,0, 16,126,80,0,12,18,12,0, 4,8,16,0,0,94,0,0, 31,18,12,0,12,18,18,0, 4,8,16,0,0,0,0,0}; const unsigned char romN[64]= {0,124,130,130,130,130,124,0, 0,0,0,66,254,2,0,0, 0,70,138,138,146,146,98,0, 0,68,130,146,146,146,108,0, 0,12,20,36,68,254,4,0, 0,244,162,162,162,162,156,0, 0,124,146,146,146,146,76,0, 0,128,128,134,152,160,192,0}; __EEPROM_DATA EEPROM に書き込ま れるデータで No.03 の初期データ。 const unsigned char rom ProgramROM に書き込まれるデータ No.47 の初期デー タ。 共に 1 1byte、8列で 1画面。これを8画面 分で1パターンを構成 している。 excel 等でドット絵を描 き変換してテキストデ ータを貼り付けて作成 すると良い。

電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

電光掲示プレート PIC16F886用プログラム

HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.81

使用バージョン

// dd42.c

#include <htc.h>

#define _XTAL_FREQ 4000000

#define PORTX PORTC

#define PORTY PORTB

__CONFIG(FOSC_INTRC_NOCLKOUT & MCLRE_OFF &

BOREN_OFF & WDTE_OFF & LVP_OFF);

__EEPROM_DATA(36,40,34,254,96,168,100,0);

__EEPROM_DATA(0,240,2,2,4,248,0,0);

__EEPROM_DATA(66,68,248,64,64,66,126,0);

__EEPROM_DATA(0,0,254,2,4,8,16,0);

__EEPROM_DATA(136,144,254,146,146,158,128,0);

__EEPROM_DATA(2,252,0,120,0,0,254,0);

__EEPROM_DATA(56,68,130,130,130,68,56,0);

__EEPROM_DATA(56,68,130,130,130,130,68,0);

__EEPROM_DATA(136,144,254,146,146,158,128,0);

__EEPROM_DATA(2,252,0,120,0,0,254,0);

__EEPROM_DATA(132,252,254,214,114,252,170,0);

__EEPROM_DATA(32,126,180,126,0,254,90,0);

__EEPROM_DATA(210,124,84,186,174,174,186,0);

__EEPROM_DATA(34,34,36,248,36,34,34,0);

__EEPROM_DATA(56,68,130,130,130,68,56,0);

__EEPROM_DATA(56,68,130,130,130,130,68,0);

__EEPROM_DATA(0,124,130,130,130,130,124,0);

__EEPROM_DATA(0,0,0,66,254,2,0,0);

__EEPROM_DATA(0,70,138,138,146,146,98,0);

__EEPROM_DATA(0,68,130,146,146,146,108,0);

__EEPROM_DATA(0,12,20,36,68,254,4,0);

__EEPROM_DATA(0,244,162,162,162,162,156,0);

__EEPROM_DATA(0,124,146,146,146,146,76,0);

__EEPROM_DATA(0,128,128,134,152,160,192,0);

__EEPROM_DATA(255,128,128,128,128,128,128,128);

__EEPROM_DATA(64,255,64,64,64,64,64,64);

__EEPROM_DATA(32,32,255,32,32,32,32,32);

__EEPROM_DATA(16,16,16,255,16,16,16,16);

__EEPROM_DATA(8,8,8,8,255,8,8,8);

__EEPROM_DATA(4,4,4,4,4,255,4,4);

__EEPROM_DATA(2,2,2,2,2,2,255,2);

__EEPROM_DATA(1,1,1,1,1,1,1,255);

const unsigned char rom4[64]=

{36,42,34,34,226,58,160,0,

120,4,2,4,64,32,24,0,

0,252,2,2,2,4,0,0,

32,32,64,68,68,68,56,0,

64,72,114,210,82,76,0,0,

0,0,56,18,124,36,24,0,

16,162,162,162,164,24,0,0,

0,14,10,14,0,0,0,0};

const unsigned char rom5[64]=

{68,74,254,80,18,82,44,0,

64,64,88,164,194,162,0,0,

34,44,242,34,28,32,24,0,

252,0,32,34,252,32,32,0,

64,72,114,210,82,76,0,0,

0,0,56,18,124,36,24,0,

16,162,162,162,164,24,0,0,

32,120,124,62,124,120,32,0};

const unsigned char rom6[64]=

{4,8,214,248,215,8,16,0,

16,8,215,248,214,8,4,0,

4,8,214,248,215,8,16,0,

16,8,215,248,214,8,4,0,

4,8,215,248,215,8,4,0,

16,8,215,248,215,8,16,0,

32,16,215,248,215,16,32,0,

96,16,215,248,215,16,96,0};

const unsigned char rom7[64]=

{30,16,14,0,12,18,12,0,

126,8,22,0,12,18,30,0,

0,94,0,0,0,2,0,0,

0,94,0,0,30,16,14,0,

16,126,80,0,12,18,12,0,

4,8,16,0,0,94,0,0,

31,18,12,0,12,18,18,0,

4,8,16,0,0,0,0,0};

const unsigned char romN[64]=

{0,124,130,130,130,130,124,0,

0,0,0,66,254,2,0,0,

0,70,138,138,146,146,98,0,

0,68,130,146,146,146,108,0,

0,12,20,36,68,254,4,0,

0,244,162,162,162,162,156,0,

0,124,146,146,146,146,76,0,

0,128,128,134,152,160,192,0};

__EEPROM_DATAは

EEPROMに書き込ま

れるデータで No.0~3

の初期データ。

const unsigned char

romは ProgramROM

に書き込まれるデータ

で No.4~7の初期デー

タ。

共に 1列 1byte、8列で

1画面。これを8画面

分で1パターンを構成

している。

excel等でドット絵を描

き変換してテキストデ

ータを貼り付けて作成

すると良い。

Page 2: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

unsigned char shift;

unsigned char page;

unsigned int dtime = 0;

unsigned int stime = 0;

unsigned char mem[72];

unsigned char dpmode;

void interrupt all_isr(void)

{

if (T0IF)

{

dtime++;

stime++;

if (dpmode==0 && dtime > 150)

{

dtime = 0;

shift ++;

if (shift > 71)

shift = 8;

}

if (dpmode==1 && dtime > 500)

{

dtime = 0;

page ++;

if (page > 8)

page = 1;

}

TMR0 = 6;

T0IF = 0;

}

}

unsigned char readRom(unsigned char n)

{

unsigned char i;

if (n < 8)

{

for (i=0; i<8; i++)

mem[i] = romN[i+n*8];

}

if (n < 4)

{

EEPGD = 0;

for (i=0; i<64; i++)

{

EEADR = i + n * 64;

RD = 1;

while (RD == 1)

;

mem[i+8]=EEDATA;

}

return 1;

}

else

{

for (i=0; i<64; i++)

{

switch(n)

{

case 4: mem[i+8]=rom4[i];

break;

case 5: mem[i+8]=rom5[i];

break;

case 6: mem[i+8]=rom6[i];

break;

case 7: mem[i+8]=rom7[i];

break;

default:

mem[i+8]=0;

}

}

return 1;

}

}

all_isrは、割込関数で、

割込が発生すると実行

される。

割込はタイマ割込のみ

使用。

これで一定時間ごとに

画面のスクロールや切

り替えを行っている。

readROMは、画面パタ

ーンの切り替え時に呼

び出されて、現在の画

面を指定した番号のデ

ータパターンに切り替

える動作を行う。

データ番号が4以下で

あればEEPROMから、

それ以外は ProgramR

OMからデータを取り

出している。

Page 3: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

unsigned char writeRom(unsigned char n)

{

unsigned char i;

if (n > 3)

return 0;

EEPGD = 0;

for (i=0; i<64; i++)

{

EEADR = i + n * 64;

EEDATA = mem[i+8];

WREN = 1;

EECON2 = 0x55;

EECON2 = 0xaa;

WR = 1;

while (WR == 1)

{

PORTX = 128;

PORTY = n;

PORTX = 128;

PORTY = i;

}

}

for (i=0; i<8; i++)

mem[i] = romN[i+n*8];

return 1;

}

void main(void)

{

unsigned char vdat,vclk,vth;

unsigned char bdat,bclk,bbclk;

unsigned char dx;

unsigned char pp,px,py;

unsigned char admode,wtmode,wtflag;

unsigned char ra2en,ra3en;

unsigned char romnum;

unsigned char i;

const char cbit[]={128,64,32,16,8,4,2,1};

OSCCON = 0b01100111;

TRISA = 0b00001111;

TRISB = 0b00000000;

TRISC = 0b00000000;

ANSEL = 0b00000011;

ANSELH = 0b00000000;

ADCON0 = 0b01000001;

ADCON1 = 0b00000000;

T0CS = 0;

PSA = 0;

PS2 = 0;

PS1 = 0;

PS0 = 1;

TMR0 = 6;

T0IE = 1;

GIE = 1;

admode = 0;

dpmode = 0;

wtmode = 0;

wtflag = 0;

dx = 0;

pp = 0;

px = 0;

py = 0;

shift = 0;

page = 0;

ra2en = 0;

ra3en = 0;

romnum = 0;

readRom(romnum);

writeROMは、画面パ

ターンをパソコン等か

ら読み込み時に呼び出

されて、指定した番号

のデータパターンを書

き換える動作を行う。

データ番号が4以下で

あれば EEPROMのデ

ータを書き換え、それ

以外の場合は書き換え

を行わずに実行を戻

す。

(現バージョンでは、

No.4~7 (ProgramRO

M)の書き換えには対応

していません。)

CPUクロック、I/O、A/

D変換、タイマ割込、そ

の他変数の初期化等を

行っている。

Page 4: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

while(1)

{

if (admode == 0)

{

ADCON0 = 0b01000101;

admode = 1;

}

else if (admode == 1)

{

GO_DONE = 1;

admode = 2;

}

else if (admode == 2 && !GO_DONE)

{

vdat = ADRESH;

bdat = (vdat > vth)?1:0;

admode = 3;

}

else if (admode == 3)

{

ADCON0 = 0b01000001;

admode = 4;

}

else if (admode == 4)

{

GO_DONE = 1;

admode = 5;

}

else if (admode == 5 && !GO_DONE)

{

vclk = ADRESH;

bbclk = bclk;

bclk = (vclk > vth)?1:0;

admode = 0;

}

if (!RA2 && !ra2en)

{

stime = 0;

ra2en = 1;

if (wtmode)

{

readRom(romnum);

wtmode = 0;

}

}

if (RA2 && ra2en)

{

if (stime < 1000)

{

romnum++;

if (romnum>7)

romnum=0;

readRom(romnum);

shift = 0;

page = 0;

ra2en = 0;

}

else

{

if (wtmode == 0)

{

vth = (vdat/2) + (vclk/2) ;

pp = 0;

px = 6;

py = 0;

wtflag = 0;

wtmode = 1;

for (dx=0; dx<72; dx++)

mem[dx]=0;

dx = 0;

}

else

{

wtmode = 0;

}

shift = 0;

page = 0;

ra2en = 0;

}

}

左右それぞれの光セン

サ前の色の明るさを、段

階を踏みながら、A/D変

換して取り込んでいる。

ここから先は繰り返し実

行される。

ボタン1を1秒以内に押

して離した場合の処理

として、表示パターンの

切り替えを行っている。

ボタン1を 1秒以上押

して離した場合の処理

として、転送(表示パタ

ーンのパソコン等から

読み込む)モードへの移

行準備と移行処理を行

っている

ボタン1が押されたか

どうか判断し、押された

場合は、押している時間

を計測するための準備

をしている。

Page 5: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

if (!RA3 && !ra3en)

{

stime = 0;

ra3en = 1;

if (wtmode)

{

readRom(romnum);

wtmode = 0;

}

}

if (RA3 && ra3en)

{

if (stime < 1000)

{

if (dpmode == 0)

dpmode = 1;

else

dpmode = 0;

shift = 0;

page = 0;

ra3en = 0;

}

else

{

if (dpmode == 2)

dpmode = 0;

else

dpmode = 2;

shift = 0;

page = 0;

ra3en = 0;

}

}

if (wtmode)

{

if (bclk == 1)

wtflag = 0;

if (wtflag == 0 && bclk == 0 && bbclk == 1)

{

wtflag = 1;

};

if (wtflag == 1)

{

if (bdat)

mem[px+pp*8] |= cbit[py];

else

mem[px+pp*8] &= ~cbit[py];

py++;

if (py > 7)

{

py = 0;

px ++;

if (px > 7)

{

px = 0;

pp++;

if (pp > 8)

{

pp = 0;

shift = 0;

page = 0;

wtmode = 0;

writeRom(mem[6]);

}

}

}

wtflag = 2;

}

}

ボタン2が押されたか

どうか判断し、押された

場合は、押している時間

を計測するための準備

をしている。

ボタン2を 1秒以内に

押して離した場合の処

理として、表示モードの

切り替え(スクロール表

示 orアニメーション表

示)を行っている。

ボタン2を 1秒以上押

して離した場合の処理

として、デバッグ(光セ

ンサの状態等を表示)モ

ードへの移行準備と移

行処理を行っている

転送モード時の処理(光

センサの情報を解読し

て、表示パターンに変換

し記録する)を行ってい

Page 6: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

PORTY = 0;

PORTX = cbit[dx];

if (wtmode == 1)

{

PORTY = mem[dx+pp*8];

}

else if (dpmode == 0)

{

if (dx+shift < 72)

PORTY = mem[dx+shift];

else

PORTY = mem[dx+shift-72+8];

}

else if (dpmode == 1)

{

PORTY = mem[dx+page*8];

}

else if (dpmode == 2)

{

switch (dx)

{

case 0: PORTY = vdat;

break;

case 1: PORTY = vth;

break;

case 2: PORTY = vclk;

break;

case 3: PORTY = bdat;

break;

case 4: PORTY = bclk;

break;

default: PORTY = 0;

}

}

__delay_ms(1);

dx++;

if (dx > 7)

dx = 0;

}

}

各種モードに応じて、表

示内容を切り替えて、表

示処理を行っている。

Page 7: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

電光掲示プレートデータ作成ツール (Windows用プログラム)

Borland C++ 5.5.1 for Win32使用バージョン

// bb030b.c

#include <windows.h>

DWORD dwTime;

DWORD dwTmax;

BYTE bMem[264];

BYTE bPnum,bFnum;

BYTE bTool;

BYTE bSpeed;

LPCTSTR strPName = TEXT("電光掲示プレートデータ作成ツール 0.14");

const BYTE cbBIT[]={1,2,4,8,16,32,64,128};

const int ciWINW=1200;

const int ciWINH=400;

const int ciX0=8;

const int ciY0=8;

const int ciW0=18;

RECT rc;

BYTE bWmode, bWval, bWclk ,bWsyc;

int wWnum;

LPCTSTR sItemCB1[] = {

TEXT("Page 0") ,

TEXT("Page 1") ,

TEXT("Page 2") ,

TEXT("Page 3")

};

LPCTSTR sItemCB2[] = {

TEXT("速度 0") ,

TEXT("速度 1") ,

TEXT("速度 2") ,

TEXT("速度 3") ,

TEXT("速度 4")

};

グローバル変数や定数の

設定

Page 8: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

void Loop(HWND hwnd)

{

if (GetTickCount() > dwTime+20+bSpeed*20)

dwTime=GetTickCount();

else

return;

if (bWmode == 1)

{

bWsyc ^= 0x01;

if (bWsyc)

{

bWclk ^= 0x01;

if (wWnum < 0)

{

if (wWnum == -4 || wWnum == -8)

bWval = 1;

else if (wWnum == -9)

bWval = (bPnum&0x01) ? 1 : 0;

else if (wWnum == -10)

bWval = (bPnum&0x02) ? 1 : 0;

else if (wWnum == -11)

bWval = (bPnum&0x04) ? 1 : 0;

else

bWval = 0;

wWnum++;

}

else

{

bWval = (bMem[wWnum/8+bPnum*64] >> (wWnum % 8)) & 0x01;

wWnum++;

if (wWnum > 64*8)

{

bWmode = 0;

wWnum = 0;

bWsyc = 0;

bWval = 1;

bWclk = 0;

}

}

}

else

{

bWclk ^= 0x01;

}

SetRect(&rc, 90, ciY0+8*ciW0, 150+60, ciY0+11*ciW0);

InvalidateRect(hwnd,&rc,FALSE);

}

}

Loopは、一定時間毎に

呼び出される関数。

転送モードの処理に必

要な時間の記録処理等

を行う。

転送モードの場合、転送

に必要な各種処理を実行

する。

Page 9: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)

{

HDC hdc;

int i,j,k;

int stdid;

static HWND hTool;

static HWND pbutton1;

static HWND pbutton2;

static HWND pbutton3;

static HWND combo1;

static HWND combo2;

static HBRUSH pen0;

static HBRUSH pen2;

static HBRUSH pen8;

static HBRUSH pen9;

PAINTSTRUCT ps;

LPTSTR lptStr[20];

static OPENFILENAME ofn;

static char szFile[MAX_PATH];

static char szFileTitle[MAX_PATH];

HANDLE hFile;

DWORD dwAccBytes;

switch (msg)

{

case WM_DESTROY:

PostQuitMessage(0);

return 0;

case WM_CREATE:

memset(&ofn,0,sizeof(OPENFILENAME));

ofn.lStructSize = sizeof (OPENFILENAME);

ofn.hwndOwner = hwnd;

ofn.lpstrFilter = TEXT("binary files {*.bin}¥0*.bin¥0")

TEXT("All files {*.*}¥0*.*¥0¥0");

ofn.nMaxCustFilter = 264;

ofn.lpstrFile = szFile;

ofn.lpstrFileTitle = szFileTitle;

ofn.nMaxFile = MAX_PATH;

ofn.nMaxFileTitle = MAX_PATH;

ofn.Flags = OFN_FILEMUSTEXIST;

pbutton1 = CreateWindow(

TEXT("BUTTON") , TEXT("読込") ,

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

4, ciY0+8*ciW0+60 , 80 , 20 ,

hwnd , (HMENU)101 ,

((LPCREATESTRUCT)(lp))->hInstance , NULL

);

pbutton2 = CreateWindow(

TEXT("BUTTON") , TEXT("書込") ,

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

85, ciY0+8*ciW0+60 , 80 , 20 ,

hwnd , (HMENU)102 ,

((LPCREATESTRUCT)(lp))->hInstance , NULL

);

Windowsアプリケーシ

ョンに必要な各種変数を

宣言している。

WM_DESTROY時は、ア

プリケーション終了時の

後処理を行う。

WM_CREATE時は、ア

プリケーション開始時

の処理として、各種フォ

ームやボタンの表示を

行っている。

WndProcはアプリケー

ション実行中に繰り返し

実行される。

Page 10: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

pbutton3 = CreateWindow(

TEXT("BUTTON") , TEXT("転送") ,

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

350, ciY0+8*ciW0+60 , 80 , 20 ,

hwnd , (HMENU)103 ,

((LPCREATESTRUCT)(lp))->hInstance , NULL

);

combo1 = CreateWindow(

TEXT("COMBOBOX") , NULL ,

WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST ,

4, ciY0+8*ciW0+2 , 80 , 400 ,

hwnd , (HMENU)201 ,

((LPCREATESTRUCT)(lp))->hInstance , NULL

);

for (i = 0 ; i < 4 ; i++)

SendMessage(combo1 , CB_ADDSTRING , 0 , (LPARAM)sItemCB1[i]);

SendMessage(combo1 , CB_SETCURSEL , 0 , 0);

combo2 = CreateWindow(

TEXT("COMBOBOX") , NULL ,

WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST ,

4 , ciY0+8*ciW0+2 + 30 , 80 , 400 ,

hwnd , (HMENU)202 ,

((LPCREATESTRUCT)(lp))->hInstance , NULL

);

for (i = 0 ; i < 5 ; i++)

SendMessage(combo2 , CB_ADDSTRING , 0 , (LPARAM)sItemCB2[i]);

SendMessage(combo2 , CB_SETCURSEL , 0 , 0);

for (i = 0; i< 264; i++)

bMem[i] = 0;

bPnum = 0;

bFnum = 0;

bWmode = 0;

wWnum = 0;

bWsyc = 0;

bWval = 1;

bWclk = 0;

dwTmax = 20;

return 0;

引き続き各種フォームや

ボタンの表示を行ってい

る。

Page 11: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

case WM_COMMAND:

// if (HIWORD(wp) == CBN_SELCHANGE)

// {

switch(LOWORD(wp))

{

case 101:

if (GetOpenFileName(&ofn) == 0)

MessageBox(hwnd,"Open Error.","101",MB_OK);

hFile = CreateFile(szFile, GENERIC_READ, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

ReadFile(hFile,bMem,264,&dwAccBytes,NULL);

CloseHandle(hFile);

InvalidateRect(hwnd,NULL,TRUE);

break;

case 102:

if (GetSaveFileName(&ofn) == 0 )

MessageBox(hwnd,"Save Error.","102",MB_OK);

hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL,

CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(hFile,bMem,264,&dwAccBytes,NULL);

CloseHandle(hFile);

InvalidateRect(hwnd,NULL,TRUE);

break;

case 103:

if (bWmode == 0)

bWmode = 1;

else

bWmode = 0;

dwTime = 0;

wWnum = -16;

bWsyc = 0;

bWval = 1;

bWclk = 0;

SetRect(&rc, 90, ciY0+8*ciW0, 150+60, ciY0+11*ciW0);

InvalidateRect(hwnd,&rc,FALSE);

break;

case 201:

bPnum = SendMessage(combo1 , CB_GETCURSEL , 0 , 0);

InvalidateRect(hwnd,NULL,TRUE);

break;

case 202:

bSpeed = SendMessage(combo2 , CB_GETCURSEL , 0 , 0);

break;

}

// }

return 0;

case WM_LBUTTONDOWN:

for (j =0 ; j <64; j++)

for (i = 0; i < 8; i++)

if (LOWORD(lp) > ciX0+j*ciW0 && HIWORD(lp) > ciY0+i*ciW0

&& LOWORD(lp) < ciX0+j*ciW0+ciW0 && HIWORD(lp) < ciY0+i*ciW0+ciW0)

{

bMem[bPnum*64+bFnum*8+j] ^= cbBIT[i];

SetRect(&rc, ciX0+j*ciW0, ciY0+i*ciW0, ciX0+j*ciW0+ciW0-3, ciY0+i*ciW0+ciW0-3);

InvalidateRect(hwnd,&rc,TRUE);

}

return 0;

WM_COMMAND時は、

各種フォームの変更や

ボタンが押された場合

の処理を行っている。

case 101:

「読込」ボタンが押された場

合、ファイルを指定してもらい

データの読込処理を行う。

case 102:

「書込」ボタンが押された場合

ファイルを指定してもらいデ

ータの書込処理を行う。

case 103:

「転送」ボタンが押された場

合、転送のための初期設定やモ

ード切り替えを行う。

case 201:

「Page」切り替えられた場合、

表示するページの切り替えを

行う。

case 202:

「速度」切り替えられた場合、

転送時の転送速度の切り替え

を行う。

WM_LBUTTONDOW

Nは、マウスの左クリッ

ク時に起きるので、マウ

スの位置に基づいて、各

ドットの ON/OFF処理

を行う。

Page 12: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

case WM_PAINT:

hdc = BeginPaint(hwnd , &ps);

pen0 = CreateSolidBrush(RGB(0x0,0x0,0x0));

pen2 = CreateSolidBrush(RGB(0xff,0x0,0x0));

pen8 = CreateSolidBrush(RGB(0xc0,0xc0,0xc0));

pen9 = CreateSolidBrush(RGB(0xff,0xff,0xff));

SelectObject(hdc , pen0);

for (i = 0; i < 9; i++)

{

MoveToEx(hdc,ciX0+(i*8)*ciW0-2,ciY0-2,NULL);

LineTo(hdc,ciX0+(i*8)*ciW0-2,ciY0+8*ciW0-2);

}

MoveToEx(hdc,ciX0-2,ciY0-2,NULL);

LineTo(hdc,ciX0+64*ciW0-2,ciY0-2);

MoveToEx(hdc,ciX0-2,ciY0+8*ciW0-2,NULL);

LineTo(hdc,ciX0+64*ciW0-2,ciY0+8*ciW0-2);

for (j =0 ; j <64; j++)

for (i = 0; i < 8; i++)

if ( !(bMem[bPnum*64+bFnum*8+j] & cbBIT[i]) )

{

SelectObject(hdc , pen8);

Ellipse(hdc ,ciX0+j*ciW0,ciY0+i*ciW0,ciX0+j*ciW0+ciW0-3,ciY0+i*ciW0+ciW0-3);

}

else

{

SelectObject(hdc , pen2);

Ellipse(hdc ,ciX0+j*ciW0,ciY0+i*ciW0,ciX0+j*ciW0+ciW0-3,ciY0+i*ciW0+ciW0-3);

}

if (bWval == 1)

SelectObject(hdc , pen9);

else

SelectObject(hdc , pen0);

Rectangle(hdc ,90,ciY0+8*ciW0,150,ciY0+11*ciW0);

if (bWclk == 1)

SelectObject(hdc , pen9);

else

SelectObject(hdc , pen0);

Rectangle(hdc ,150,ciY0+8*ciW0,210,ciY0+11*ciW0);

DeleteObject(pen0);

DeleteObject(pen2);

DeleteObject(pen8);

DeleteObject(pen9);

EndPaint(hwnd , &ps);

return 0;

}

return DefWindowProc(hwnd , msg , wp , lp);

}

WM_PAINT:は、ウイン

ドウの変形など、再描画

が必要な時に起きるの

で、現在の状態を元に、

画面の再描画処理を行

う。

Page 13: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

int WINAPI WinMain(

HINSTANCE hInstance ,

HINSTANCE hPrevInstance ,

PSTR lpCmdLine ,

int nCmdShow )

{

HWND hwnd;

MSG msg;

WNDCLASS winc;

winc.style = CS_HREDRAW | CS_VREDRAW;

winc.lpfnWndProc = WndProc;

winc.cbClsExtra = winc.cbWndExtra = 0;

winc.hInstance = hInstance;

winc.hIcon = LoadIcon(hInstance , TEXT("DMICON"));

winc.hCursor = LoadCursor(NULL , IDC_ARROW);

winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

winc.lpszMenuName = NULL;

winc.lpszClassName = TEXT("BB000");

if (!RegisterClass(&winc))

return -1;

hwnd = CreateWindow(

TEXT("BB000") , strPName ,

WS_OVERLAPPEDWINDOW | WS_VISIBLE ,

CW_USEDEFAULT , CW_USEDEFAULT ,

ciWINW , ciWINH ,

NULL , NULL , hInstance , NULL);

// SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

if (hwnd == NULL)

return -1;

dwTime=GetTickCount();

while (1)

{

if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE))

{

if (!GetMessage (&msg,NULL,0,0))

return msg.wParam ;

TranslateMessage(&msg);

DispatchMessage(&msg);

}

else

{

Loop(hwnd);

}

}

}

WinMainはアプリケー

ション実行時の最初に

実行される。

Windowsアプリケーシ

ョンに必要な各種初期

処理や設定等を行う。

Page 14: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

電光掲示プレートデータ作成ツール (Web用プログラム)

HTML5,JavaScript使用バージョン

dm025.html

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta http-equiv="Content-Language" content="ja" />

<meta http-equiv="Content-Style-Type" content="text/css" />

<meta http-equiv="Content-Script-Type" content="text/javascript" />

<link rel="shortcut icon" href="favicon.ico" type="image/vnd.microsoft.icon" />

<link rel="icon" href="favicon.ico" type="image/vnd.microsoft.icon" />

<link rel="stylesheet" type="text/css" href="dm025a.css" id="dmstyle" />

<!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->

<!--[if lt IE 8]><script type="text/javascript" src="/ex/exdomstorage.js"></script><![endif]-->

<script type="text/javascript" src="dm025.js"></script>

<title>電光掲示プレートデータ作成ツール</title>

</head>

<body>

<h1 id="title1">電光掲示プレートデータ作成ツール</h1>

<div id="edit1">

<div id="draw1">

<canvas id="dotcanvas" width="160" height="160" onclick="clickhandler(event)"></canvas>

<img src="num.PNG" alt="番号" />

</div>

<form name="form">

<input type="button" value=" ← " onClick=decPage() />

<select name="page" size="1" onChange=setPage() />

<option value="pg0">0</option>

<option value="pg1">1</option>

<option value="pg2">2</option>

<option value="pg3">3</option>

<option value="pg4">4</option>

<option value="pg5">5</option>

<option value="pg6">6</option>

<option value="pg7">7</option>

</select>

<input type="button" value=" → " onClick=incPage() />

<br />

</div>

<div id="edit2">

<input type="button" value="切り取り" onClick=cutData() />

<input type="button" value="コピー" onClick=copyData() />

<input type="button" value="貼り付け" onClick=pasteData() />

<br />

<br />

<input type="button" value="簡易読込" onClick=loadData() />

<input type="button" value="簡易書込" onClick=saveData() />

<br />

<br />

<input type="button" value="編集" onClick=editData() />

<input type="button" value="再1" onClick=scrollData() />

<input type="button" value="再2" onClick=animateData() />

<br />

<br />

<input type="button" value="転送" onClick=transmitData() />

<select name="romnumber" size="1" onChange=setSpeed() />

<option value="rom0">rom:0</option>

<option value="rom1">rom:1</option>

<option value="rom2">rom:2</option>

<option value="rom3">rom:3</option>

</select>

ファビコンの設定や、J

avaScript、及びIE等、

HTML5に未対応のブラ

ウザに対する設定など

行っている。

各種フォームの表示と、

実行動作を行う JavaSc

riptの関数を設定して

いる。

Page 15: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

<select name="speed" size="1" onChange=setSpeed() />

<option value="sp0">高速</option>

<option value="sp1">中速</option>

<option value="sp2">低速</option>

<option value="sp3">超低速</option>

</select>

<br />

<br />

</div>

<div id="edit3">

<input type="text" name = "dot0" size = "3" onChange=setNum2Dot() />

<input type="text" name = "dot1" size = "3" onChange=setNum2Dot() />

<input type="text" name = "dot2" size = "3" onChange=setNum2Dot() />

<input type="text" name = "dot3" size = "3" onChange=setNum2Dot() />

<input type="text" name = "dot4" size = "3" onChange=setNum2Dot() />

<input type="text" name = "dot5" size = "3" onChange=setNum2Dot() />

<input type="text" name = "dot6" size = "3" onChange=setNum2Dot() />

<input type="text" name = "dot7" size = "3" onChange=setNum2Dot() />

<br />

</div>

<select onchange="changesytle(value);">

<option value="dm025a.css">横表示</option>

<option value="dm025b.css">縦表示</option>

</select>

</form>

<p><a href="dm00.html">戻る</a></p>

</body>

</html>

dm025a.css

#title1{}

#edit1{

float: left;

}

#edit2{

}

#edit3{

clear : both

}

dm025b.css

#title1{}

#edit1{

}

#edit2{

}

#edit3{

}

「横表示」時に利用する

cssファイル

「縦表示」時に利用する

cssファイル

引き続き、各種フォーム

の表示と、実行動作を行

う JavaScriptの関数を

設定している。

Page 16: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

dm025.js

var data_memory =

[0,124,130,130,130,130,124,0,0,0,66,254,2,0,0,0,0,70,138,138,146

,146,98,0,0,68,130,146,146,146,108,0,0,12,20,36,68,254,4,0,0,244,

162,162,162,162,156,0,0,124,146,146,146,146,76,0,0,128,128,134,

152,160,192,0];

var bit_mask = [128,64,32,16,8,4,2,1];

var copy_memory = [0,0,0,0,0,0,0,0];

var config_memory = [128+8,128+8];

var ctx;

var img;

var tmid;

var canvas;

var page = 0;

var shift = 0;

var mode = 0;

var column = 0;

var speed = 0;

var config_num = 0;

var config_col = 0;

var sdat;

var sclk;

var mouseX;

var mouseY;

window.onload = function() {

/* canvas要素のノードオブジェクト */

canvas = document.getElementById('dotcanvas');

/* canvas要素の存在チェックとCanvas未対応ブラウザの対処

*/

if ( ! canvas || ! canvas.getContext ) {

window.alert("この環境では使用できません。");

return false;

}

/* 2Dコンテキスト */

ctx = canvas.getContext('2d');

setDot2Num();

drawDot();

timerAll();

};

function clickhandler(event){

var isMSIE = /*@cc_on!@*/false;

if (isMSIE) {

var rect = canvas.getBoundingClientRect();

mouseX = event.clientX - rect.left;

mouseY = event.clientY - rect.top;

}

else {

mouseX = event.pageX - canvas.offsetLeft;

mouseY = event.pageY - canvas.offsetTop;

}

rsetDot();

}

function rsetDot(){

if (mode == 0)

{

for (x=0; x<8; x++)

{

for (y=0; y<8; y++)

{

if ( (mouseX>x*20) && (mouseX<x*20+20)

&& (mouseY>y*20) && (mouseY<y*20+20) )

{

data_memory[x+page*8] ^=

bit_mask[y];

drawDot();

setDot2Num();

}

}

}

}

}

function drawDot() {

document.form.page.selectedIndex = page;

ctx.fillStyle = 'rgb(0, 0, 0)';

ctx.fillRect(0, 0, 159, 159);

for (x=0; x<8; x++){

for (y=0; y<8; y++){

n = x+page*8+shift;

if (n > 63)

n = n - 63;

if ((data_memory[n] & bit_mask[y]) == 0)

ctx.fillStyle = 'rgb(128, 128, 128)';

else

ctx.fillStyle = 'rgb(255, 0, 0)';

ctx.beginPath();

ctx.arc(x*20+10, y*20+10, 8, 0, Math.PI*2, false);

ctx.fill();

}

}

}

data_memoryは表示

される初期のテスト用

データパターン。

1列 1byte、8列で1画

面。これを8画面分で

1パターンを構成して

いる。

以後、その他変数等の

初期化を行っている。

window.onloadは起動時

に実行される。各種初期

化を行っている。

clickhandlerはマウス

の左ボタンが押された

際に実行される。

マウスの位置を記録し

てドットの ON/OFF処

理を呼び出す。

rsetDotはマウスの位置

とモードに応じて、ドッ

トの ON/OFFを記録す

る。

drawDotは各ドットのO

N/OFFに応じて表示を

行う。

Page 17: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

function decPage(){

page--;

if (page<0)

page=0;

document.form.page.selectedIndex = page;

drawDot();

setDot2Num();

}

function incPage(){

page++;

if (page>7)

page=7;

document.form.page.selectedIndex = page;

drawDot();

setDot2Num();

}

function setPage(){

page = document.form.page.selectedIndex;

drawDot();

setDot2Num();

}

function editData(){

shift = 0;

mode = 0;

drawDot();

setDot2Num();

}

function setNum2Dot(){

if (mode == 0)

{

data_memory[0+page*8] = document.form.dot0.value;

data_memory[1+page*8] = document.form.dot1.value;

data_memory[2+page*8] = document.form.dot2.value;

data_memory[3+page*8] = document.form.dot3.value;

data_memory[4+page*8] = document.form.dot4.value;

data_memory[5+page*8] = document.form.dot5.value;

data_memory[6+page*8] = document.form.dot6.value;

data_memory[7+page*8] = document.form.dot7.value;

}

drawDot();

}

function setDot2Num(){

document.form.dot0.value = data_memory[0+page*8];

document.form.dot1.value = data_memory[1+page*8];

document.form.dot2.value = data_memory[2+page*8];

document.form.dot3.value = data_memory[3+page*8];

document.form.dot4.value = data_memory[4+page*8];

document.form.dot5.value = data_memory[5+page*8];

document.form.dot6.value = data_memory[6+page*8];

document.form.dot7.value = data_memory[7+page*8];

}

function scrollData(){

shift = 0;

mode = 1;

drawDot();

}

function animateData(){

shift = 0;

mode = 2;

drawDot();

}

function transmitData(){

if (mode == 4)

{

setSpeed();

setRomNumber();

config_num = 0;

config_col = 0;

mode = 3;

}

else

{

column = 0;

page = 0;

shift = 0;

sdat = 1;

sclk = 0;

mode = 4;

drawTransmit()

}

}

function setSpeed(){

speed = document.form.speed.selectedIndex;

}

function setRomNumber(){

config_memory[0] =

document.form.romnumber.selectedIndex;

}

decPage は現在表示し

ているページを-1する。

incPage は現在表示して

いるページを+1する。

setPage は現在表示して

いるページ設定する。

editDataは、現在のモー

ドを編集モードにする。

setNum2Dotは、各列毎

の数値データをドットデ

ータに変換する。

setDot2Numは、各列毎

のドットデータを数値デ

ータに変換する。

scrollData は現在のモ

ードをスクロール表示モ

ードにする。

animateDataは現在の

モードをアニメーション

表示モードにする。

transmitDataは現在の

モードを転送モードにす

る。

setSpeedは転送モード

時の転送速度を変更す

る。

setRomNumberは転送

モード時の転送ページを

変更する。

Page 18: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

function drawTransmit() {

document.form.page.selectedIndex = page;

if(sdat == 0)

ctx.fillStyle = 'rgb(0, 0, 0)';

else

ctx.fillStyle = 'rgb(255, 255, 255)';

ctx.fillRect(0, 0, 79, 158);

if(sclk == 0)

ctx.fillStyle = 'rgb(0, 0, 0)';

else

ctx.fillStyle = 'rgb(255, 255, 255)';

ctx.fillRect(80, 0, 158, 158);

}

function timerAll(){

clearTimeout(tmid);

if (mode == 3)

{

sclk ^= 1;

if (sclk == 1)

{

if (config_num < 2)

{

if ((config_memory[config_num]

& bit_mask[config_col]) == 0)

sdat = 0;

else

sdat = 1;

config_col ++;

if (config_col > 7)

{

config_col = 0;

config_num++;

}

}

else

{

if ((data_memory[page*8+shift]

& bit_mask[column]) == 0)

sdat = 0;

else

sdat = 1;

column++;

}

}

drawTransmit();

}

else if (mode == 5)

{

sclk ^= 1;

drawTransmit();

mode = 6;

}

else if (mode == 6)

{

editData();

}

else if (mode == 1)

{

drawDot();

shift++;

}

else if (mode == 2)

{

drawDot();

page++;

}

if (column > 7)

{

column = 0;

shift++;

}

if (shift > 7)

{

shift = 0;

page ++;

}

if (page > 7)

{

page = 0;

if (mode == 3)

mode = 5;

}

if (mode == 3 || mode ==4 || mode == 5 || mode == 6)

tmid = setTimeout('timerAll()',25+speed*25);

else if (mode == 1)

tmid = setTimeout('timerAll()',150);

else if (mode == 2)

tmid = setTimeout('timerAll()',500);

else

tmid = setTimeout('timerAll()',500);

}

drawTransmitは転送モ

ード時の転送窓の描画を

行う

timerAllは一定時間毎

に呼び出されて、モード

に応じて、画像のスクロ

ールや、アニメーション

表示、転送窓の描画な

ど、必要な処理を行う。

Page 19: 電光掲示プレート PIC16F886 用プログラム HI-TECH C …nokai.info/ipc/taiken2011/dm_code.pdf電光掲示プレートPIC16F886 用プログラム HI-TECH C Compiler for

function copyData(){

for (x=0; x<8; x++)

{

n = x+page*8+shift;

if (n > 63)

n = n - 63;

copy_memory[x] = data_memory[n];

}

drawDot();

setDot2Num();

}

function pasteData(){

if (mode == 0)

{

for (x=0; x<8; x++)

{

data_memory[x+page*8] = copy_memory[x];

}

drawDot();

setDot2Num();

}

}

function cutData(){

if (mode == 0)

{

for (x=0; x<8; x++)

{

copy_memory[x] = data_memory[x+page*8];

data_memory[x+page*8] = 0;

}

drawDot();

setDot2Num();

}

}

function changesytle(cssfile) {

document.getElementById('dmstyle').href = cssfile;

}

function loadData(){

var i;

var key;

for (i=0; i<64; i++)

{

key = "dm"+i;

data_memory[i] = localStorage.getItem(key);

}

drawDot();

setDot2Num();

}

function saveData(){

var i;

var key;

for (i=0; i<64; i++)

{

key = "dm"+i;

localStorage.setItem(key,data_memory[i]);

}

drawDot();

setDot2Num();

}

copyDataは現在表示し

ているページの内容の

一時記憶(コピー)を行

う。

pasteDataは一時記憶

(コピー)している内容

を現在のページに表示

(貼り付け)する。

cutDataは現在表示して

いるページの内容の一

時記憶(コピー)した後

に、現在のページの内容

を消去する。

changesytleは現在の画

面構成を変更する。

loadDataのローカルマ

シンに簡易保存されたデ

ータを呼び出す。

saveDataの現在のデー

タの内容をローカルマシ

ンに簡易保存する。