第 7 回 C++言語演習2

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されていま。

7-1. 演習課題

演習7-1

すべてのLED が一個ずつ順番に1秒ずつ点灯するプログラムを書きなさ い。

演習7-2

最初、LEDが一つだけ点灯し、その後、一秒ごとに一つずつ光るLED増え ていき、全点灯したら、最初に戻るプログラムを書きなさい。

演習7-3

すべてのLEDが一個ずつ順番に1秒ずつ点灯するが、ボタンを押している 間は消灯するプログラムを書きなさい

演習7-4

最初、LEDが一つだけ点灯し、その後、押ボタンを押すたびに一つずつ光るLED増え ていき、全点灯したら、最初に戻るプログラムを書きなさい。

演習7-5

7SEG LED に 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F が一秒ごとに光り、 また最初に戻るプログラムを書きなさい

演習7-6

7SEG LED に 0 を表示し、右のボタンを押したら数が 1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,0,1 ... と一つずつ増え、左のボタンを押した ら F,E,d,C,b,A,9,8,7,6,5,4,3,2,1,0,F,E ... と減るようなプログラムを書きなさい

7-2. 演習解答

演習7-1

すべてのLED が一個ずつ順番に1秒ずつ点灯するプログラムを書きなさ い。


const byte out[]={6,7,8,9,10,11,12,13,A0,A1,A2,A3,0xff};
void setup() {
  for(byte i=0;out[i]!=0xff;i++){
    pinMode(out[i], OUTPUT);
  }
}
byte prev=out[0];
byte i=0;
void loop() {
   digitalWrite(prev,LOW);
   digitalWrite(prev=out[i++],HIGH);
   if(out[i]==0xff){
    i=0;
   }
   delay(1000);
}

演習7-2

最初、LEDが一つだけ点灯し、その後、一秒ごとに一つずつ光るLED増え ていき、全点灯したら、最初に戻るプログラムを書きなさい。


const byte out[]={6,7,8,9,10,11,12,13,A0,A1,A2,A3,0xff};
void setup() {
  for(byte i=0;out[i]!=0xff;i++){
    pinMode(out[i], OUTPUT);
  }
}
void clear(){
  for(byte i=0;out[i]!=0xff;i++){
    digitalWrite(out[i], LOW);
  }
}
byte i=0;
void loop() {
  digitalWrite(out[i++],HIGH);
  delay(1000);
  if(out[i]==0xff){
    i=0;
    clear();
  }
}

演習7-3

すべてのLEDが一個ずつ順番に1秒ずつ点灯するが、ボタンを押している 間は消灯するプログラムを書きなさい


const static int tmax=10000;
const byte out[]={6,7,8,9,10,11,12,13,A0,A1,A2,A3,0xff};
byte buf[sizeof(out)]={LOW};
const byte button1=4;
const byte button2=5;
void setup() {
  for(byte i=0;out[i]!=0xff;i++){
    pinMode(out[i], OUTPUT);
  }
  pinMode(button1,INPUT_PULLUP);
  pinMode(button2,INPUT_PULLUP);
}

void writeArray(bool cond){
  for(byte i=0; out[i]!=0xff;i++){
    digitalWrite(out[i],cond?buf[i]:LOW);
  }
}
void next(){
  static byte i=0;
  static byte prev=0;
  buf[prev]=LOW;
  buf[prev=i++]=HIGH;
  if(out[i]==0xff){
    i=0;
  }
}
void loop() {
  static bool prev=HIGH;
  static bool now=HIGH;
  static bool condition=HIGH;
  static int t = 0;
  if(++t>tmax){
    t=0;
    next();
  }

  now=digitalRead(button2);
  if(now==HIGH && prev==LOW){
    condition ^= true;
  }
  prev=now;
  writeArray(condition == digitalRead(button1));
}

演習7-4

最初、LEDが一つだけ点灯し、その後、押ボタンを押すたびに一つずつ光るLED増え ていき、全点灯したら、最初に戻るプログラムを書きなさい。


/* ex64 */
const byte out[]={6,7,8,9,10,11,12,13,A0,A1,A2,A3,0xff};
byte buf[sizeof(out)]={LOW};
const byte button1=4;
const byte button2=5;
void setup() {
  for(byte i=0;out[i]!=0xff;i++){
    pinMode(out[i], OUTPUT);
  }
  pinMode(button1,INPUT_PULLUP);
  pinMode(button2,INPUT_PULLUP);
}

