Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <util/delay.h>
- // Макрос управления защелкой
- #define registerLatch(code) { PORTD &= ~(1 << 6); code; PORTD |= 1 << 6; }
- //Сигналы управления сдвиговыми регистрами
- #define SCLK 7
- #define RCLK 5
- #define DATA 6
- // Данные о сегментах индикаторов
- const uint8_t digits[11] = {// A
- 0b11000000, // #########
- 0b11111001, // # #
- 0b10100100, // F # # B
- 0b10110000, // # G #
- 0b10011001, // #########
- 0b10010010, // # #
- 0b10000010, // E # # C
- 0b11111000, // # #
- 0b10000000, // #########
- 0b10010000, // D ##
- 0b11111111 // dp
- };
- // Данные о группах светодиодов (16бит)
- const uint16_t groups[15] = {
- 0b0000010000000000, // DIGIT 1 (0)
- 0b0000001000000000, // DIGIT 2 (1)
- 0b0000000100000000, // DIGIT 3 (2)
- /* ------------------------------ */
- 0b0000000010000000, // DIGIT 1 (3)
- 0b0000000001000000, // DIGIT 2 (4)
- 0b0000000000100000, // DIGIT 3 (5)
- 0b0000000000010000, // DIGIT 4 (6)
- 0b0000000000001000, // DIGIT 5 (7)
- 0b0000000000000100, // DIGIT 6 (8)
- /* ------------------------------ */
- 0b0010000000000000, // SCALE 1 (9)
- 0b0001000000000000, // SCALE 2 (10)
- 0b0000100000000000, // SCALE 3 (11)
- 0b0000000000000010, // SCALE 4 (12)
- 0b0000000000000001 // SCALE 5 (13)
- };
- // Данные о светодиодах в шкале
- const uint8_t scale_leds[6] = {
- 0b00000000, // 0 LED's
- 0b00000000, // 0 LED's
- };
- uint8_t NC = 0b11111111;
- // Временный массив для теста индикации
- uint8_t disp[14] = {NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC};
- unsigned char counter = 0;
- // Отправка данных по SPI
- void shiftOut2(uint8_t data) {
- for (uint8_t i = 0; i < 8; i++) {
- byte value = !!(data & (1 << (7 - i)));
- if (value) PORTD |= 1 << 5; else PORTD &= ~(1 << 5);
- PORTD |= 1 << 7;
- PORTD &= ~(1 << 7);
- }
- }
- // Запись в регистры
- void registerWrite(uint16_t groups, uint8_t segments) {
- registerLatch({
- shiftOut2(groups >> 8);
- shiftOut2((groups) & 0xFF);
- shiftOut2(segments);
- });
- }
- // Описание таймера
- ISR (TIMER0_OVF_vect) {
- TCNT0 = 0x00;
- counter = (counter + 1) % 14;
- registerWrite(groups[counter], disp[counter]);
- }
- void print3digitDisplay(int number) {
- int r1 = round(number / 1000);
- int r2 = round(number / 100) % 10;
- int r3 = round(number % 100) / 10;
- int r4 = round(number % 10);
- if (number == 0) {
- disp[0] = (digits[0] & ~(1 << 7));
- disp[1] = digits[0];
- disp[2] = digits[0];
- } else if (number >= 1 && number <= 9) {
- disp[0] = digits[number];
- disp[1] = NC;
- disp[2] = NC;
- } else if (number >= 10 && number <= 99) {
- disp[0] = digits[r3];
- disp[1] = digits[r4];
- disp[2] = NC;
- } else if (number >= 100 && number <= 999) {
- disp[0] = digits[r2];
- disp[1] = digits[r3];
- disp[2] = digits[r4];
- }
- }
- void print6digitDisplay(unsigned long int number) {
- int r1 = round(number / 1000);
- int r2 = round(number / 100) % 10;
- int r3 = round(number % 100) / 10;
- int r4 = round(number % 10);
- int r5 = round(number / 10000);
- int r6 = round(number / 1000 % 10);
- int r7 = round(number % 1000 / 100);
- int r8 = round(number % 100 / 10);
- int r9 = round(number % 10);
- int r10 = round(number / 100000);
- int r11 = round(number / 10000 % 10);
- if (number <= 9) {
- disp[3] = digits[number];
- disp[4] = NC;
- disp[5] = NC;
- disp[6] = NC;
- disp[7] = NC;
- disp[8] = NC;
- } else if (number >= 10 && number <= 99) {
- disp[3] = digits[r3];
- disp[4] = digits[r4];
- disp[5] = NC;
- disp[6] = NC;
- disp[7] = NC;
- disp[8] = NC;
- } else if (number >= 100 && number <= 999) {
- disp[3] = digits[r2];
- disp[4] = digits[r3];
- disp[5] = digits[r4];
- disp[6] = NC;
- disp[7] = NC;
- disp[8] = NC;
- } else if (number >= 10000 && number <= 99999) {
- disp[3] = digits[r5];
- disp[4] = (digits[r6] & ~(1 << 7));
- disp[5] = digits[r7];
- disp[6] = digits[r8];
- disp[7] = digits[r9];
- disp[8] = NC;
- } else if (number >= 100000 && number <= 999999) {
- disp[3] = digits[r10];
- disp[4] = digits[r11];
- disp[5] = (digits[r6] & ~(1 << 7));
- disp[6] = digits[r7];
- disp[7] = digits[r8];
- disp[8] = digits[r9];
- }
- }
- void test_display() {
- int i;
- for (i = 0; i < 14; i++) {
- disp[i] = ~NC;
- }
- }
- // Основная программа
- int main () {
- // SPI - выводы для регистров
- DDRD = 0b11100000;
- // Инициализация таймера
- TIMSK = (1 << TOIE0);
- TCCR0 = (1 << CS00) | (1 << CS01) | (0 << CS02);
- asm("SEI");
- test_display();
- // print3digitDisplay(0);
- // print6digitDisplay(32768);
- // Вечный цикл
- while (1) {
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment