Страница 2 из 2

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

Добавлено: Вс окт 19, 2014 10:19:17
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;
	};
}
}


Подскажите пожалуста что мне нужно добавить или поменять в этом коде чтобы светодиоды переключались при нажатии кнопки так: первый загорелся ,потом первый потух - второй загорелся,третий загорелся второй потух и так поочереди

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

Добавлено: Вс окт 19, 2014 10:59:06
pyzhman

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

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

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

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

switch(data)

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

Добавлено: Вс окт 19, 2014 11:30:03
sirha
pyzhman писал(а):

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



 switch(data)
Спасибо :),скажите а как через switch(data)?

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

Добавлено: Вс окт 19, 2014 12:14:35
pyzhman

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

switch(data)
{
case 0:
    dataC= 0x01;
    break;
case 1:
    dataC= 0x02;
    break;
// и т.д.
}

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

Добавлено: Вс окт 19, 2014 13:18:18
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};
не понимаю :(