void writeArray(bool cond){
  for(byte i=0; out[i]!=0xff;i++){
    digitalWrite(out[i],cond?buf[i]:LOW);
  }
}
byte p=0;
void increase(){
  if(out[p]==0xff){
    p=0;
  }else{
    p++;
  }
  write();
}
void decrease(){
  if(p==0){
    p=sizeof(out)-1;
  }else{
    p--;
  }
  write();
}
void write(){
  bool cond=HIGH;
  if(out[p]==0xff){
    cond=LOW;
  }
  for(byte i=0;out[i]!=0xff; i++){
    digitalWrite(out[i],cond & (i<=p));
  }
}
void loop() {
  static bool prev1=HIGH;
  static bool prev2=HIGH;
  static bool now1=HIGH;
  static bool now2=HIGH;
  now1=digitalRead(button1);
  if(now1==HIGH && prev1==LOW){
    decrease();
  }
  prev1=now1;
  now2=digitalRead(button2);
  if(now2==HIGH && prev2==LOW){
    increase();
  }
  prev2=now2;
}

演習7-5

7SEG LED に 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F が一秒ごとに光り、 また最初に戻るプログラムを書きなさい


const byte out7seg[]={6,7,8,9,10,11,12,13,0xff};
const byte pattern[]={

			0b11011110, //0
			0b10010000, //1
			0b11001101, //2
                        0b11011001, //3
                        0b10010011, //4
                        0b01011011, //5
                        0b01011111, //6
                        0b11010000, //7
                        0b11011111, //8
                        0b11011011, //9
                        0b11010111, //A
                        0b00011111, //b
                        0b01001110, //C
                        0b10011101, //d
                        0b01001111, //E
                        0b01000111 //F
};
const byte button1=4;
const byte button2=5;
void setup() {
  for(byte i=0;out7seg[i]!=0xff;i++){
    pinMode(out7seg[i], OUTPUT);
  }
  pinMode(button1,INPUT_PULLUP);
  pinMode(button2,INPUT_PULLUP);
}

void write7seg(byte x){
  for(byte i=0; i<8;i++){
    digitalWrite(out7seg[i],(pattern[x]&1<<i)!=0);
  }
}
byte j=0;
void loop() {
  write7seg(j++);
  delay(1000);
  if(j>=sizeof(pattern)){
    j=0;
  }
}

演習7-6

7SEG LED に 0 を表示し、右のボタンを押したら数が 1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,0,1 ... と一つずつ増え、左のボタンを押した ら F,E,d,C,b,A,9,8,7,6,5,4,3,2,1,0,F,E ... と減るようなプログラムを書きなさい


const byte out7seg[]={6,7,8,9,10,11,12,13,0xff};
const byte pattern[]={
			0b11011110, //0
			0b10010000, //1
			0b11001101, //2
                        0b11011001, //3
                        0b10010011, //4
                        0b01011011, //5
                        0b01011111, //6
                        0b11010000, //7
                        0b11011111, //8
                        0b11011011, //9
                        0b11010111, //A
                        0b00011111, //b
                        0b01001110, //C
                        0b10011101, //d
                        0b01001111, //E
                        0b01000111 //F
};
const byte button1=4;
const byte button2=5;
void write();
void setup() {
  for(byte i=0;out7seg[i]!=0xff;i++){
    pinMode(out7seg[i], OUTPUT);
  }
  pinMode(button1,INPUT_PULLUP);
  pinMode(button2,INPUT_PULLUP);
  write();
}

void write7seg(byte x){
  for(byte i=0; i<8;i++){
    digitalWrite(out7seg[i],(pattern[x]&1<<i)!=0);
  }
}
byte p=0;
void increase(){
  if(p>=sizeof(pattern)-1){
    p=0;
  }else{
    p++;
  }
  write();
}
void decrease(){
  if(p==0){
    p=sizeof(pattern)-1;
  }else{
    p--;
  }
  write();
}
void write(){
  write7seg(p);
}
void loop() {
  static bool prev1=HIGH;
  static bool prev2=HIGH;
  static bool now1=HIGH;
  static bool now2=HIGH;
  now1=digitalRead(button1);
  if(now1==HIGH && prev1==LOW){
    decrease();
  }
  prev1=now1;
  now2=digitalRead(button2);
  if(now2==HIGH && prev2==LOW){
    increase();
  }
  prev2=now2;
}

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科