Глазки как у колонки Алиса на семисегментном индикаторе

Код написан на языке С в бесплатной программе MPLab X 5.35 для pic16f877а
Сделаем анимацию глазок как у умных колонок!
Сначала с кнопкой смены анимации, а потом без кнопки. Также буду корректировать анимацию по мере улучшения наглядности – смотрите видео и скачивайте код понравившейся анимации.

Схема соединения всё та же, как и при создании казино (микроник.рус/7799/):

Код на Си с кнопкой (кнопку лучше зажимать, пока не смениться анимация):

#include <xc.h>
  
#define _XTAL_FREQ 20000000 //Specify the XTAL crystal FREQ 
  
// Configuration Byte
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF   
 
 
void main() //The main function
{
TRISC = 0b10000000; //knopka na RC7
TRISA = 0b00000000; //Minusa na razradi
TRISB = 0b00000000; //cifri
PORTC = 0b10000000; //knopka na RC7
PORTA = 0b00000000; //Minusa na pozicii
PORTB = 0b00000000; //cifri vivod
 
 
int m = 0;
int p = 0;  //pozicii cifr
int k = 0;  //kakaya cifra
int k2 = 0;  //kakaya cifra
int k3 = 0;  //kakaya cifra
int k4 = 0;  //kakaya cifra


 // Первая анимация ----------------------------------------------------------
 
    while(p==0)
    {
        for (m = 0; m <= 125; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01000111; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01000111; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 30; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        if (PORTCbits.RC7==0)
            {
                 p=1;
                 
                 __delay_ms(100);
                 goto label1;
                 
                  
            }
        
    }  

    label1:
    __delay_ms(100);
    PORTCbits.RC7=1;
    __delay_ms(100);
 
 // Вторая анимация --------------------------------------------------

    while(p==1)
        {
        for (m = 0; m <= 125; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01000111; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01000111; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 60; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000011; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000110; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        if (PORTCbits.RC7==0)
            {
                 p=2;
                 
                 __delay_ms(100);
                 goto label1;
                 
                  
            }
        
        

    }
    
    label2:
    __delay_ms(100);
    PORTCbits.RC7=1;
    __delay_ms(100);
 
 // Третья анимация ---------------------------------------------------
    
    while(p==2)
        {
        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b01000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        for (m = 0; m <= 15; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00000000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b01000000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b00000000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00000000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        if (PORTCbits.RC7==0)
            {
                 p=3;
                 
                 __delay_ms(100);
                 goto label3;
                 
                  
            }
        
        
    }
    
    label3:
    __delay_ms(100);
    PORTCbits.RC7=1;
    __delay_ms(100);
 

// Четвёртая анимация ---------------------------------------------------
 
    while(p==3)
    {
        for (m = 0; m <= 25; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01010000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00010000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01010000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01010010; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 25; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01010000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00010000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01010010; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01010000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 25; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01010000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b00010000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01010000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b00010000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 25; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b00010000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b01010000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01010010; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01010000; //1 na pozicii 4
        __delay_ms(4);
                    
        }
        
        for (m = 0; m <= 25; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01010000; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b01010010; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01010000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01010000; //1 na pozicii 4
        __delay_ms(4);
        }
        
        for (m = 0; m <= 25; ++m)
        { 
        PORTA = 0b00000001; //minus na pozicii 1
        PORTB = 0b01010010; //- na pozicii 1
        __delay_ms(4); 
        PORTA = 0b00000010; //minus na pozicii 2
        PORTB = 0b01010000; //- na pozicii 2
        __delay_ms(4); 
        PORTA = 0b00000100; //minus na pozicii 3
        PORTB = 0b01010000; //- na pozicii 3
        __delay_ms(4); 
        PORTA = 0b00001000; //minus na pozicii 4
        PORTB = 0b01010010; //1 na pozicii 4
        __delay_ms(4);
        }
   
    }  
    
}

Скачать код на Си и hex файл:
– скачать в zip архиве.
– скачать в tar.gz архиве.

————————————————————-
Код без кнопок – анимация сменяет друг друга поочерёдно
—————————————————————————————————-

Поменял анимацию, особенно последнюю, но тоже не идеально…

Скачать код на Си и hex файл:
– скачать в zip архиве.
– скачать в tar.gz архиве.

Видео:

Добавить комментарий