Перейти к содержанию

Ввод-Вывод


Dzusan

Рекомендуемые сообщения

Есть проблема.

Написал прошивку под ATmega16, которая считывает матричную клаву 4Х4 и выводит на ЖКИ. Готовых библиотек конечно много, но мне в них не хватало функций удаления элемента и очистки экрана, а также простоты. Все отлично работает, контроллер считывает и выводит. НО. Я сделал возможность окончания вводаи записи и записи и фиксирования введенных данных. Вот она как раз и не работает.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>

#define RS 6		//RS=PD6 управляющий сигнал ЖКИ
#define E  7		//E=PD7  управляющий сигнал ЖКИ

#define F_CPU 16000000
#include <util/delay.h>

unsigned char matrix[4][4]={{'*','0','#','D'},
                           {'7','8','9','C'},
                           {'4','5','6','B'},
                           {'1','2','3','A'}};

char current_counter=0;
char current[10];
char parameter=0;

//Обмен с ЖКИ
void transfer (unsigned char lcd)
{
PORTD |= (1<<E);
 PORTB = (lcd>>4);                	//Выводим старшую тетраду команды
 _delay_us(1);                	//Задержка
 PORTD &=~(1<<E);        	//Сигнал записи команды
 _delay_us(1);
 PORTD |= (1<<E);
 PORTB = (lcd&0x0F);                       //Выводим младшую тетраду команды
 _delay_us(1);                       //Задержка
 PORTD &=~(1<<E);               //Сигнал записи команды

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


//Передача команд в ЖКИ
void lcd_com (unsigned char lcd)
{
 PORTD &=~(1<<RS);		//RS=0 – это команда
 transfer(lcd);
}


//Запись данных в ЖКИ
void lcd_dat (unsigned char lcd)
{
 PORTD =(1<<RS);		//RS=1 – это данные
 transfer(lcd);
}

//Инициализация ЖКИ
void lcd_init (void)
{
 lcd_com(0x28);   //4-проводный интерфейс, 5x8 размер символа
_delay_ms(5);
lcd_com(0x0C);		//Показать изображение, курсор не показывать
_delay_ms(5);
lcd_com(0x01);		//Очистить DDRAM и установить курсор на 0x00
_delay_ms(5);
}


//Запись строки
void output (char *str)
{
int size=strlen(str);
for (int i=0; i<size; i++) lcd_dat(str[i]);
}


//Запись текущей строки
void out_current (void)
{
lcd_com(0xA9);
if (current_counter!=0)
   for(char i=0; i<current_counter; i++) lcd_dat(current[i]);
for(char i=current_counter; i<11; i++) lcd_dat(' ');
}



int main (void)
{
//LCD
DDRB=0x0F;
DDRD=0xC0;
_delay_ms(50);
lcd_init();

//Keyboard
TIMSK=1<<TOIE0;
   TCCR0=1<<CS00 | 1<<CS02;

sei();
while(parameter==0) _delay_us(1); //Вот здесь и виснет...
cli();

output("Fuckin working!");
_delay_ms(5000);
}


ISR (TIMER0_OVF_vect)
{
DDRC=0xC3;
   PORTC=0;
   DDRA=0;
   PORTA=0xF0;
   _delay_ms(1);
   unsigned char k=4;
   if ((PINA&0x10)==0) k=0;
   if ((PINA&0x20)==0) k=1;
   if ((PINA&0x40)==0) k=2;
   if ((PINA&0x80)==0) k=3;

   DDRC=0;
   PORTC=0xC3;
   DDRA=0xF0;
   PORTA=0;
   _delay_ms(1);
   unsigned char i=4;
   if ((PINC&0x01)==0) i=0;
   if ((PINC&0x02)==0) i=1;
   if ((PINC&0x40)==0) i=2;
   if ((PINC&0x80)==0) i=3;



   if ((i!=4)&&(k!=4))
   {
       while(PINC!=0xC3) _delay_us(1);

       if ((matrix[i][k]>='0')&&(matrix[i][k]<='9')) //Запись введенной цифры
	{
		current[current_counter]=matrix[i][k];
		if (current_counter<10) current_counter++;
	}

       if (matrix[i][k]=='D') if (current_counter>0) current_counter--; //Удаление последнего элемента
       if (matrix[i][k]=='C') current_counter=0; //Очистка
       if (matrix[i][k]=='A') parameter=1; //Выход... Который и не пашет((
       out_current(); //Вывод полученной строки
   }
}

Это конечно только модуль программы. Код нехитрый, думаю все будет понятно.

Кароче. Есть глобальная переменная parameter=0, в программе основной цикл while проверяет равенство нулю и если оно выполнено, то проверяет еще, и так до тех пор, пока при нажатии "А" parameter не поменяется на "1". Тогда по идее цикл прекращается и идет что дальше. Но не тут то было (( при нажатии "А" ничего не происходит, вообще ничего. Можно дальше играться с вводом-выводом.

Не могу понять, что за дела! Помогите пожалуйста!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

эмм ну вообщем я могу и ошибаться... но глобальные переменные, особенно которые могут поменяться в любое время и которые проверяются в разных местах необходимо объявлять с квалификатором volatile, т.е. volatile char parameter=0; и т.д.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...