Например TDA7294

Форум РадиоКот :: Просмотр темы - сдвиговый регистр и семисегментный индикатор
Форум РадиоКот
https://radiokot.ru/forum/

сдвиговый регистр и семисегментный индикатор
https://radiokot.ru/forum/viewtopic.php?f=57&t=109218
Страница 1 из 1

Автор:  sirha [ Ср окт 29, 2014 17:25:03 ]
Заголовок сообщения:  сдвиговый регистр и семисегментный индикатор

Помогите пожалуйста ,написал код который выводит цифры на индикатор от 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

Автор:  pcb [ Ср окт 29, 2014 18:01:10 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

Начни с нормального определения символов сначала, ибо не ясно что за массивы. Тип вот так:
Спойлер
Код:
#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:

Автор:  sirha [ Ср окт 29, 2014 18:05:58 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

СЛОЖНО :(

Автор:  pcb [ Ср окт 29, 2014 18:08:39 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

я ж тебе куски кода дал - подставь свои номера выводов

Автор:  Morroc [ Ср окт 29, 2014 18:25:25 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

sirha писал(а):
СЛОЖНО :(


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

Автор:  sirha [ Ср окт 29, 2014 19:40:14 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

как это можно записать в 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

Автор:  Аlex [ Ср окт 29, 2014 21:17:51 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

sirha писал(а):
как можно все это упростить?,по другому написать
А для чего что-то писать по-другому, если оно работает и устраивает ? Или чем-то не устроил код ?

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

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

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

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

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

Автор:  sirha [ Ср окт 29, 2014 22:17:29 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

спс за подсказки)),а как то уменьшить код возможно?

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

Код:
#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;
}


Автор:  pcb [ Ср окт 29, 2014 22:41:53 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

Можно и нужно.

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

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

Автор:  sirha [ Ср окт 29, 2014 23:32:40 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

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;
}


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

Автор:  ARV [ Чт окт 30, 2014 11:58:41 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

sirha писал(а):
подскажите как тут правильно написать? используя подпрограммы
последний раз: прочтите, вникните и применяйте.

Автор:  Pink-Pank [ Чт окт 30, 2014 12:02:15 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

ARV, не старайтесь - этот КОТ не обучаем. )

Автор:  pcb [ Чт окт 30, 2014 14:45:47 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

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

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

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

Автор:  pyzhman [ Чт окт 30, 2014 15:13:54 ]
Заголовок сообщения:  Re: сдвиговый регистр и семисегментный индикатор

Шо? Опять???

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/