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

вопрос по СИ?

Добавлено: 30 июл 2012, 23:23
mastech
у меня вопрос по Си как понять эти символы << - это вроде смещение влево а это >> а это вправо, просто не могу понять их работу.

их вроде можно записать по другому?

пример:

while ((PIND&(1 << PD0)) == 1){}

PORTB &= ~(1 << PB0);

весь код:
http://www.radioparty.ru/index.php/prog ... 29-lesson3

Re: вопрос по СИ?

Добавлено: 31 июл 2012, 22:03
boogyman
По другому это как?

Re: вопрос по СИ?

Добавлено: 14 сен 2013, 21:50
Dr_Alex
Можно, например так:

while ((PIND&(0х01)) == 1){}

или так

while ((PIND&(0b00000001)) == 1){}

Re: вопрос по СИ?

Добавлено: 18 дек 2013, 03:29
mastech
доброго времени суток тут опять ковыряюсь с Си, много насмотрелся много начитался решил попрактиковаться и понял что ниче не понимаю)) к делу
в общем поставил задачу при нажатии кнопки выводить надпись на дисплей on off, с нуля естественно ничего написать не получиться взял код для дисплея проверил работает надписи выводит и код из первого задания этого сайта. в теории казалось что ничего сложного нет, как только принялся за дело то понял что и слова связать не могу. Прошу помощи! обьясните доходчиво как и что(на этих двух кусках кода) чувствую что осталось чуть чуть для того чтобы понять как это работает)

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

#include <avr/io.h>

int main (void)
{
DDRD = 0x00; //порт D - вход
PORTD = 0xFF; //подключаем нагрузочный резистор
DDRB = 0xFF; //порт B - выход
PORTB = 0x00; //устанавливаем 0 на выходе
 
while(1)
{
PORTB = ~PIND; //~ знак поразрядного инвертирования
}
}

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

#include <avr/io.h> //библиотека ввода/вывода
#include <util/delay.h>

#define RS 2 //RS=PD2 - сигнал управления ЖКИ
#define E 3 //E=PD3 - сигнал управления ЖКИ



//Программа передачи команд в ЖКИ
void lcd_com (unsigned char lcd)
{ unsigned char temp;

temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда
PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E
PORTD=temp&~(1<<E); //Сигнал записи команды

temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда
PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E
PORTD=temp&~(1<<E); //Сигнал записи команды

_delay_us(111); //Пауза для выполнения команды
}

//Программа записи данных в ЖКИ
void lcd_dat (unsigned char lcd)
{ unsigned char temp;

temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные
PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E
PORTD=temp&~(1<<E); //Сигнал записи данных

temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные
PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E
PORTD=temp&~(1<<E); //Сигнал записи данных

_delay_us(100); //Пауза для вывода данных
}

//Программа иниализации ЖКИ
void lcd_init (void)
{
lcd_com(0x2c); // шина 4 бит, LCD - 2 строки
_delay_us(100);
lcd_com(0x0c); // включение дисплея дисплея, мигающий курсор
_delay_us(100);
lcd_com(0x06); // очистка дисплея
_delay_us(100);

}


//Основная программа
int main()
{
DDRD=0xfc; //Инициализация portD
PORTD=0x00;

_delay_us(100); //Задержка, чтобы ЖКИ успел включиться
lcd_init(); //Инициализация ЖКИ



lcd_com(0x80); //курсор в начало первой строки

lcd_dat('H'); //Вывод "хд44780"
lcd_dat('D');
lcd_dat('4');
lcd_dat('4');
lcd_dat('7');
lcd_dat('8');
lcd_dat('0');



lcd_com(0xc0); //Ставим курсор на начало 2-й строки ЖКИ

lcd_dat('W'); //Записываем "винстар"
lcd_dat('I');
lcd_dat('N');
lcd_dat('S');
lcd_dat('T');
lcd_dat('A');
lcd_dat('R');
lcd_dat(' ');
lcd_dat('L');
lcd_dat('C');
lcd_dat('D');
lcd_dat(')');
lcd_dat(')');
lcd_dat(')');



while(1) //бесконечный цикл

return 1;
}

Re: вопрос по СИ?

Добавлено: 18 дек 2013, 19:41
boogyman

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

char temp = 0;

if((PIND & (1 << PD0)) == 0) // Если нажата кнопка
{
while((PIND & (1 << PD0)) == 0){} // Ждем отпускания кнопки
temp++;
if(temp > 2)
temp = 0;
}

if(temp == 1)
{
lcd_com(0x01); // Очищаем дисплей
lcd_com(0x80); //курсор в начало первой строки
lcd_dat('o');
lcd_dat('n');
}

if(temp == 2)
{
lcd_com(0x01); // Очищаем дисплей
lcd_com(0x80); //курсор в начало первой строки
lcd_dat('o');
lcd_dat('f');
lcd_dat('f');
}