Например TDA7294

Форум РадиоКот • Просмотр темы - сдвиговый регистр и семисегментный индикатор
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср янв 14, 2026 09:00:29

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


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



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 17:25:03 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Ср авг 17, 2011 23:12:30
Сообщений: 550
Рейтинг сообщения: 0
Помогите пожалуйста ,написал код который выводит цифры на индикатор от 0-до 2 х и по повтору,как можно все это упростить?,по другому написать

Код:
#include <mega8.h>
#include <delay.h>
unsigned char data,i;
unsigned char array[]={0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01};
unsigned char array1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00};
unsigned char array2[]={0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x01};

void main(void)

{

PORTD=0x00;
DDRD=0x07;

 label2:
while(1)

{
     if (data>8) { data=0;goto label0;}
for(i=0;i<9;++i)

{
    data++;
PORTD.1=array[data]&0x01;

PORTD.0=1;
PORTD.0=0;


}
 PORTD.2=1;
PORTD.2=0;
delay_ms(1000);


}

label0:
while(1)
{
       if (data>8) { data=0;goto label1;}

for(i=0;i<9;++i)

{
   ++data;
PORTD.1=array1[data]&0x01;

PORTD.0=1;
PORTD.0=0;


}
PORTD.2=1;
PORTD.2=0;
delay_ms(1000);
   }
   label1:
while(1)
{
       if (data>8) { data=0;goto label2;}

for(i=0;i<9;++i)

{
   ++data;
PORTD.1=array2[data]&0x01;

PORTD.0=1;
PORTD.0=0;


}
PORTD.2=1;
PORTD.2=0;
delay_ms(1000);
   }

}


Вложения:
hc595.JPG [143.04 KiB]
Скачиваний: 388
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 18:01:10 
Опытный кот

Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27
Сообщений: 833
Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
Начни с нормального определения символов сначала, ибо не ясно что за массивы. Тип вот так:
Спойлер
Код:
#ifndef DISPLAYH
#define DISPLAYH

//#define   FLASHINIT

#define   MAXDIGIT4
#define MAXCHANELSADC 5
#define   MAXCHANELSDIS 6

#define MAXSPIBUFF MAXCHANELS

#define KEY      PA3
#define HALL   PA6



#define charGE   0x01
#define charGA   0x02
#define charGF   0x04
#define charGB   0x08
#define charGD   0x10
#define charGP   0x20
#define charGH   0x40
#define charGC   0x80


#define charALL charGA|charGB|charGC|charGD|charGE|charGF|charGH|charGP

#define char0    ~(charGA|charGB|charGC|charGD|charGE|charGF)
#define char1    ~(charGB|charGC)
#define char2    ~(charGA|charGB|charGH|charGE|charGD)
#define char3    ~(charGA|charGB|charGC|charGD|charGH)
#define char4    ~(charGB|charGC|charGF|charGH)
#define char5    ~(charGA|charGC|charGD|charGF|charGH)
#define char6    ~(charGA|charGC|charGD|charGE|charGF|charGH)
#define char7    ~(charGA|charGB|charGC)
#define char8    ~(charGA|charGB|charGC|charGD|charGE|charGF|charGH)
#define char9    ~(charGA|charGB|charGC|charGD|charGF|charGH)
#define charA    ~(charGA|charGB|charGC|charGE|charGF|charGH)
#define charB    ~(charGC|charGD|charGE|charGF|charGH)
#define charC    ~(charGA|charGD|charGE|charGF)
#define charD    ~(charGB|charGC|charGD|charGE|charGH)
#define charE    ~(charGA|charGD|charGE|charGF|charGH)
#define charF    ~(charGA|charGE|charGF|charGH)
#define charH    ~(charGB|charGC|charGE|charGF|charGH)


#define MOSI    0
#define MISO   1
#define SCK      2
#define   csInd0    4
#define   csInd1    3
#define   csInd2    5
#define   csInd3    7 /*PORTA*/
#define   REGR    6
#define RESPIN    7

