LEDの点灯

 スイッチを押すとLEDの動作が以下のようになるようにしました。

番号 入力(PIC端子名) 出力の状態 コメント
SW0(RA0) LED0からLED7に順送りに点灯がシフトする。
RB0からRB7へ
SW1(RA1) LED7からLED0に順送りに点灯がシフトする。
RB7からRB0へ
SW2(RA2) LED0からLED7に順送りに点灯がシフトする。
番号1より速く動く。
RB0からRB7へ
SW3(RA3) LED7からLED0に順送りに点灯がシフトする。
番号2より速く動く。
RB7からRB0へ
SW4(RA4) LED0,2,4,6とLED1,3,5,7が交互に点灯する。



出力ポートから「0」、「1」を出力することで、LEDを「点灯」、「消灯」させます。
*「0」をLowレベル、「1」をHighレベルとしています。



電源電圧Vccと出力ポートの電位差でLEDの点灯、消灯を制御します。
     



プログラム(LEDの点灯)
//----------------------------------------------------------------------------
//  【LEDのシフト点灯】 
//----------------------------------------------------------------------------

#include <16f84a.h>             // 使用デバイスの定義情報インクルード
#fuses HS, NOWDT, NOPROTECT     // コンフィグレーション設定
#use delay (clock=20000000)     // 発振子の周波数20MHz

//----------------------------------------------------------------------------
//  I/Oポートの定義
//----------------------------------------------------------------------------
#byte  RA = 5                   // ポートAのアドレス5番地をRA文字変数
#byte  RB = 6                   // ポートBのアドレス6番地をRB文字変数
#define  PATTERN  0b00000001    // 初期パタン設定   

//----------------------------------------------------------------------------
//  メイン関数
//----------------------------------------------------------------------------
main()  {
        byte  pushsw;                           
        byte  data0;

        set_tris_a(0xff);       // ポートAはすべて入力に設定(1:Input)
        set_tris_b(0x00);       // ポートBはすべて出力に設定(0:Output)
        
        data0 = PATTERN;
        RB = 0xff;                              // 初期状態の点灯

        while(1){                       // 無限ループで繰り返す
                if (input(PIN_A0)==0)   // SW0を押されたとき
                        pushsw = 1;
                if (input(PIN_A1)==0)   // SW1を押されたとき
                        pushsw = 2;
                if (input(PIN_A2)==0)   // SW2を押されたとき
                        pushsw = 4;
                if (input(PIN_A3)==0)   // SW3を押されたとき
                        pushsw = 8;
                if (input(PIN_A4)==0)   // SW4を押されたとき
                        pushsw = 16;

                switch(pushsw) 
                {
                        case 1 :rotate_left(&data0,1);
                                RB = ~data0;            // SW Bit0 ON:左シフト
                                delay_ms(200);
                break;
                        case 2 :rotate_right(&data0,1);
                                RB = ~data0;            // SW Bit1 ON:右シフト 
                                delay_ms(200);
                break;  
                        case 4 :rotate_left(&data0,1);
                                RB = ~data0;            // SW Bit2 ON:左シフト
                                delay_ms(50);
                break;
                        case 8 :rotate_right(&data0,1);
                                RB = ~data0;            // SW Bit3 ON:右シフト
                                delay_ms(50);
                break;                  
                        case 16:RB = 0xaa;              // SW Bit4 ON:1010 1010
                                delay_ms(250);
                                RB = 0x55;              // SW Bit4 ON:0101 0101
                                delay_ms(250);  
                break;
                }
        }
}



back next