第 6 回 C言語演習

本日の内容


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

6-1. 演習

演習6-2

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

演習6-3

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

演習6-4

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

演習6-5

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

演習6-6

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

演習6-7

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 ... と減るようなプログラムを書きなさい

6-2. 演習解答

演習6-2

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


/* ex61 */
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);
}

演習6-3

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


/* ex62 */
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();
  }
}

演習6-4

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


/* ex63 */
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));
}

演習6-5

最初、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;
}

演習6-6

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


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

                      0b01111110, //0
                      0b01010000, //1
                      0b01101101, //2
                      0b01111001, //3
                      0b01010011, //4
                      0b00111011, //5
                      0b00111111, //6
                      0b01110000, //7
                      0b01111111, //8
                      0b01111011, //9
                      0b01110111, //A
                      0b00011111, //b
                      0b00101110, //C
                      0b01011101, //d
                      0b00101111, //E
                       0b00100111 //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);
  }
}
byte j=0;
void loop() {
  write7seg(j++);
  delay(1000);
  if(j>=sizeof(pattern)){
    j=0;
  }
}

演習6-7

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 ... と減るようなプログラムを書きなさい


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

                      0b01111110, //0
                      0b01010000, //1
                      0b01101101, //2
                      0b01111001, //3
                      0b01010011, //4
                      0b00111011, //5
                      0b00111111, //6
                      0b01110000, //7
                      0b01111111, //8
                      0b01111011, //9
                      0b01110111, //A
                      0b00011111, //b
                      0b00101110, //C
                      0b01011101, //d
                      0b00101111, //E
                       0b00100111 //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);
  }
}
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>
東京電機大学工学部情報通信工学科