#define ENCHAR0 PORTB |= 1<<5;
#define ENCHAR1 PORTB |= 1<<4;
#define ENCHAR2 PORTB |= 1<<3;
#define ENCHAR3 PORTA |= 1<<6;

#define DICHAR0 PORTB &= ~(1<<5);
#define DICHAR1 PORTB &= ~(1<<4);
#define DICHAR2 PORTB &= ~(1<<5);
#define DICHAR3 PORTA &= ~(1<<6);


Это кусок кода из Изображение

Собственно передача по USI (универсальный последовательный интерфейс в тини26/261, хочешь будет уарт, хочешь - SPI):
Спойлер
Код:
void USISend(unsigned char value)
{
unsigned char temp1=(1<<USIOIF);
unsigned char temp2=(1<<USIOIF);
char cikle;
temp1 = (1<<USIWM0)|(0<<USICS1)|(0<<USICLK)|(1<<USITC);
temp2=(1<<USIOIF);

USIDR = value;
USISR = temp2;
temp2 = (1<<USIWM0)|(0<<USICS1)|(1<<USICLK)|(1<<USITC);
for(cikle=0;cikle<8;cikle++)
//while(USISR&&USIOIF)
   {
   USICR = temp1;
   USICR = temp2;
   }
//USICR = temp1;
temp2= USIDR;
}


Это читабельное представление таблицы перекодировки
Спойлер
Код:
static char cDecodeTable[] = {(char)char0,(char)char1,(char)char2,(char)char3,\
                        (char)char4,(char)char5,(char)char6,(char)char7,\
                        (char)char8,(char)char9,(char)charA,(char)charB,\
                        (char)charC,(char)charD,(char)charE,(char)charF,\
                        (char)charH};

Как то так :tea:

_________________
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ


Последний раз редактировалось pcb Ср окт 29, 2014 18:06:01, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 18:05:58 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Ср авг 17, 2011 23:12:30
Сообщений: 550
Рейтинг сообщения: 0
СЛОЖНО :(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 18:08:39 
Опытный кот

Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27
Сообщений: 833
Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
я ж тебе куски кода дал - подставь свои номера выводов

_________________
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 18:25:25 
Друг Кота

Карма: 49
Рейтинг сообщений: 547
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 19494
Рейтинг сообщения: 0
sirha писал(а):
СЛОЖНО :(


Думаете у вас просто ? :)) Выглядит совсем не...

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 19:40:14 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Ср авг 17, 2011 23:12:30
Сообщений: 550
Рейтинг сообщения: 0
как это можно записать в codevision?

Код:
regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 16
$framesize = 16
 
Config Portb.2 = Output
Config Portb.1 = Output
Config Portb.0 = Output
 
Ds Alias Portb.2
Sh_cp Alias Portb.0
Const St_cp = 1
 
Dim Level As Integer
Dim R1 As Byte
 
Do
 
If Level = 9 Then
Level = 0
Else
Incr Level
End If
 
R1 = Lookup(level , Numbers)
Shiftout Ds , Sh_cp , R1 , 1
Pulseout Portb , St_cp , 5
 
Wait 1
Loop
 
End
 
Numbers:
Data &B10000001                                             '0
Data &B11110011                                             '1
Data &B01001001                                             '2
Data &B01100001                                             '3
Data &B00110011                                             '4
Data &B00100101                                             '5
Data &B00000101                                             '6
Data &B10110001                                             '7
Data &B00000001                                             '8
Data &B00100001                                             '9


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 21:17:51 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4599
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
sirha писал(а):
как можно все это упростить?,по другому написать
А для чего что-то писать по-другому, если оно работает и устраивает ? Или чем-то не устроил код ?

sirha писал(а):
while(1)

{
if (data>8) { data=0;goto label0;}
.........
.........
}

label0:
Кто Вас этому учил ? :)
Замена :
Код:
while(data<=8){
.........
.........
}

Мало того, у Вас цикл while(1) пройдёт всего один раз, т.к. data после цикла for будет больше 8. Отсюда вопрос - для чего while ? :)

