Тема: [avr, proteus, C] Світлофор з зворотнім відліком
▼Передмова
Один пан сьогодні питав мене про цей світлофор, я подумав - нехай всім буде.
Опис. Простенький світлофор в Proteus симуляції, але з зворотнім відліком. В якості контроллера ATMega16. В якості індикаторів 7-ми сегментні індикатори різних кольорів. Ну для самого світлофора - діоди трьох кольорів.
Проект древній, 14-го року, написаний на С, у avrStudio (чи як вона там зараз називається).
Якщо кнопка нажата, світлофор в режимі "ніч" (блимає жовтий).
▼PrintScreen
▼Демонстрація роботи (відео)
В прикріпленнях проект в Протеусі.
▼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