以下、PIC21の続きです。
最終的な書き換え後の関数を下記します。
**********************************************************************************
void lcd_data_byteset(unsigned char c){
PORTA =((c & 0b00000111)|((c<<3) & 0b01000000));//for RA6,RA2,RA1,RA0 low DATA
LCD_STROBE;
}
void lcd_data_set(unsigned char c){
PORTA = (((c >>4 ) & 0b00000111)|(((c >>1 ) & 0b01000000)));//for RA6,RA2,RA1,RA0 Hi DATA
LCD_STROBE;
PORTA = ((c & 0b00000111)|((c<<3) & 0b01000000));//for RA6,RA2,RA1,RA0 low DATA
LCD_STROBE;
}
**********************************************************************************
これで、ポートAのLCD対応の関数部の変更が完了です。
あとはmain.cのTRISAの設定をポート変更にあわせた書き換え対応が必要です。
LCDプログラムに対し、時計の回路のRA3は入力なので入力に、RA6は出力になります。
TRISA = 0b01110000; //ポートAの方向を設定 (RA4,RA5.RA6 INPUT)(RA0,RA1,RA2,RA3,RA7 OUTPUT)
↓
TRISA = 0b00111000; //ポートAの方向を設定 (RA3,RA4,RA5 INPUT)(RA0,RA1,RA2,RA6,RA7 OUTPUT)
上記の変更を行って、全て完了です。実際に液晶のポートD7のPICポートRA3の接続をPICポートRA6に接続変更し対応ポート(RA6,RA2,RA1,RA0)ということでLCDプログラムを走らせて見ます。前のポート対応(RA3,RA2,RA1,RA0)の時となんら違いなく動作しました。
案外、このポート変更対応はLCD表示を扱うには欠かせない手法の一つと思います。
今回はプログラムの動作を解析確認し、プログラム作成でビットのシフトを駆使したため、とても為になったと思います。細かなハードのタイミング設定は、メーカーの資料が欠かせませんが、特に今回の様なポート仕様変更などは、ある程度頻繁にあることなので、比較的容易に対応できるようになればこれにこした事は無いと思います。なので今回のポート変更は、XC8でLCDを使うユーザーには役に立つかも。
時間がとれれば、LCDポート設定コンフィグとしてのファンクション化をしてみるのも面白いかもしれない。
誰かやってくれればありがたいです。Hi!(microCではLCDのPICポート設定専用関数が用意されているようです。Lcd_Custom_Config(&PORTB, 4, 6, 7, 1, &PORTA, 1, 0, 7);)きゃりーぱみゅぱみゅじゃないが、それいいな!です。
ここまでで、LCDの動作プログラム上で時計用の3つのSWがひとまず確保できたので、LCDに時間表示をする変更を考えてみようかなぁ~。セグメント出力は全部はずして...時間取り込みは変数に変えて....それから.....現在思案中です。