/* Nano Current Meter David Johnson-Davies - www.technoblogy.com - 9th October 2019 ATtiny84 @ 8 MHz (internal oscillator; BOD disabled) CC BY 4.0 Licensed under a Creative Commons Attribution 4.0 International license: http://creativecommons.org/licenses/by/4.0/ */ // Seven-segment definitions const int charArrayLen = 17; char charArray[] = { // ABCDEFG Segments 0b1111110, // 0 0b0110000, // 1 0b1101101, // 2 0b1111001, // 3 0b0110011, // 4 0b1011011, // 5 0b1011111, // 6 0b1110000, // 7 0b1111111, // 8 0b1111011, // 9 0b0000000, // 10 Space 0b0000001, // 11 '-' 0b0001110, // 12 'L' 0b0011101, // 13 'o' 0b0110111, // 14 'H' 0b0000100, // 15 'i' 0b0011100 // 16 'u' }; const int Space = 10; const int Dash = 11; const int Lo = 12; const int Hi = 14; const int uA = 16; const int ndigits = 3; volatile int Buffer[] = {Dash, Dash, Dash}; char dp = 2; // Decimal point position 2 (off) or 0 to 1 int digit = 0; // Display multiplexer ********************************************** void DisplayNextDigit () { DDRB = 0; // All low digit = (digit+1) % ndigits; char segs = charArray[Buffer[digit]]; DDRA = DDRA & 0x80; // All inputs // Set display segments if (dp == digit && dp != 2) DDRB = 1<=0 ; d--) { Buffer[d]=i % 10; i = i / 10; } } // Set up Timer/Counter1 to multiplex the display void SetupDisplay () { TCCR1A = 0< Target && Time < 100000); nA = 1732868 / Time; dp = 2; if (Time >= 100000) { Buffer[0] = Lo; Buffer[1] = Lo+1; Buffer[2] = Space; } else if (nA < 1000) { dp = 2; Display(nA); } else if (nA < 10000) { dp = 0; Display(nA/10); Buffer[2] = uA; } else if (nA < 100000) { dp = 2; Display(nA/100); Buffer[2] = uA; } else { Buffer[0] = Hi; Buffer[1] = Hi+1; Buffer[2] = Space; } pinMode(7, OUTPUT); digitalWrite(7, HIGH); for (;;); }