なんだ、あっさり動いてしまった。折角だから色々調査。
基板を観察すると、I2CコントローラとしてPIC16F689のSSOPタイプ(
pdf)が搭載されている。また端子にはTX、MCLR、DAT、CLK、RXといった端子が存在していた。普通にICSPが出来る端子になっている。ということで、PICkit2を使い内容を吸い出そうと試みるも、当然の様にコードプロテクトが掛かっている。うーむ。買ったばかりだし、チップを交換するか。
まずは外しても分かるようにデバイスに印を付けておいて、マスキング処理をし、はんだ吸い取り線を巻き、ハンダを大量に流して外す。
ポロッと取れる。このPICは取っておこう。
どちらも20ピンなので、
そのまま載せ替えが可能。
正常に繋がったか確認。
認識しているのでOK。早速解析していこう。
このデバイスはPORTCのみ8ビット丸々使える。そしてこのLCDは8ビット専用との事なので、LCDのデーター線はPORTCと予想。TXとRX、MCLR、DAT、CLKは独立している。残る部分はRS、EN、WR信号。RA2、RA4、RA5と予想してみた。
2時間ほどでプログラムを書き上げる。
お決まりのデジタルポート設定処理忘れとか、方向レジスター処理、4ビットモード時と8ビットモードの初期化違いでちょっと手間取ったが、ポートは予想通りの配列だった。
回路図はこんな感じ。
ACM1602N1搭載のPIC16F689ピン配列
1:VDD
2:RA5:O:LCD_RW
3:RA4:O:LCD_E
4:RA3:I:(MCLR)
モードスイッチに使用。基板内部で10KΩプルアップされている
5:RC5:O:LCD_D5
6:RC4:O:LCD_D4
7:RC3:O:LCD_D3
8:RC6:O:LCD_D6
9:RC7:O:LCD_D7
10:RB7:O:(TX)
20:VSS
19:RA0:O:(ICSPD)
18:RA1:O:(ICSPC)
17:RA2:O:LCD_RS
16:RC0:O:LCD_D0
15:RC1:O:LCD_D1
14:RC2:O:LCD_D2
13:RB4:O:(SDA)
右スイッチに使用
12:RB5:O:(RX)
11:RB6:O:(SCL) 左スイッチに使用
ここまで分かればOK。元々載っていたPICのプログラムも、この解析で新たに組み直せば良さそうな気がしてきた。時間が取れたらオリジナルのI2Cファームでも書いておくかな。そうしておけば、気楽に上書き出来るだろう。→
出来ました!
あと、裏側に8ピンのICがあるが、恐らく負電圧をLCDに与える電源と思われる。(
PDF)
さて、今度は実用的にまとめてみよう。
完成! スイッチはLCDのグラウンドスルホールを利用して両面テープで固定。たった3本の電線で便利に使える。
I2Cになっても、LCDのセットアップや、書き込み手順は従来キャラクターLCDと同じ手順で表示させるのには変わりない。シリアル通信であれば、アスキーコードで送れば表示される。CG RAMを使わなければ、シリアル通信接続の方が色々有利である。
電源投入時はカーソル点滅。文字が0x20~0xffのコードであれば表示。
その他に、
ascii code 12 (ctrl +l) LCD消去
ascii code 0x0b (ctrl +k)カーソル以降の行を消して切替
ascii code 0x0d (Enter) 行の切替のみ
ascii code 0x11 (ctrl +q)カーソルを消す
ascii code 0x17 (ctrl +w) カーソル表示
と対応させているので、簡易表示機として利用が出来る。
※古い写真を使用しています。
裏面。コントラスト調整は面実装の20KΩ抵抗を使用してコンパクトに。
TXが空いているのだが、USARTモードにするとRXとTXはペアで使用されるので、デジタルポートとして使用できない。仕方ないので、内部でプルアップしていたMCLRをスイッチ入力に。PICkit2等でプログラム中はボタンを操作しないようにご注意を。
モードスイッチを押しながら左ボタンでバージョンなど表示。
ボーレート変更もワンタッチ。これが一台あると色々と便利。ボーレートは変更可能。
こんなにコンパクトに作らなくとも、コントラスト用の半固定抵抗器と設定用スイッチ3つを取り付ければ手軽にシリアル通信をモニター出来る。
最近のコメント