ページ 11

ディップスイッチの状態をLCDに表示したい

Posted: 2019年10月03日(木) 11:27
by ろくじょう
PICのマイコンを使ってディップスイッチの状態を見てLCDの表示を変更したいです。
現在のコードだとスタートスイッチを押した時にだけディップスイッチの状態を表示します。
現在:スタートボタン⇒ディップスイッチの状態をLCD表示⇒動作
したい事:ディップスイッチの状態をLCD表示⇒スタートボタン押され待ち⇒ボタンon⇒動作

現在のコードです。

コード:

    while(1){
        if(StartSW == 0){            // スタートスイッチ
            if(SwBefore == 0){      // 前回のスイッチ状態
                __delay_ms(20);
            }
            SwBefore = 1;
        }else{
            if(SwBefore){
                __delay_ms(20);
                lcd_cls();
                switch(PORTD){
                    case DIPSW1:            //DIPスイッチ
                        lcd_cls();          // LCD画面のクリア
                        lcd_locate(0,0);    // LCDに文字入力
                        lcd_puts("MODE1");
                        AL = ON;
                        __delay_ms(10);
                        AL = OFF;
                        break;
                    case DIPSW2:
                        lcd_cls();
                        lcd_locate(0,0);
                        lcd_puts("MODE2");
                        AL = ON;
                        __delay_ms(20);
                        AL = OFF;
                        break;
                    default:
                        break;
                }
            }
            SwBefore = 0;
        }
    }
}
表示だけ別にしたらLCDをクリアをしているのでチカチカします。

コード:

while(1){
                switch(PORTD){
                    case DIPSW1:            //DIPスイッチ
                        lcd_cls();          // LCD画面のクリア
                        lcd_locate(0,0);    // LCDに文字入力
                        lcd_puts("MODE1");
                        break;
                    case DIPSW2:
                        lcd_cls();
                        lcd_locate(0,0);
                        lcd_puts("MODE2");
                        break;
                    default:
                        break;
                }
}
ディップスイッチの状態をLCD表示⇒スタートボタン押され待ち⇒ボタンon⇒動作
を実現するにはどうすればいいですか?初心者なので説明をかみ砕いていただいたりヒントになるコードを書いてもらえると助かります。
情報が足りなければ追記します。よろしくお願いします。

Re: ディップスイッチの状態をLCDに表示したい

Posted: 2019年10月03日(木) 22:56
by みけCAT
質問をよく理解できていない気がしますが、
ディップスイッチの状態が変わったときのみLCDを更新する、というのはどうでしょうか?

コード:

int prev = 0x100; //ありえない値で初期化
while(1){
        int status = PORTD;
        if (status != prev){
                switch(status){
                    case DIPSW1:            //DIPスイッチ
                        lcd_cls();          // LCD画面のクリア
                        lcd_locate(0,0);    // LCDに文字入力
                        lcd_puts("MODE1");
                        break;
                    case DIPSW2:
                        lcd_cls();
                        lcd_locate(0,0);
                        lcd_puts("MODE2");
                        break;
                    default:
                        break;
                }
                prev = status;
        }
}

Re: ディップスイッチの状態をLCDに表示したい

Posted: 2019年10月04日(金) 10:57
by ろくじょう
説明が下手で申し訳ありませんでした。みけCATさんのおっしゃる通りの事がしたかったのです。
質問したあとに前回と今回の値の違いを見るという考え迄はなんとか行き着けたのですが、どうしても起動時の状態を読むにはどうしたらいいかでわからなくて余計な関数を作っていました。

コード:

int prev = 0x100; //ありえない値で初期化
「ありえない値で初期化」は目からウロコです。
勉強になりました。ありがとうございました。またよろしくお願いします。