Пятница, 19.04.2024, 22:08
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Помоги сайту
Поддержи наш сайт
Через WebMoney
U222865683087
R391933670808
Z877043628365
E649133782052

или пополни нашу SMS копилку
SMS.копилка

Ссылки

 Каталог статей
Главная » Статьи » Учимся работать с AVR

7-и сегментник и регистр 74HC595 (UPDATE)
Первый способ, немного переделан код.

Исходник:
Code

//Author HiSER (c)2010
//Chip type : ATmega8
//AVR Core Clock frequency: 1.000000 MHz
#include <mega8.h>
#include <delay.h>
#define SH_CP PORTB.1  
#define ST_CP PORTB.2  
#define DS PORTB.0  

unsigned char led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
unsigned long show_data=12345678; //Отображаемая цифра
unsigned long dig_data=0;
unsigned char dig_number=0; //Отображаемый разряд

void show_dig() {
unsigned char data[2];
unsigned char i;
ST_CP=0;
if (dig_number==0) dig_data=show_data; //Если показываем первую цифру обнавляем переменную
data[0]=dig_data%10; //Получаем разряд
dig_data/=10;
data[0]=led_table[data[0]]; //Получаем данные для сигментов
data[1]=1<<dig_number;
for (i=0;i<8;i++) {
DS=data[1]&1;
SH_CP=1;
SH_CP=0;
data[1]>>=1;
}
for (i=0;i<8;i++) {
DS=data[0]&1;
SH_CP=1;
SH_CP=0;
data[0]>>=1;
}
dig_number++;
if (dig_number>7) dig_number=0;
ST_CP=1;
}

void main(void) {
DDRB=7;
PORTB=0;
while (1) show_dig(); //Отображаем разряды
}  


Второй способ через SPI.

Исходник:
Code

//Author HiSER (c)2010
//Chip type : ATmega8
//AVR Core Clock frequency: 1.000000 MHz  

#include <mega8.h>
#include <spi.h>
#define SS PORTB.2

typedef unsigned char byte;
typedef unsigned long ulong;

byte led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
ulong show_data=12345678; //Отображаемая цифра
ulong dig_data=0;
byte dig_num=0; //Отображаемый разряд

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′ предназначен для последовательного соединения сдвиговых регистров. Можно соединить хоть десяток штук!
Категория: Учимся работать с AVR | Добавил: HiSER (04.02.2010) | Автор: Литвин Артём
Просмотров: 31530 | Комментарии: 13 | Теги: 74HC595, ATmega8, сегментник, Shift, Register | Рейтинг: 4.6/7 |
Всего комментариев: 131 2 »
12 maestrosmit  
0
Люди и и и....может хоть ктото ответит......

11 maestrosmit  
0
Доброго дня. Хорошая статья. Подскажите новичку. Как сделать тоже самое с общим катодом???

10 Винер  
0
Здравствуйте, хотелось бы узнать, а как на счет гашения не значащих нулей и выводом точки?

9 888  
0
А как подключить 3 74hc595, что нужно изменить в коде программы?

7 Druidlithe  
0
Подскажите пожалуйста, почему с приведенным ниже кодом выдает полную лабуду в виде поочередного вывода каждого разряда с интервалом в одну секунду, в то время как по логике должен выдавать одно значение ---> задержка секунда ---> выдача второго значения?
while (1){
show_data=12345678;
show_dig();
delay_ms(1000);
show_data=87654321;
show_dig();
delay_ms(1000);
}

8 HiSER  
0
show_dig(); - показать разряд, показывает по очереди.

6 супер  
0
вот начирикал чуток,может добавите в статью?)
С первого взгляда кажется немного запутано, будем разбираться. Начнем с назначения выводов:

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′ предназначен для последовательного соединения сдвиговых регистров. Можно соединить хоть десяток штук!


5 HiSER  
0
задержку можно убрать, не чего она не сделает.
про MR, да надо лог.1 на схеме просто не стал рисовать.
про OE, просто во время сдвигов не показываю на табло не чего.
по идеи можно и лог.0 (на схемах видел что к ST_CP), но не знаю как на железе будет показывать в эмуляторе одни восьмерки показывает.

ADD: Исправил схему и код чтобы не было путаницы.


4 Magistr_devil  
0
и схема странная
на MR надо 1 подать а OE 0
и использовать всего 3 провода а не 4=\
Хм Хм Хм

3 Magistr_devil  
0
для каких целей в самом конце задержка??
по сути можно же и без нее? или может быть касяк??

2 HiSER  
0
Там небольшая ошибочка есть, задержки delay_us(10); можно убрать.

ADD: Исправил исходник


13 maestrosmit  
0
Доброго здоровья. А можно если Вас не затруднит как изменить код под общий катод.

1-10 11-11
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright My-AVR © 2024
Наша кнопка
У нас появилась кнопка, код кнопки:

Лаборатория самоделок на микроконтроллерах AVR

Форма входа
Наш опрос
Какой МК вы используете?
Всего ответов: 3228
Статистика/Друзья
CY-PR.com



Онлайн всего: 1
Гостей: 1
Пользователей: 0

РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум Сайт по радиоэлектронике. У нас все просто и интересно… ARV Reserch: Электроника — просто, полезно, увлекательно. Электронные устройства и программные средства для радиолюбителей и профессионалов, только авторские разработки, плагиата нет! Разработки на заказ. AVR projects Создание электронных роботов своими руками Схемы и программы на AVR http://ur5yfv.ucoz.ua/BANNER.gif Блог начинающего эмбеддера. Дай волю паяльнику! Самоделки на all-make.ru Принципиальные схемы Модулі автозапуску бензогенератора та системи АВР, електромонтажні роботи
Хостинг от uCoz