1

Тема: [avr, proteus, C] Світлофор з зворотнім відліком

Передмова

Один пан сьогодні питав мене про цей світлофор, я подумав - нехай всім буде.

Опис. Простенький світлофор в Proteus симуляції, але з зворотнім відліком. В якості контроллера ATMega16. В якості індикаторів 7-ми сегментні індикатори різних кольорів. Ну для самого світлофора - діоди трьох кольорів.
Проект древній, 14-го року, написаний на С, у avrStudio (чи як вона там зараз називається).
Якщо кнопка нажата, світлофор в режимі "ніч" (блимає жовтий).

PrintScreen

http://replace.org.ua/misc.php?action=pun_attachment&item=1317&download=0

Демонстрація роботи (відео)

В прикріпленнях проект в Протеусі.

code
/*
 * Created: 06.10.2014 19:16:06
 *  Author: Chemist
 *  License: GNU GPL v3.
 */ 


#include <avr/io.h>
#include <util/delay.h>

//#include <avr/interrupt.h>


int main(void)
{

    char led[10];
    //7-seg catode digital led
    led[0] = 0b00111111;
    led[1] = 0b00000110;
    led[2] = 0b01011011;
    led[3] = 0b01001111;
    led[4] = 0b01100110;
    led[5] = 0b01101101;
    led[6] = 0b01111101;
    led[7] = 0b00000111;
    led[8] = 0b01111111;
    led[9] = 0b01101111;
    led[10] = 0b1000000; // char "-"
    
    
    //line led indicator
    /*
    led[0] = 0b00000000;
    led[1] = 0b00000001;
    led[2] = 0b00000011;
    led[3] = 0b00000111;
    led[4] = 0b00001111;
    led[5] = 0b00011111;
    led[6] = 0b00111111;
    led[7] = 0b01111111;
    led[8] = 0b11111111;
    led[9] = 0b00000000;
    */    
    
    DDRA = 0xFF; //port A = out;
    DDRD = 0xFF; //port D out
    //DDRC = 0xFF; //port D out
    DDRB = 0xFF; //port B = in;
    
    PORTA = 0x00;
    PORTD = 0x00;
    PORTB = 0xFF; //Подтяжка
    
    //unsigned char i=1;
    #define red_vert 0
    #define yellow_vert 1
    #define green_vert 2
    #define red_horz 3
    #define yellow_horz 4
    #define green_horz 5
    #define green_7seg_on_first 6 
    #define green_7seg_on_second 7 
    
    //DDRA = 0xFF;
    while(1)
    {
        
        if (!((PINB&(1 << 0))>>(0)))
        {
        //unactive (blinking yellow)
            PORTA |= 1<<green_7seg_on_first; //PDi set bit
            PORTA |= 1<<green_7seg_on_second; //PDi set bit            
            
            PORTD = ~led[10];
            //PORTC = ~led[10];
            PORTA ^= 1<<yellow_vert; //PDi invert bit
            PORTA ^= 1<<yellow_horz; //PDi invert bit
            _delay_ms(500);
        }
        else
        {
            //active mode
            PORTA = 0x00; //off all;
            
            //PORTA |= 1<<green_7seg_on_first; //PDi set bit
            PORTA |= 1<<green_7seg_on_second; //PDi set bit        
            
            PORTA ^= 1<<green_vert; //PDi invert bit
            PORTA ^= 1<<red_horz; //PDi invert bit
            
            for (char i=10; i>0; i--)
            {
                if (i<=2)
                {
                    PORTA ^= 1<<green_vert; //PDi invert bit
                    _delay_ms(500);
                    PORTA ^= 1<<green_vert; //PDi invert bit
                    _delay_ms(500);
                } 
                else
                {
                    _delay_ms(1000);
                }
                PORTD = ~led[i-1];
                //PORTC = ~led[i-1];
            }
            PORTD = ~led[10];
            //PORTC = ~led[10];
            
            PORTA ^= 1<<green_vert; //PDi invert bit
            //PORTA ^= 1<<red_horz; //PDi invert bit

            PORTA ^= 1<<yellow_vert; //PDi invert bit
            PORTA ^= 1<<yellow_horz; //PDi invert bit
            
            _delay_ms(2000);
            
            
            
            
            PORTA = 0x00; //off all;

            PORTA |= 1<<green_7seg_on_first; //PDi set bit
            //PORTA |= 1<<green_7seg_on_second; //PDi set bit        
            
            PORTA ^= 1<<green_horz; //PDi invert bit
            PORTA ^= 1<<red_vert; //PDi invert bit
            
            for (char i=10; i>0; i--)
            {
                if (i<=2)
                {
                    PORTA ^= 1<<green_horz; //PDi invert bit
                    _delay_ms(500);
                    PORTA ^= 1<<green_horz; //PDi invert bit
                    _delay_ms(500);
                } 
                else
                {
                    _delay_ms(1000);
                }
                PORTD = ~led[i-1];
                PORTC = ~led[i-1];
            }
            PORTD = ~led[10];
            PORTC = ~led[10];

            PORTA ^= 1<<green_horz; //PDi invert bit
            //PORTA ^= 1<<red_vert; //PDi invert bit

            PORTA ^= 1<<yellow_horz; //PDi invert bit
            PORTA ^= 1<<yellow_vert; //PDi invert bit
            
            _delay_ms(2000);
            
            PORTA = 0x00; //off all;        
        }
    }
}
Post's attachments

printscreen1.png 220.58 kb, 259 downloads since 2016-06-23 

svetofor.DSN 100.39 kb, 520 downloads since 2016-06-23 

Подякували: 0xDADA11C7, leofun013