Всем привет!
Пишу программу для МК Atmega8 на WinAVR, симулятор схем Proteus, столкнулся с такой проблемой, соединяю последовательно 5 74HC595 (с выхода Q7' подаю на вход DS) все вроде бы правильно. Есть рабочая версия программы для этого же контроллера на этих же регистрах и с использованием 7-ми сегментного индикатора но для 2-х разрядного числа , т.е. от 0 до 99, а мне нужно увеличить до 5 этот разряд, т.е. что бы считал мой секундомер от 0 до 99999
Код:
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> /* -A- F B -G- E C -D- */ // составляем из сегментов цифры #define N0 (0x3F) //0 #define N1 (0x06) //1 #define N2 (0x5B) //2 #define N3 (0x4F) //3 #define N4 (0x66) //4 #define N5 (0x6D) //5 #define N6 (0x7D) //6 #define N7 (0x07) //7 #define N8 (0x7F) //8 #define N9 (0x6F) //9 unsigned char indikator[10]={N0, N1, N2, N3, N4, N5, N6, N7, N8, N9}; unsigned char y=0; //переменная y void export_data (long int data) { unsigned char i; //переменная i for (i=0;i<16;i++) { if ((data&0x8000)==0x00){ PORTD&=~_BV(PD5); //Выставляем биты данных на PD5 (DATA канал) } else { PORTD|=_BV(PD5); } PORTD|=_BV(PD6); //Импульс на SH_CP (запись) PORTD&=~_BV(PD6); data<<=1; } PORTD|=_BV(PD7); //Импульс на ST_CP (защелка - вывод на индикатор записанных данных) PORTD&=~_BV(PD7); } int main(void) { long int DS=0; //переменная DS unsigned int i=0; //переменная i PORTD=0x00; //Первоначально устанавливаем на всех выходах 0 DDRD=0xff; //установить PD0-PD2 как выходы while (1) //Бесконечный цикл { DS=((indikator[i / 10] << 8) | indikator[i % 10]); //Закодированное число в 16hex системе исчисления export_data(DS); //Отправляем данные на сдвиговый регистр if (i==99) // Если i > 9999 то обнуляем i=0; else i++; _delay_ms(500); //пауза 500 мс. } }