PICの割り込み機能とは?プログラミングでの実装方法を教えてください。

このQ&Aのポイント
  • PIC16F84Aを使用して、C言語でプログラムを作成し、LEDの点灯・消灯を制御しています。
  • 割り込みを実装することで、RA1の入力によってLEDの点灯を5秒後に自動的に消灯させることができます。
  • 現在のプログラムは割り込みがうまく機能せず、5秒後に点灯してしまう問題があります。解決方法を教えてください。
回答を見る
  • ベストアンサー

PICの割り込み機能

現在電子工作をしており、それにPIC16F84Aを使っています。 正直アセンブリはよくわからないので、C言語でプログラムを作っています。 コンパイラはPICCLITEで、LEDの点灯・消灯に関するプログラムです。 機能としては ・RA0に入力があったときRB0につないであるLEDが消灯しているならLEDを点灯。 ・RA0に入力があったときRB0につないであるLEDが点灯しているならLEDを消灯。 ・RA1に入力があったときLEDが点灯しているなら5秒後にLEDを消灯。 というものを目指しています。 1つ目、2つ目の項目はif文で簡単に実現できましたが、割り込みがうまくいかず、 消えている状態でRA1に入力を入れたときなぜか5秒後に点灯してしまいます。 だからRB0の出力を逆にしてみたんですがうまくいかず・・・。 ハード的には、RB0には反対側から5Vをかけ、 RB0=0の時は点灯 RB0=1の時は消灯 としています。 またセラロックは10MHzのものを使用しています。 現在のプログラムとしては #include "pic.h" #define XTAL_FREQ 10MHZ #define MHZ*1000 void DelayUs(unsigned char cnt){ //時間待ち関数  unsigned char i;  i=(cnt)/(12MHZ/(XTAL_FREQ))|1;  while(--i!=0) continue; } void DelayMs(unsigned int cnt){ //時間待ち関数  unsigned char i;  do{   i=4;   do{    DelayUs(250);   }while(--i);  }while(--cnt); } int cnt,SW; //SWが0なら消灯 //SWが1なら点灯 void interrupt isr(void){ //割り込み関数  if(T0IF==1){   T0IF=0;   cnt--;  }  if(cnt==0){   RB0=1; //消灯   SW=0;   cnt=190;   T0IE=0;   GIE=0;  } } main() {  TRISA=0xFF; //入出力設定  TRISB=0x00;  PORTA=0x00;  PORTB=0x00;  SW=0;  OPTION=0x87; //プリスケーラの設定  TMR0=0x00;  T0IF=0;  T0IE=1;  cnt=190;  while(1){   if(RA0==1){    DelayMs(60); //チャタリング防止    if(RA0==1){     if(SW==0){      RB0=0;      SW=1;     }    else{     RB0=1;     SW=0;    }   }  }  if(RA1==1){   DelayMs(60); //チャタリング防止    if(RA1==1 && SW==1){     TMR0=0;     T0IF=0;     T0IE=1; //割り込み許可     GIE=1; //全体割り込み許可    }   }  } } インターネット上での割り込みのプログラムをいくつか見てみたのですが、 どれもすべて動作を終えて、あとはwhile(1)で割り込みを待つだけ というプログラムばかりでした。 僕のは基本的にRA0の入力によってLEDを点灯・消灯させつつ RA1の入力で割り込みを開始。 5秒後に消えたら割り込みを禁止する。 という仕様にしたいのですが・・・・・・。 1ヶ月ぐらいやってますがうまくいきません。 良ければご回答をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

>消えている状態でRA1に入力を入れたときなぜか5秒後に点灯してしまいます。 点灯するでしょうね。そういうプログラムになってますから。 >・RA1に入力があったときLEDが点灯しているなら5秒後にLEDを消灯。 >・RA0に入力があったときRB0につないであるLEDが消灯しているならLEDを点灯。 RA1に入力があり、5秒後にLEDを消灯した次の瞬間に、RA0に入力があったら「LEDが消灯しているのでLEDを点灯」する事になります。 こういう場合には、普通 ・入力ポートに変化があったら割り込みがかかる ・タイマーにより割り込みがかかる と言うハード構成にします。 セオリーは「メインでポートを監視する為の無限ループを組まない事」です。 つまり >どれもすべて動作を終えて、あとはwhile(1)で割り込みを待つだけ というプログラムにするのが常道なのです。 なので、ネットでさがすと、そういうプログラムばかり見付かる筈です。 以下のような作り方をしましょう。 グローバル変数は「直前のRA0の状態」と「秒カウンタ」と「LEDの状態」を用意します。 int 直前のRA0の状態; int 秒カウンタ; int LEDの状態; main() {  ハードの初期化;  直前のRA0の状態=0;  秒カウンタ=0;  LEDの状態=0;  割り込み許可;  while(1) {;} } void interrupt isr(void) {  if (直前のRA0の状態 != 今のRA0) {   直前のRA0の状態 = 今のRA0;   if (RA0==1) {    LED点灯;    LEDの状態=1;    秒カウンタ=0;//RA1の入力後の5秒間にRA0が変化したらチャラにする   } else {    LED消灯;    LEDの状態=0;    秒カウンタ=0;//RA1の入力後の5秒間にRA0が変化したらチャラにする  }  if (秒カウンタ==0) {//通常時   if ((LEDの状態==0) && (RA1==1)) {//消灯時はRA1は無視    秒カウンタ++;//5秒待ち状態に入る   }    } else {//5秒待ち状態に入っている時   秒カウンタ++;   if (秒カウンタ>=500) {//1ミリ秒×500=5秒    LED消灯;    LEDの状態=0;//LEDを消す    秒カウンタ=0;//5秒待ち状態から通常状態に戻る   }  }  割り込みを再許可する } 割り込み間隔を1ミリ秒にしているのは、チャタリング防止の意味も兼ねていて、エッジノイズやパルスなど、1ミリ秒より短い変化は拾いません。

shin55555
質問者

補足

お早いご回答ありがとうございます。 >セオリーは「メインでポートを監視する為の無限ループを組まない事」です。 >つまり >>どれもすべて動作を終えて、あとはwhile(1)で割り込みを待つだけ >というプログラムにするのが常道なのです。 そーだったんですか・・・・。 とりあえず、このプログラムの通りやってみました、が、 なかなかうまくいきません(汗 最初にRA0につながれているスイッチを押したらそのままLEDがつきっぱなしになっちゃって・・・。 スイッチを押している間消えています。 あと割り込みもうまくいかなかったです・・・。 なかなか消えてくれません。 とりあえずプログラムは #include "pic.h" int a; //直前のRA0の状態 int cnt; //秒カウンタ int LED; //LEDの状態 main() { /*初期化始まり  TRISA=0xFF;  TRISB=0x00;  PORTA=0x00;  PORTB=0x00;  a=0;  cnt=0;  LED=0; */初期化終わり  OPTION=0x87; //割り込みの設定  TMR0=0x00;  T0IF=0;  T0IE=1; //割り込み許可  GIE=1; //全体割り込み許可  while(1) {;} } void interrupt isr(void) {  if (a != RA0) {   a = RA0;   if (RA0==1) {    RB0=0;    LED=1;    cnt=0; //RA1の入力後の5秒間にRA0が変化したらチャラにする   } else {    RB0=1;    LED=0;    cnt=0; //RA1の入力後の5秒間にRA0が変化したらチャラにする   }  } //※1  if (cnt==0) { //通常時   if ((LED==1) && (RA1==1)) { //消灯時はRA1は無視    cnt++; //5秒待ち状態に入る   }  } else { //5秒待ち状態に入っている時   cnt++;   if (cnt>=500) { //1ミリ秒×500=5秒    RB0=1;    LED=0; //LEDを消す    cnt=0; //5秒待ち状態から通常状態に戻る   }  }  T0IE=1; //割り込みを再許可する  GIE=1; } ※1…カッコが1つ足りなかったのでおそらくここだと思います。 という感じになっています。

その他の回答 (1)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

訂正   if ((LEDの状態==0) && (RA1==1)) {//消灯時はRA1は無視 は   if ((LEDの状態==1) && (RA1==1)) {//消灯時はRA1は無視 の間違い

関連するQ&A

  • PIC タイマー0の使い方

    PIC16F886を触り始めたのですが、タイマー割り込みで苦戦しています。 タイマー割り込みを使ったLEDの点滅の間隔が、自分の思った時間にならないのです。 下に今のプログラムを載せておきます。 私の今の考え方はこうです。 ・内部クロックは4MHzに設定してある ・TMR0のカウントはクロックの1/4らしい→1MHzなので周期は1μsec ・プリスケーラは1:128に設定→128μsecでTMR0がカウントアップ ・TMR0の初期値を61に設定→195回のカウントアップでT0IF=1 ・128μsec*195μsec=2496μsec≒0.025msec←タイマー割り込み ・40回カウントすると1秒 と、1秒ごとにLEDのON,OFFが切り替わるはずだと考えているのですが、書き込んで計測したところ、約0.8秒でon,offを繰り返しています。 私の考え方やプログラムに間違いがあるのでしょうか? もしくはPICがハード的に壊れているのでしょうか?(picに5Vをかけても動かず、mainが実行中に点灯するLED(この時点では点いていない)の端子の両端を指で触ると何故か動き出します。) 以下プログラムです。(注釈などは省いたので見難いかもしれません) #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <pic.h> #pragma config FOSC = INTRC_NOCLKOUT #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config LVP = ON void interrupt tc_int(void); volatile unsigned int cnt = 0; volatile unsigned int cnt1 = 0; #define sw RB0 #define led RA0 #define led2 RA1 #define led3 RA2 #define _XTAL_FREQ 4000000 void init(void) //初期設定 { OSCCON=0b01101000; // 内部クロック設定 4MHz TRISA=0b00000000; TRISB=0b00000000; TRISC=0b00000000; ANSEL=0x00; /* 割り込み初期設定 */ GIE = 1; // すべての割り込みを許可 T0IE = 0; // タイマー割り込みを禁止 T0CS = 0; // TIMAR0モジュールをタイマーとして使用 PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG |= 0x06; // CPUクロックを128分周 TMR0 = 61; // カウンタ値をリセット T0IE = 1; // タイマー割り込みを許可 T0IF = 0; // 割り込みフラグをクリア } int main(void) { init(); sw=1; led=1; led3=0; cnt1=0; LEDflg=0; while(1) { if(cnt1>=10){ led3=~led3; cnt1=0; } } } void interrupt tc_int(void){ // 割り込みハンドラ if(T0IF == 1){ cnt++; TMR0=61; T0IF = 0; // 割り込みフラグをクリア if(cnt>=40){ cnt=0; cnt1++; led2= ~led2; } } }

  • C言語プログラミングについて…Arduinoを用い

    C言語プログラミングについて…Arduinoを用いて、以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを作りました。次にその使用した「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、いろいろと変えてみたのですが、シリアルモニタを見るとif文を用いた時に「RedSwitch」が押された「回数」ではなく連続的に?押した「秒数」をカウントして困ってます。どうやったら改善できるのでしょうかか?ご教授お願いしたします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void) { digitalWrite(13,LED_ON); delay(500); digitalWrite(13,LED_OFF); delay(500); } void loop() { unsigned char SW_CNT=0,SW_TIME=0,i; while( (SW_TIME<100) || (SW_CNT==0) ) { sw_check(); if ( SW_RedSwitch==2 ) { SW_RedSwitch=0; SW_CNT++; SW_TIME=0; } SW_TIME++; delay(20); } for (i=1 ; i<=SW_CNT ; i++) { blink(); } }

  • picのループ

    昨日、picの割り込みに関してご質問させていただいたものです。 割り込みに関しては皆様のおかげで解決できましたが、別の問題に直面いたしました。 while(1)を1回処理した後は、動作が停止してしまい、割り込みも受け付けなくなってしまいます。 #INT_RB//割り込み定義 void RB_isr(){         割り込み処理        } void main() { while(1) { output_low(PIN_C4); delay_ms(200); output_high(PIN_C4); delay_ms(200); //自動起動ボタンONで起動 if(input(PIN_B6) == 0) { 入力があった場合の処理          } } } 上記のように、while(1)の先頭部に動作確認用のled点滅プログラムをいれていますが、入力があった場合の処理が終了した後はledも点滅しません。 入力があった場合の処理の最後にリレーをoffしているのですが、その処理はきちんと行われています。 どうしてこのようなことがおこるのか分かる方がいらっしゃいましたら、ご教授ねがいます。

  • PICのプログラムについて質問です

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • H8-3048 LED点灯プログラムについて

    初歩的な質問で申し訳ございません。 H8-3048でスイッチ入力によってLEDを点灯させたいのですが、 スイッチの押されたタイミングによって LEDの点灯状況が変化してしまいます。 何故でしょうか?回路側の問題?ご助言お待ちしています。 参考までに下にLED点灯ソースコードを示します。 #include <3048f.h> #define led P1.DR.BYTE /*P1.DR.BYTEをledに割り当て*/ #define sw1 PA.DR.BIT.B2 #define sw2 PA.DR.BIT.B3 void initport(void) /*入出力端子設定*/ { P1.DDR = 0xff; PA.DDR = 0x00; } int main( void ){ initport(); led = 0x00; /*初期値設定*/ while(1){ if( sw1 == 1 ){ /*sw1が押された時LED点灯*/ led = 0xff;} else if( sw2 == 1 ){ /*sw2が押された時LED消灯*/ led = 0x00;} else{ led;} /*それ以外はLEDの状態保持*/ } }

  • PICマイコンのI/Oについて教えてください。

    PIC16F1936を使っています。 各ポートをデジタル出力にしLEDを順に点灯させていますが RB0に接続したLEDのみうっすらとしか光りません。 (プログラムで意図したとおり点滅はします。) テスターで電流を計測したところRB0のみほとんど流れていませんでした。 また電源投入時にRB0に接続したLEDだけ一瞬光ります。 PICは初期状態でI/Oは入力になっているので光らないと思うんですが・・・ MPLABX+XC8で開発しています。 以下の切り分けを行いました。 ・LED単体での点灯:正常点灯 ・他のLEDをRB0に接続:現象再現 ・他のブレットボードで作動:現象再現 データシートとかなり睨めっこしたんですがそれっぽい部分がみつかりません ご教示いただけると助かります。 ソースは以下のとおりです。 #include <xc.h> #pragma config CLKOUTEN = OFF,\ WDTE = OFF,\ PWRTE = ON,\ CP = OFF,\ BOREN = OFF,\ FCMEN = OFF,\ MCLRE = ON,\ CPD = OFF,\ IESO = OFF,\ FOSC = INTOSC,\ STVREN = OFF,\ BORV = LO,\ LVP = OFF,\ VCAPEN = OFF,\ WRT = OFF,\ PLLEN = ON #define uchar unsigned char #define uint unsigned int void init(void){ //ポート初期化 PORTA = 0b00000000; PORTB = 0b00000000; PORTC = 0b00000000; PORTE = 0b00000000; TRISA = 0b00000000; TRISB = 0b00000000; TRISC = 0b00000000; TRISE = 0b00000000; //全てデジタル ANSELA = 0b00000000; ANSELB = 0b00000000; //8mhz OSCCON = 0b11110000; OPTION_REG = 0b00000000; APFCON = 0; WPUE = 0; } void Wait(unsigned int num){ for (int i=0 ; i<num ; ++i) { for( int j = 0; j < 100; ++j){ NOP(); } } } void main(void){ init(); while(1){ PORTC = 0b00000100; Wait(1000); PORTC = 0b00000000; PORTB = 0b00001000; Wait(1000); PORTB = 0b00100000; Wait(1000); PORTB = 0b00000001; Wait(1000); PORTB = 0b00000000; } }

  • PIC16F タイマ0使い方

    久しぶりにPICを引っ張り出して触っていたのですが、タイマ割込みの部分がうまくできていないようで、LED(led_green)を1秒で点滅させたいのですが2秒ぐらいの中途半端な点滅をしてしまいます。 内部クロックを4MHzに設定しているので、これをプリスケーラで8分周しTMR0の値を130に設定し、1msごとに割込みが発生する算段なのですが、どこか間違えてますでしょうか? マイコンは PIC16F886 を使用しています。 #include<pic.h> #include<stdio.h> #include <stdlib.h> #include <xc.h> #define _XTAL_FREQ 4000000 // 内部クロック 4MHz // CONFIG1 #pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) #pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming) // CONFIG2 #pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V) #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off) #define TMR_set 130 // TMR0初期値 #define led_green RB0 #define led_white RC3 volatile unsigned int count = 0; volatile unsigned int cnt = 0; // タイマー割込みの処理 void __interrupt() int_f (void){ // 割り込みハンドラ if(T0IF == 1){ // 1ms count++; cnt++; TMR0=TMR_set; T0IF = 0; // 割り込みフラグをクリア (オーバーフローフラグ) if(count>=1000){ // 1s count=0; led_green = ~led_green; } } } void init(){ OSCCON = 0b01100000; ANSEL = 0b00000000; ANSELH = 0b00000000; TRISA = 0b00000000; TRISB = 0b00000000; TRISC = 0b00000000; PORTA = 0; PORTB = 0; PORTC = 0; GIE = 1; // すべての割り込みを許可 (0:禁止, 1:許可) T0IE = 0; // タイマー割り込みを禁止 (0:禁止, 1:許可) T0CS = 0; // TIMAR0モジュールをタイマーとして使用 (0:通常のタイマーとして使用, 1:T0CK端子に入ってきた入力のカウンタ) PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG = 0x02; // プリスケーラ 1:8 TMR0 = TMR_set; T0IE = 1; // タイマー割り込みを許可 (0:禁止, 1:許可) T0IF = 0; // 割り込みフラグをクリア (オーバーフローフラグ) } void main(void){ init(); led_white = 1; while(1){ } return; }

  • H8SX/1655のアドレスエラー

    HEWのプログラミングで、割り込みの勉強をしているんですが なかなかうまくいきません・・・ 割り込みを使わないで、実験回路のLEDをスイッチを押すことで つけることはできました。 が、割り込みを使うとアドレスエラーとなり実行できません。。。 割り込みのプログラムはこんな感じです。 // vector 66 External trap IRQ2 __interrupt(vect=66) void INT_IRQ2(void){ led_out[0] = 0x00; //LEDを消す if(P1.PORT.BIT.B0 == 0) //スイッチが押されたら { led_out[0] = led[0]; //押されている間、点灯する } P2.DR.BYTE = led_out[0]; } mainプログラムは、 #include "iodefine.h" #include <machine.h> const unsigned char led[8] = { //0 1 2 3 4 5 6 7 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 }; unsigned char led_out[8]; void main(void) { P2.DDR = 0xff;//ledを出力に設定 P1.DDR = 0x00;//全部入力に設定 INT_IRQ2(); set_imask_ccr(0); while(1) { } } 割り込みの設定がわるいのでしょうか? スイッチは、P1に接続してLEDはP2に接続しています・・・

  • Arduinoのプログラムで質問です。

    お世話になります。 Arduinoのプログラムで質問が有ります。 下記のプログラムは2番ピンに信号が入ると割り込みで13番ピンのLEDが設定時間点灯します。 ただ、設定時間になると信号が入っていてもLEDは消灯してしまいます。 そこで、信号が入っている間(ボタンが押されている時)はLEDに点灯してもらいたいのです。 2番ピンに入る信号が不安定なのですが、LEDはずーっと点灯してもらいたいのです。 ちなみにDelayは使いたくありません。(わがままスミマセン) 皆様、よろしくお願い致します。 int PinFlag ; long TimeCount ; void InterPin() { PinFlag = 1 ; // 割込み有ればON } void setup() { pinMode(13,OUTPUT) ; // 13番ピン付属LED出力 attachInterrupt(0,InterPin, RISING) ; // 2番ピンの割込みを指定(立上がりで割込み) PinFlag = 0 ; TimeCount = 0 ; } void loop() { // 割込み有ればその時点の時刻を保存してLEDを点灯する while(PinFlag) { PinFlag = 0 ; TimeCount = millis() ; // 現在の時刻を保存 digitalWrite(13,HIGH) ; // LEDを点灯 } // 設定秒間カウントしたらLEDを消灯する if (TimeCount != 0) { if ((millis() - TimeCount) >= 1010) { TimeCount = 0 ; digitalWrite(13,LOW) ; // LEDを消灯 } } }

  • PICのコンフィグレーションワードの書き方

    MPLAB + PICC-Lite + PICkit2 で PIC16F877(20MHz)を使用しようとしています。 今まで、16F627Aを使用していて、今回が初めての16F877です。最初にDポートのLED4つを点滅させるプログラムを実行しようとしました。 最初、ディパッガーでも動かなかったのですが、MPLAB IDEのConfigureメニューのConfiguration BitsをHSに変更したら動きました。 ところがPICkitを外して、16F877単体で動きません。 おそらく、コンフィグレーションワードで、HSを書き込まなければだめらしいということは、わかったのですが、その書き方がわかりません。 現在のソースファイルは以下の通りです。 ----------------------- #include <pic.h> void delay(void) { unsigned char i, j; for (i = 0; i < 254; i++) { for (j = 0; j < 254; j++) { } } } void main(void) { TRISD = 0; unsigned char led = 0x01; do { PORTD = led; if (led == 0x08) { led = 0x01; } else { led <<= 1; } delay(); } while (1); }

専門家に質問してみよう