تمرین ۱۰ - معکوس شمار چهار رقمی

متن تمرین

ساخت شمارنده چهار رقمی معکوس شمار که عمل شمارش اعداد از ۹۹۹۹ تا صفر را انجام دهد.

کد برنامه

``````/*
* Assignment #10
*
* A 4-digit seven segment count down (9999 to 0000)
*
* The circuit:
* Connect pin 0 of Arduino to input A (pin 7) of 7447
* Connect pin 1 of Arduino to input B (pin 1) of 7447
* Connect pin 2 of Arduino to input C (pin 2) of 7447
* Connect pin 3 of Arduino to input D (pin 6) of 7447
* Connect outputs of 7447 to seven segments
* Connect pin 8 of Arduino to common of first seven segment
* Connect pin 9 of Arduino to common of second seven segment
* Connect pin 10 of Arduino to common of third seven segment
* Connect pin 11 of Arduino to common of fourth seven segment
*
* https://mehsen.com/arduino/assignments/
*
* To the extent possible under law,
* and related or neighboring rights to Arduino Assignments.
* https://creativecommons.org/publicdomain/zero/1.0/
*/

// include library for use of timer1 interrupts
// https://www.pjrc.com/teensy/td_libs_TimerOne.html
#include <TimerOne.h>

// array to store the pattern of each seven segment digit
byte ss_digits[4];

// display number as decimal on 4 seven segments
void displayDecimal(int number) {
// calculate decimal digits and assign them to corresponding seven segment
ss_digits[0] = number % 10;
ss_digits[1] = (number / 10) % 10;
ss_digits[2] = (number / 100) % 10;
ss_digits[3] = (number / 1000) % 10;
}

// this functions gets called by timer1 interrupt
void updateDisplay() {
// show pattern of a digit each time the function runs
// and light up the corresponding seven segment (multiplexing)
static int placeNow = 0;
PORTB = 0x00;
digitalWrite(placeNow + 8, HIGH);
PORTD = ss_digits[placeNow];
// add 1 to placeNow and keep the 1st, 2nd, 4th bits and clear the rest
// this assigns 8, 9, 10, 11 to placeNow each time
placeNow = (placeNow + 1) & 3;
}

// the setup routine runs once when you press reset:
void setup() {
for(int i = 0; i <= 11; i++) {
pinMode(i, OUTPUT);
}
// initialize timer1 and attach timer interrupt
Timer1.initialize(5000);
Timer1.attachInterrupt(updateDisplay);
}

// the loop routine runs over and over again forever:
void loop() {
// count down from 9999 to 0 and display on seven segments
for (int i = 9999; i >= 0; i--) {
displayDecimal(i);
delay(200);
}
}

``````