у меня вопрос по Си как понять эти символы << - это вроде смещение влево а это >> а это вправо, просто не могу понять их работу.
их вроде можно записать по другому?
пример:
while ((PIND&(1 << PD0)) == 1){}
PORTB &= ~(1 << PB0);
весь код:
http://www.radioparty.ru/index.php/prog ... 29-lesson3
вопрос по СИ?
Модератор: boogyman
Re: вопрос по СИ?
По другому это как?
Re: вопрос по СИ?
Можно, например так:
while ((PIND&(0х01)) == 1){}
или так
while ((PIND&(0b00000001)) == 1){}
while ((PIND&(0х01)) == 1){}
или так
while ((PIND&(0b00000001)) == 1){}
Re: вопрос по СИ?
доброго времени суток тут опять ковыряюсь с Си, много насмотрелся много начитался решил попрактиковаться и понял что ниче не понимаю)) к делу
в общем поставил задачу при нажатии кнопки выводить надпись на дисплей on off, с нуля естественно ничего написать не получиться взял код для дисплея проверил работает надписи выводит и код из первого задания этого сайта. в теории казалось что ничего сложного нет, как только принялся за дело то понял что и слова связать не могу. Прошу помощи! обьясните доходчиво как и что(на этих двух кусках кода) чувствую что осталось чуть чуть для того чтобы понять как это работает)
в общем поставил задачу при нажатии кнопки выводить надпись на дисплей 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: вопрос по СИ?
Код: Выделить всё
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');
}