Всем привет!
Пишу программу для МК 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 мс.
}
}