регистр и светодиоды

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Код: Выделить всё

#include <tiny13.h>
#include <delay.h>

bit OldButton,Button;
unsigned char data, dataC,i;



void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


PORTB=0x10;
DDRB=0x07;


while (1)
{
// опрос кнопки с антидребезгом
delay_ms(10);
OldButton= Button;
Button= PINB.4;

if(OldButton && !Button) // нажатие кнопки
	{
	++data; // тот самый счетчик

	dataC=data; // во временную переменную  
        
	for(i= 0; i<8; i++) // восемь циклов (передача в 595-ю)
		{
		     
        
	      PORTB.1=dataC&0x01; // импульс записи 
            PORTB.0=1;
	        PORTB.0= 0;
            dataC>>=1;
	        // сдвинули переменную
		}
	PORTB.2= 1; // защелкивание данных в 595-ой
	PORTB.2= 0;
	};
}
}


Подскажите пожалуста что мне нужно добавить или поменять в этом коде чтобы светодиоды переключались при нажатии кнопки так: первый загорелся ,потом первый потух - второй загорелся,третий загорелся второй потух и так поочереди
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Код: Выделить всё

unsigned char dataF[]= {1,2,4,8,0x10,0x20,0x40,0x80}; // массив данных для управления светодиодами

...
   if(++data > 7) data= 0; // тот самый счетчик считает от 0 до 7
dataC= dataF[data];
Или через

Код: Выделить всё

switch(data)
Docendo discimus
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

pyzhman писал(а):

Код: Выделить всё



 switch(data)
Спасибо :),скажите а как через switch(data)?
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Код: Выделить всё

switch(data)
{
case 0:
    dataC= 0x01;
    break;
case 1:
    dataC= 0x02;
    break;
// и т.д.
}
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Код: Выделить всё

if(OldButton && !Button) // нажатие кнопки
	{
	++data; // тот самый счетчик

	dataC=data; // во временную переменную  
        
	for(i= 0; i<9; i++) // девять циклов (передача в 595-ю)
		{
		     
         if(++data > 8  ) data= 0; // тот самый счетчик считает от 0 до 8
          dataC= dataF[data];
	      PORTB.1=dataC&0x01; // импульс записи 
            PORTB.0=1;
	        PORTB.0= 0;
           
	        
		}

обьясните мне как работает этот код некоторые моменты не понятны


если нажата кнопка то:

во первых чему равна data???

unsigned char - 0 до 255

++data - что тут происходит ?

0,1,2,3

правильно я понил?



далее dataC приравниваем к просто data??? или ужу новую сложенную?

dataC???

dataC = 0,1,2,3 -???

Код: Выделить всё

 if(++data > 8) data= 0;
- как токо data будет больше 8 то data опять будет равна 0, но у меня светодиод не тухнет??? последний 8 горит и все

dataC= dataF[data]; - как я понил достает числа из массива??
dataC=dataF[1]
dataC=dataF[2]

и так далее

PORTB.1=dataC&0x01; смысл этого???работает как надо, просто тупо умножаю на 1? - почему я если пишу вот так PORTB.1=dataC то горят все светодиоды кроме одного???

ведь

Код: Выделить всё

unsigned char dataF[]= {0,1,2,4,8,0x10,0x20,0x40,0x80};
не понимаю :(
Реклама
Ответить

Вернуться в «AVR»