Примеры CodeVisionAVR - Кнопки & светодиоды

Автор: Internet. Posted in Початківцям з CV AVR

Зміст статті

Небольшие примеры, как помигать светодиодом с помощью кнопки, вот тут  несколько вариантов.....

Смотрим в протеусе, нажимаем на кнопку (можно кое-где и придержать её), смотрим как реагирует светодиод, ..... если интересно как это заработало, смотрим в код, вносим изменения, редактируем, комплимируем. .....

Code
/*****************************************************
Version : Кнопки и светодиоды 
Company : c2.at.ua 
Chip type : ATmega8
Clock frequency : 4,000000 MHz
*****************************************************/ 
#include <mega8.h> // библиотека ввода вывода микроконтроллера
#include <delay.h> // библиотека задержки
unsigned char kR, temp; // обьявляем переменные
void main(void) // Declare your global variables here

PORTB=0b11111111; // Port B initialization
DDRB=0b00000000; 
PORTC=0b01000000; // Port C initialization
DDRC=0b00111111;
PORTD=0b00000000; // Port D initialization
DDRD=0b111111111;

while(1) // бесконечный цикл 
{
PORTD.0=~PINB.0; // =======№1 Упр. 1 порт 1 кнопка 

if (PINB.1==0) // ==== №2 кнопка

PORTD.1=1;
delay_ms(600);
PORTD.1=0;
delay_ms(300); 

if (PINB.2==0) // ==== №3 кнопка

PORTD ^= 1<<2;
delay_ms(500); 

if (PINB.3==0) // ==== №4 кнопка

PORTD.3= 1;
delay_ms(5000); 
PORTD.3= 0; 

if (PINB.4==0 && kR!=1) // === №5 кнопка

delay_ms(10); // 10мс для "анти-дребезга"
PORTD.4 = ~PORTD.4;
kR = 1; //
}
if (PINB.5==0 && kR!=1)

delay_ms(10); // 10мс для "анти-дребезга"
PORTD.5 = ~PORTD.5;
kR = 1;
}
if (PINB.4==1 && PINB.5==1)
{
kR = 0;

//========== №6 МИГАЛКА 
while (PINB.6==0) // проверяем если кнопка нажата (замкнута), то выполняем цикл мигалки
{
PORTD.6=1; // зажигаем красный светодиод
delay_ms(200); //ждем 100 миллисекунд
PORTD.6=0; //гасим его
delay_ms(200); //ждем 100 миллисекунд
PORTD.6=1; //зажигаем
delay_ms(200); //ждем
PORTD.6=0; //гасим
PORTD.7=1; //зажигаем синий светодиод
delay_ms(200); //ждем
PORTD.7=0; //гасим
delay_ms(200); //ждем
PORTD.7=1; //зажигаем
delay_ms(200); //ждем
PORTD.7=0; //гасим
} // как только отпустим кнопку программа дойдет до конца цикла
// и будет ждать пока не нажмем заново 

//========== №-7 Переключаем по кольцу
if (PINB.7==0){ //если кнопка нажата выполнить следующее
delay_ms(100);
if (PINB.7==0){
temp++;
if(temp==6) { 
temp=0;
}
while (PINB.7==0); // ждем пока кнопка будет отжата
}
}

if (temp==0) { // если темп равен 0 вывести в порт следующее 
PORTC=0b00000001; 
delay_ms(10); 

if (temp==1) { 
PORTC=0b00000010; 
delay_ms(10); 
}
if (temp==2) { 
PORTC=0b00000100;
delay_ms(10); 
}
if (temp==3) { 
PORTC=0b00001000;
delay_ms(10); 
}
if (temp==4) { 
PORTC=0b00010000;
delay_ms(10); 
}
if (temp==5) { 
PORTC=0b00100000;
delay_ms(10); 
}
}; // закрываем бесконечный цикл

Скачать архив проекта; исходный код, прошивка,  proteus.

Остается только добавить что в железе реакция светодиодов  на кнопки 100% соответствует работе схемы в   proteus'е.  

Небольшая программа с управлением кнопками, результат   управления кнопок можно сохранять в eeprom.


Code
/*****************************************************
Version : Кнопки и led знак, .. пишем в flash-память. 
Company : c2.at.ua 
Chip type : ATmega8
Clock frequency : 4,000000 MHz
*****************************************************/ 
#include <mega8.h>
#include <delay.h>

flash unsigned char led[11]={ 
0b10000000,
0b00000110, 0b01011011,
0b01001111, 0b01100110,
0b01101101, 0b01111101,
0b00000111, 0b01111111, 
0b01101111, 0b00111111}; // Массив "led" во flash-памяти,
eeprom unsigned char eep;
unsigned char i,a; // переменная 
void main(void)
{
PORTB=0b11111111; // Port B initialization
DDRB=0b00000000; 
PORTC=0b01000000; // Port C initialization
DDRC=0b00111111;
PORTD=0b00000000; // Port D initialization
DDRD=0b011111111;
a=eep;
start:
while (1)
{
if (a==11) a=1;
if (a==0) a=10;
i=a;
PORTD=led[i];
delay_ms(400);
if (PINB.0==0) {a++; goto start;} 
if (PINB.1==0) {a--; goto start;}
if (PINB.2==0) goto zap;
};
zap:
eep=a;
PORTD=0;
delay_ms(400);
goto start; 
  }

Скачать архив проекта; исходный код, прошивка, proteus.