« ラジオペンチさん「おもちゃ病院用のDC安定化電源の製作」を拝見して | トップページ | 「アセンブラがディスクを破壊する!?」トラ技2002年6月号 »

2021年9月 3日 (金)

液晶表示をWindows-PCで真似る

とあるメカ系制御装置、そのパラメータ設定と
動作チェック用に液晶表示を付けた外部リモコンを
使っています。 (AVRマイコンで制御)
表示は16文字×2行とシンプル。

F11_20210903153601
  これはデバッグ機の表示で、実機は
  ちゃんとバックライト付の液晶で
  暗い現場でもOKなように。

操作スイッチは、「↑」「↓」のカーソルキーと
「ENT」「ESC」の合計4つ。

試運転のための動作モニターやパラメータの設定に
このリモコンが必要ですが、それらが終わったら、
このリモコンは不要。
コネクタから抜いてしまいます。

簡単なリモコンですが、どこにも売っていないもの
ですんで、製造を依頼するとなるとそれなりに
お金がかかります。 (ケース加工がぁぁ)

客先から、
 『WindowsのPCでこのリモコンの真似ができれば』
ということでウインドウズのプログラムを作ってみました。

手慣れたツールが古~いC++builder(v5.03)」なので、
この環境から抜け出せません。

  本体との通信はTTLレベルのシリアル。
  USBシリアル変換アダプタを用います。
  そして、いろんなPCでの動作をチェックしているとき
  このトラブル に遭遇したのです。

・16文字×2行の表示
・マウスでのクリック操作だけでなく、キーボードの
 ↑→・↓←・ENT・ESCキーでも操作できるよう。
・マウスのホイールでも↑↓。

どうしたものかと悩んだのが表示。

装置からは表示文字列だけでなく、
 ・カーソル位置
 ・カーソルのon/off
 ・画面消去
 ・部分消去
 ・beep報知 ピ、ピピッ、ピピッ・ピピッ
  などと調子を変えての報知。
などのコードが送られてきます。

カーソルの点滅は不要ですが、カーソル・オンで
カーソル位置の文字を白黒反転しなくちゃなりません。

Windowsの文字表示、
 ・1行表示のEditを2段に貼り付けるか。
 ・2行にしたMemoにするか。
 ・RichEditのほうがあれこれ使いやすいか
わずか32文字の表示ですが、ちょい悩みます。

EditやMemoやRichEditを使うと、文字列はAnsiString
あれこれ便利ですが、ちょい面倒。

結局・・・手を抜ける解決策に。
32文字の表示を32個の「Label」にしちゃいました。

Labelを32コ置いた配列の「Caption」に文字を1つだけ。
カーソルを表現するときは、
Font->Color」をにしてLabelの背景色「Color」をに。

液晶コントローラを制御しているリモコンのプログラム
をそのまま移行するような感じでWindowsの文字制御が
できました。

メインフォームがこんなの。

Pp2

実行したときの様子。

Pp1_20210903153801

・処理の一部

//  文字バッファをラベルで
TLabel *dd[32]; // 文字はcaptionに書き込む

//***** メイン画面 開始 *****
void __fastcall TForm1::FormCreate(TObject *Sender){
 paraload(); // 設定ファイルの読み出し

dd[0] = Label1; // 表示文字バッファ ラベルで
dd[1] = Label2; // [0]~[31]にLabel1~Label32
dd[2] = Label3;

dd[31] = Label32;

}
/***** 1文字書き込み *****/
// cur_posに書き込んでカーソルを進める
void dispchar(char c){
dd[cur_pos]->Caption = c; // 1文字書き込み
cur_pos++;
if(cur_pos >= DISP_SIZ) cur_pos = 0;
}
/***** カーソルon *****/
void dispcuron(void){
dd[cur_pos]->Font->Color = clWindow; // 文字白
dd[cur_pos]->Color = clWindowText;
}
/***** カーソルoff *****/
void dispcuroff(void){
dd[cur_pos]->Font->Color = clWindowText; // 文字黒
dd[cur_pos]->Color = clWindow;
}

TLabelの配列 dd[] にアクセスするだけで、文字描画が完了。
なにやら、表示はシンプルにできちゃいました。

※キーボードのカーソルキーなどの横取りにちょいと
 コツがありました。
キーを横取りしても、何かの拍子、カーソルキーを
押したとき(TABでの入力場所移動のように)フォーカスする
ボタンの位置を変えるような操作になってしまうのです。
それを嫌って、メインフォーム左下側に細い幅で「Edit」
を配置。 (左下端に細い白い棒が見えてるでしょ)
そこで、キーの横取りやボタン操作の後は、このEdit1に
「Edit1->SetFocus();」を実行しています。
すると、カーソルキーが思うように動きました。

/*****  ↓押した    *****/
void __fastcall TForm1::Button3MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y){
CommX1->TransChar('-'); // - 送信
f_kdown = 1; // ↓(-)送出処理フラグon
tm_kdown = 16; // 500ms後に2発目送出
}
/***** ↓離した *****/
void __fastcall TForm1::Button3MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y){
f_kdown = 0; // ↓(-)送出処理フラグoff
Edit1->SetFocus();
}
/***** キー入力 *****/
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift){
switch(Key){
case VK_UP: // ↑
case VK_RIGHT: // →
CommX1->TransChar('+'); // + 送信
break;
case VK_DOWN: // ↓
case VK_LEFT: // ←
CommX1->TransChar('-'); // - 送信
break;
case VK_RETURN:
CommX1->TransChar('\x0d'); // CR 送信
break;
default:
CommX1->TransChar('\x1b'); // ESC 送信
}
Edit1->SetFocus();
}

リモコンのスイッチ操作、
カーソル↑が「+」、↓が「-」文字で。
ENTとESCはそのもののコードを送出。

|

« ラジオペンチさん「おもちゃ病院用のDC安定化電源の製作」を拝見して | トップページ | 「アセンブラがディスクを破壊する!?」トラ技2002年6月号 »

電子回路工作」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« ラジオペンチさん「おもちゃ病院用のDC安定化電源の製作」を拝見して | トップページ | 「アセンブラがディスクを破壊する!?」トラ技2002年6月号 »