roboforum.ru

Технический форум по робототехнике.

Семисегментный светодиодный индикатор

Re: Семисегментный светодиодный индикатор

Romikgy » 18 июл 2011, 15:02

Код: Выделить всёРазвернуть
PORTA.6 = 1; 
PORTC = segment[x1];
PORTD.7 = PORTC.6;
delay_ms(5);                 
                 
PORTA.6 = 0;

PORTC = segment[x10];
PORTD.7 = PORTC.6;
delay_ms(5); 

Код: Выделить всёРазвернуть
unsigned char x=segment[x1];
PORTA.6 = 1;
PORTC = x;
PORTD.7 = x>>6;
delay_ms(5);                 
                 
PORTA.6 = 0;
x=segment[x10]
PORTC = x;
PORTD.7 = x>>6;
delay_ms(5); 

Re: Семисегментный светодиодный индикатор

d3xr » 18 июл 2011, 16:33

Ничего не изменило :)

Re: Семисегментный светодиодный индикатор

Romikgy » 18 июл 2011, 17:01

тогда схему приведи ... а лучше проект в протеусе....

Re: Семисегментный светодиодный индикатор

d3xr » 18 июл 2011, 18:04

Ваш код кстати вообще не скомпилился. Пишет что строчка unsigned char x=segment[x1];
must declared first in block. Перенес в начало void main, ничего не отображает индикатор.

Схема верна, просто число показывает же. А если необходимо вывести 2 числа подряд, то тут проблемы возникают

Re: Семисегментный светодиодный индикатор

Romikgy » 18 июл 2011, 18:09

дык и хочется посмотреть на схему , да бы понять в чем косяк программы

Re: Семисегментный светодиодный индикатор

d3xr » 18 июл 2011, 19:29

Переписал код, вытащив все из главного тела. Работает, но фиксированную задержку не могу поставить, все цифры невозможно разглядеть становится.

Косяк тут выявляется
Код: Выделить всёРазвернуть
  void print() 
    {     
    for (i=1; i<10000; i++)
    {
   
     print_n(i);
delay_ms(50); //ВОТ ТУТ! ЕСЛИ УБРАТЬ ЗАДЕРЖКУ ВСЕ НОРМ!

     
     }
    }


Схемы нет, все на макетке.. Если поможет.
Индикаторы с общим анодом, сегменты подключены так:
C0 b
C1 a
C2 f
C3 c
C4 d
C5 e
D7 g

Аноды соответственно:
A4
A5
A6
A7

Код: Выделить всёРазвернуть
    #include <mega16.h> //Âêëþ÷àåì áèáëèîòåêó äëÿ ðàáîòû ñ ìèêðîêîíòðîëëåðîì ATMega16

    #include <delay.h> //Âêëþ÷àåì áèáëèîòåêó äëÿ îðãàíèçàöèè çàäåðæåê

    int i,a, x1,x10, disp;

     
     unsigned char segment[10]= {   
     // gedcfab    gedcfab   
      0b1000000, 0b1110110, //0,1
      0b0001100, 0b0100100, //2,3
      0b0110010, 0b0100001, //4,5
      0b0000001, 0b1110100, //6,7
      0b0000000, 0b0100000  //8,9
     };
     
     

     void cifra(int z)

    PORTC=0xFF;          // Ïîäòÿíóòü ïîðò C  ê 1
    PORTD=0xFF;          //  Ïîäòÿíóòü ïîðò D ê 1   
    PORTC = segment[z];
    PORTD.7 = PORTC.6;
    delay_ms(1);

}
   
   void print_n(int n)
{   

   PORTA.4 = 1;PORTA.5 = 0;PORTA.6 = 0;PORTA.7 = 0; cifra(n%10); n = n/10;
   PORTA.4 = 0;PORTA.5 = 1;PORTA.6 = 0;PORTA.7 = 0; cifra(n%10); n = n/10;
   PORTA.4 = 0;PORTA.5 = 0;PORTA.6 = 1;PORTA.7 = 0; cifra(n%10); n = n/10;
   PORTA.4 = 0;PORTA.5 = 0;PORTA.6 = 0;PORTA.7 = 1; cifra(n%10);
}
   
   void initialization()
   {
       DDRD=0xFF;         // Âñå ïîðòû D - âûõîäû 
    DDRC=0xFF;         // Âñå ïîðòû C - âûõîäû     
    DDRA=0xFF;         // Âñå ïîðòû A - âûõîäû
   
    PORTA=0x00;          // Ïîäòÿíóòü ïîðò A ê 0
    PORTC=0xFF;          // Ïîäòÿíóòü ïîðò C  ê 1
    PORTD=0xFF;          //  Ïîäòÿíóòü ïîðò D ê 1
   }
   
    void print()
    {     
    for (i=1; i<10000; i++)
    {
   
     print_n(i);
delay_ms(50); //ВОТ ТУТ! ЕСЛИ УБРАТЬ ЗАДЕРЖКУ ВСЕ НОРМ!

     
     }
    }

    void main(void)       
{

    initialization();
    while(1)
    {   
    print();
     
   
   
     }
     
    } 
   


Re: Семисегментный светодиодный индикатор

Romikgy » 18 июл 2011, 23:41

тогда зачем те эта задержка ?

Re: Семисегментный светодиодный индикатор

rig » 20 июл 2011, 19:03

в прерывание надо вывод засунуть тогда голова не будет болеть когда и что выводить. и мерцать не будет. частоту любую можно выставить.

Добавлено спустя 1 минуту 6 секунд:
я вроде уже когдато тут выкладывал примеры с работы индикатором.


Rambler\'s Top100 Mail.ru counter