Например TDA7294

Форум РадиоКот • Просмотр темы - Динамическая индикация 9 разрядного индикатора по SPI-шине.
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт апр 19, 2024 00:18:04

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Динамическая индикация 9 разрядного индикатора по SPI-шине.
СообщениеДобавлено: Ср окт 07, 2020 13:11:13 
Родился

Зарегистрирован: Ср окт 07, 2020 12:45:31
Сообщений: 3
Рейтинг сообщения: 0
Обсуждение к статье: Динамическая индикация 9 разрядного индикатора по последовательной шине.

Немного поправил код для ATMEGA 328p (Arduino nano) и ост совместимые. А так же исправил принципиальную эл. схему, во вложении!

Спойлер
Код:
// WinAvr
// Fix by iStarCom 2020 for ATMEGA328P.
#include <avr/io.h>
#include <avr/interrupt.h>
#define DATA  5
#define SHIFT 6
#define STORAGE 7
#define PORTSERIAL  PORTD
#define DDRSERIAL    DDRD
#define BUT   0
#define BIT(bit)  (1<<(bit))

unsigned char lcd_buffer[9] = {0xEB, 0x48, 0x73, 0x7A, 0xD8, 0xBA, 0xBB, 0x68, 0xFB}; // РУСЬ 27 (ОК)
//unsigned char lcd_buffer[9] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F}; // СТАНДАРТ (ОК)
//*************************************************************
void data_shift(unsigned char data)
{
  // выводим бит данных, сдвигаем и так 8 раз.
  unsigned char i = 0;
  for (i = 8; i ; i--) {
    if (data & BIT(i - 1) )  PORTSERIAL |= BIT(DATA); // выводим бит данных
    else   PORTSERIAL &= ~BIT(DATA);
    PORTSERIAL |= BIT(SHIFT); // сдвиг данных
    PORTSERIAL &= ~BIT(SHIFT);
  }
}
//*************************************************************
void num_out(unsigned char znmesto)
{
  unsigned char i = 0;
  PORTSERIAL |= BIT(STORAGE); // выводы микросхем в Z состояние
  data_shift(lcd_buffer[znmesto]);// загружаем символ в первый регистр

  if (znmesto == 7) i = 1; //7 знакоместо
  if (znmesto == 8) i = 2; //8 знакоместо
  znmesto = ~(1 << (znmesto)); // число в бит места (пример 0х3->0b11110111)

  data_shift(znmesto);// вывод знакоместа, символ сдвигается в второй регистр

  if ( i == 0 )
  {
    PORTSERIAL &= ~BIT(STORAGE);
    PORTSERIAL |= BIT(STORAGE); // сохранили
    PORTSERIAL &= ~BIT(STORAGE); // и вывели
  }
  else if (i >= 1) { // 7 знакоместо
    PORTSERIAL &= ~BIT(STORAGE);
    PORTSERIAL |= BIT(SHIFT) | BIT(STORAGE); // сохранили и вывели
    PORTSERIAL &= ~(BIT(SHIFT) | BIT(STORAGE));
    //shift нужен потому что 0 переместился из Q6 в -Q7
  }
  if (i == 2)   data_shift(0x0); //9 разряд.
  //Сейчас все выходы первого регистра уст в 1,
  //загружаем регистр нулями в итоге -Q7 = 0, но не сохроняем.

  PORTSERIAL &= ~(BIT(DATA) | BIT(SHIFT) | BIT(STORAGE));
}
//*************************************************************
int main( void )
{
  unsigned char i = 0;
  PORTSERIAL = BIT(BUT) | BIT(STORAGE);
  DDRSERIAL = 0xf0;
  TCCR0B = 3;
  while (1) {
    TCNT0 = 127;
    while (!(TIFR0 & BIT(0))); // Задержка такая :-) по идеи 2ms
    TIFR0 |= 1;
  //  if ( !bitRead(PIND, BUT) ) //если включить то вывод цифры
    {
   //   while ( !bitRead(PIND, BUT) ); // будет только по нажатию
      if (i > 8) i = 0;
      num_out(i);
      i++;
    }
  }
}


Изображение


Вложения:
Комментарий к файлу: Принципиальная эл. схема
Shematic.zip [329.44 KiB]
Скачиваний: 166
Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y