И ещё. Вам очень повезёт, если компилятор вначале программы обнулит переменную data, что он делать не обязан, либо в ней случайно после старта окажется 0.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 22:17:29 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Ср авг 17, 2011 23:12:30
Сообщений: 550
Рейтинг сообщения: 0
спс за подсказки)),а как то уменьшить код возможно?

работает токо так)

Код:
#include <mega8.h>
#include <delay.h>
unsigned char data,i;
unsigned char array[]={0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01};
unsigned char array1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00};
unsigned char array2[]={0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x01};

void main(void)

{

PORTD=0x00;
DDRD=0x07;

label0:

  data=0;

while(data<=8)


 
for(i=0;i<9;++i)

{
    data++;
PORTD.1=array[data]&0x01;

PORTD.0=1;
PORTD.0=0;


}
 PORTD.2=1;
PORTD.2=0;
delay_ms(1000);

 
}

data=0;


while(data<=8)
{
     
 
for(i=0;i<9;++i)

{
   ++data;
PORTD.1=array1[data]&0x01;

PORTD.0=1;
PORTD.0=0;


}
PORTD.2=1;
PORTD.2=0;
delay_ms(1000);
   }

data=0;

while(data<=8)
{
     

for(i=0;i<9;++i)

{
   ++data;
PORTD.1=array2[data]&0x01;

PORTD.0=1;
PORTD.0=0;


}
PORTD.2=1;
PORTD.2=0;
delay_ms(1000);
   }

data=0;


goto label0;
}



Последний раз редактировалось sirha Ср окт 29, 2014 22:42:05, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 22:41:53 
Опытный кот

Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27
Сообщений: 833
Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
Можно и нужно.

Разделить программу на блоки:
а) вывод на дисплей запихнуть в прерывание
б) оформление задержки прерываниями
в) использовать подпрограммы

мой проект где то выложен полностью был, ищи :)

_________________
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Ср окт 29, 2014 23:32:40 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Ср авг 17, 2011 23:12:30
Сообщений: 550
Рейтинг сообщения: 0
pcb писал(а):
Можно и нужно.

Разделить программу на блоки:

в) использовать подпрограммы

мой проект где то выложен полностью был, ищи :)



Код:
#include <mega8.h>
#include <delay.h>
unsigned char data,i;

 unsigned char array[]={0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01};
unsigned char array1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00};
unsigned char array2[]={0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x01};



void function(void)
{
   

while(data<=8)


 
for(i=0;i<9;++i)

{
    data++;
PORTD.1=array[data]&0x01;

PORTD.0=1;
PORTD.0=0;


}
 PORTD.2=1;
PORTD.2=0;
delay_ms(1000);

 
}


}

void main(void)

{

PORTD=0x00;
DDRD=0x07;
label0:

 data=0;
 function();
array[data]=array1[data];
data=0;
 function();

 array[data]=array2[data];
 function();
 goto label0;
}


подскажите как тут правильно написать? используя подпрограммы


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Чт окт 30, 2014 11:58:41 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18451
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
sirha писал(а):
подскажите как тут правильно написать? используя подпрограммы
последний раз: прочтите, вникните и применяйте.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Чт окт 30, 2014 12:02:15 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 54
Зарегистрирован: Ср июн 11, 2014 09:43:13
Сообщений: 721
Откуда: США
Рейтинг сообщения: 0
ARV, не старайтесь - этот КОТ не обучаем. )

_________________
Fucking static initialization order fiasco


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Чт окт 30, 2014 14:45:47 
Опытный кот

Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27
Сообщений: 833
Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
sirha писал(а):
подскажите как тут правильно написать? используя подпрограммы

Ну нельзя же быть на СТОЛЬКО ленивым, точнее можно, но не правильно.

Если очень надо, но самому не очень хочется - могу помочь, за отдельную денежку.

_________________
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
СообщениеДобавлено: Чт окт 30, 2014 15:13:54 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7014
Откуда: Ижевск
Рейтинг сообщения: 0
Шо? Опять???

_________________
Docendo discimus


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


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

Сейчас этот форум просматривают: linux_rulezz и гости: 23


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

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


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