テンプ・プレート...もっとも過酷な場所に貼られる世界で。宇宙で。テンプ・プレートとは Wahl社は1960年に世界で初めて温度測定用ラベル(テンプ・プレート)
電光掲示プレート PIC16F886 用プログラム HI-TECH C...
Transcript of 電光掲示プレート PIC16F886 用プログラム HI-TECH C...
電光掲示プレート 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等でドット絵を描
き変換してテキストデ
ータを貼り付けて作成
すると良い。
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からデータを取り
出している。
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変換、タイマ割込、そ
の他変数の初期化等を
行っている。
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が押されたか
どうか判断し、押された
場合は、押している時間
を計測するための準備
をしている。
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秒以上押
して離した場合の処理
として、デバッグ(光セ
ンサの状態等を表示)モ
ードへの移行準備と移
行処理を行っている
転送モード時の処理(光
センサの情報を解読し
て、表示パターンに変換
し記録する)を行ってい
る
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;
}
}
各種モードに応じて、表
示内容を切り替えて、表
示処理を行っている。
電光掲示プレートデータ作成ツール (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")
};
グローバル変数や定数の
設定
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は、一定時間毎に
呼び出される関数。
転送モードの処理に必
要な時間の記録処理等
を行う。
転送モードの場合、転送
に必要な各種処理を実行
する。
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はアプリケー
ション実行中に繰り返し
実行される。
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;
引き続き各種フォームや
ボタンの表示を行ってい
る。
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処理
を行う。
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:は、ウイン
ドウの変形など、再描画
が必要な時に起きるの
で、現在の状態を元に、
画面の再描画処理を行
う。
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アプリケーシ
ョンに必要な各種初期
処理や設定等を行う。
電光掲示プレートデータ作成ツール (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の関数を設定して
いる。
<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の関数を
設定している。
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に応じて表示を
行う。
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は転送
モード時の転送ページを
変更する。
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は一定時間毎
に呼び出されて、モード
に応じて、画像のスクロ
ールや、アニメーション
表示、転送窓の描画な
ど、必要な処理を行う。
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の現在のデー
タの内容をローカルマシ
ンに簡易保存する。