void show_dig() { SS=0; //Ни чего не кажем if (dig_num==0) { dig_data=show_data; //Если показываем первую цифру обнавляем переменную dig_num++; } spi(dig_num); //Отправляем байт для отображения разряда spi(led_table[dig_data%10]); //Получаем разряд из dig_data и отправляем байт с цифрой dig_data/=10; dig_num<<=1; //Смещаем бит для отображения следующего разряда SS=1; //Показываем разряд }
void main(void) { PORTB=0; DDRB=0x2C; //Настраиваем порт для SPI ACSR=0x80; //Отключаем компаратор //Включаем SPI //Биты будем отправлять LSB-MSB, т.е. от младших к старшим SPCR=0x70; SPSR=0; while (1) show_dig(); //Показываем разряды }
От пользователя "супер"
Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоомное Hi-Z состояние GND – земля Q7′ – выход предназначенный для последовательного соединения регистров. MR – сброс регистра. SH_CP – вход для тактовых импульсов ST_CP – вход «защёлкивающий» данные OE – вход переводящий выходы из HI-Z в рабочее состояние DS – вход данных VCC – питание 5 вольт Для управления нам вполне достаточно всего лишь трёх выводов а именно: SH_CP, ST_CP, DS.
Как работает регистр Все не так сложно, как кажется на первый взгляд. Когда на тактовом входе SH_CP появляется логическая единица, регистр считывает бит со входа данных DS и записывает его в самый младший разряд. При поступлении на тактовый вход следующего импульса, всё повторяется, только бит записанный ранее сдвигается на один разряд, а его место занимает вновь пришедший бит. Когда все восемь бит заполнились и приходит девятый тактовый импульс то регистр снова начинает заполнятся с младшего разряда и всё повторятся вновь. Что бы данные появились на выходах Q0…Q7 нужно их «защёлкнуть». Для этого необходимо подать логическую единицу на вход ST_CP. Что бы мы не делали с регистром, данные на выходах не изменятся пока мы вновь не «защёлкнем» их. Отсюда кстати пошло название «регистр-защёлка». Теперь пару слов о других выводах микросхемы. Когда на входе OE лог 1 то выходы находятся в высокоомном состоянии. Когда подаем на этот вход логический 0, тогда выходы работают в нормальном режиме. MR – сбрасывает регистр устанавливая все выходы Q0…Q7 в состояние логического нуля. Для осуществления сброса нужно подать логический ноль на этот вход. После этого «защёлкнуть» данные. В нормальном состоянии на этом выводе должна находится логическая единица. Q7′ предназначен для последовательного соединения сдвиговых регистров. Можно соединить хоть десяток штук!
Подскажите пожалуйста, почему с приведенным ниже кодом выдает полную лабуду в виде поочередного вывода каждого разряда с интервалом в одну секунду, в то время как по логике должен выдавать одно значение ---> задержка секунда ---> выдача второго значения? while (1){ show_data=12345678; show_dig(); delay_ms(1000); show_data=87654321; show_dig(); delay_ms(1000); }
вот начирикал чуток,может добавите в статью?) С первого взгляда кажется немного запутано, будем разбираться. Начнем с назначения выводов:
Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоомное Hi-Z состояние GND – земля Q7′ – выход предназначенный для последовательного соединения регистров. MR – сброс регистра. SH_CP – вход для тактовых импульсов ST_CP – вход «защёлкивающий» данные OE – вход переводящий выходы из HI-Z в рабочее состояние DS – вход данных VCC – питание 5 вольт Для управления нам вполне достаточно всего лишь трёх выводов а именно: SH_CP, ST_CP, DS.
Как работает регистр Все не так сложно, как кажется на первый взгляд. Когда на тактовом входе SH_CP появляется логическая единица, регистр считывает бит со входа данных DS и записывает его в самый младший разряд. При поступлении на тактовый вход следующего импульса, всё повторяется, только бит записанный ранее сдвигается на один разряд, а его место занимает вновь пришедший бит. Когда все восемь бит заполнились и приходит девятый тактовый импульс то регистр снова начинает заполнятся с младшего разряда и всё повторятся вновь. Что бы данные появились на выходах Q0…Q7 нужно их «защёлкнуть». Для этого необходимо подать логическую единицу на вход ST_CP. Что бы мы не делали с регистром, данные на выходах не изменятся пока мы вновь не «защёлкнем» их. Отсюда кстати пошло название «регистр-защёлка». Теперь пару слов о других выводах микросхемы. Когда на входе OE лог 1 то выходы находятся в высокоомном состоянии. Когда подаем на этот вход логический 0, тогда выходы работают в нормальном режиме. MR – сбрасывает регистр устанавливая все выходы Q0…Q7 в состояние логического нуля. Для осуществления сброса нужно подать логический ноль на этот вход. После этого «защёлкнуть» данные. В нормальном состоянии на этом выводе должна находится логическая единица. Q7′ предназначен для последовательного соединения сдвиговых регистров. Можно соединить хоть десяток штук!
задержку можно убрать, не чего она не сделает. про MR, да надо лог.1 на схеме просто не стал рисовать. про OE, просто во время сдвигов не показываю на табло не чего. по идеи можно и лог.0 (на схемах видел что к ST_CP), но не знаю как на железе будет показывать в эмуляторе одни восьмерки показывает.