Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 02.10.2006, 14:19  
Hellka
Частый гость
 
Регистрация: 02.10.2006
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Hellka на пути к лучшему
По умолчанию 4-битный режим LCD при работе с Atmega 128

привет, никак не получается вывести хоть что-то на ЖК в 4битном режиме, вроде всё правильно написал...
по идее первоначально ЖК стоит в 8битном режиме, т.е. для инициализация сначала использую функцию для 8битного режима, а затем уже для 4битного....
инициализация нормально проходит, т.е. в 4битныйрежим переходит, а вот данные не выдает, у меня подозрение на функцию передачи в 4битном режиме rs_data, уже всё перепробовал - ничего не выходит =(
кидаю текст программы, посмотрите плиз...
ЖК - HD44780U

#include ‹iom128.h›
#include ‹inavr.h›//Для ф-ции
#include ‹comp_a90.h›

#define CPU_FREQ 2450000//2.450 МГц
#define SOUND_WAIT 10000

unsigned char temp;
unsigned char send_tmp1;
unsigned char send_tmp2;

unsigned char temp1;
unsigned char temp2;

void LCD_initialization(void);
void put_char_to_LCD(char,char,char);
void clear_display(void);
char rs_data(char,char,char);


void print_time_to_LCD(void);
char rs_data_bit(char,char,char);

void main(void)
{
WDTCR=(1‹‹WDCE)|(1‹‹WDE);//сброс
WDTCR=0x00;
DDRB=0xFF; //Регистр направления PORTB - все на вывод
PORTB|=(1‹‹PB4);//вкл. свет
SFIOR|=(1‹‹PUD);//Запрет pull-up resisitors на всех портах
TCCR1A=0x00; //запрет на signal override portb
SREG&=~0x80; //запрет прерываний устанавливаеться 7 бит регистра "1"
_WDR(); // reset watch dog taimer
LCD_initialization();
clear_display();
while(1)
{WDTCR=(1‹‹WDCE)|(1‹‹WDE);//сброс
WDTCR=0x00;
print_time_to_LCD();
//__watchdog_reset();
PORTB&=~(1‹‹PORTB5); //пищим
__delay_cycles(SOUND_WAIT);//ждем ввода новой информации на LCD
PORTB&=~(1‹‹PORTB5); //не пищим
}
}
char rs_data_bit(char rs,char rw,char data)//ф-ция передачи команды/данных на ЛСД 8 бит
{
_WDR();
send_tmp1=DDRA; //записываем состояние портов А
send_tmp2=PORTC; //записываем состояние портов С
DDRC|=7; //3 младших бита PORTC на вывод
DDRA=0x00; // А на ввод
PORTC&=0xf8; //pc0 - pc2=0
PORTC|=(1‹‹PORTC1); //R/W -› "1"
do //Проверка занятости LCD
{
_WDR();
PORTC|=(1‹‹PORTC2); //E -› UP
__delay_cycles(0.00000045*CPU_FREQ);//450 нс, чтобы успело сработать по докум. 1.1025
temp=PINA; //выводы А считали в temp
PORTC&=~(1‹‹PORTC2); //E -› DOWN
}
while(temp&0x80); //маскируем старший бит - флаг BF(=0, когда LCD свободен)
PORTC&=0xf8; //pc0 - pc2=0
if(rs)
PORTC|=(1‹‹PC0); //если RS=1 то записываем данные,если нет от RS так и остаеться 0, тоесть идет запись комманд
DDRA=0xff; //PORTA на вывод
PORTA=data; //выводимая информация
PORTC|=(1‹‹PORTC2); //E-›1
__delay_cycles(0.00000045*CPU_FREQ);
PORTC&=~(1‹‹PORTC2);//E-›0
temp=0;
DDRA=send_tmp1; //обнуление портов
PORTC=send_tmp2;
_WDR();
return(temp);
}


char rs_data(char rs,char rw,char data)//ф-ция передачи данных/команд на ЛСД 4бита
{
_WDR();
send_tmp1=DDRA; //записываем состояние портов А
send_tmp2=PORTC; //записываем состояние портов С
DDRC|=7; //3 младших бита PORTC на вывод
DDRA=0x00; // А на ввод
PORTC&=0xf8; //pc0 - pc2=0
PORTC|=(1‹‹PORTC1); //R/W -› "1"
do //Проверка занятости LCD
{
_WDR();
PORTC|=(1‹‹PORTC2); //E -› UP
__delay_cycles(0.00000045*CPU_FREQ);//450 нс, чтобы успело сработать по докум. 1.1025

temp1=(PINA & 0xf0); //выводы А считали в temp
__delay_cycles(0.00000045*CPU_FREQ);//450 нс, чтобы успело сработать по докум. 1.1025
PORTC&=~(1‹‹PORTC2); //E -› DOWN
__delay_cycles(0.00000045*CPU_FREQ);//450 нс, чтобы успело сработать по докум. 1.1025
PORTC|=(1‹‹PORTC2); //E -› UP
temp2=((PINA‹‹4) & 0xf0);
__delay_cycles(0.00000045*CPU_FREQ);//450 нс, чтобы успело сработать по докум. 1.1025
PORTC&=~(1‹‹PORTC2); //E -› DOWN
__delay_cycles(0.00000045*CPU_FREQ);//450 нс, чтобы успело сработать по докум. 1.1025
PORTC&=~(1‹‹PORTC1); //R/W -› "0"
temp=(temp1 | (temp2‹‹4));

}
while(temp&0x80); //маскируем старший бит - флаг BF(=0, когда LCD свободен)
PORTC&=0xf8; //pc0 - pc2=0
if(rs)
PORTC|=(1‹‹PC0); //если RS=1 то записываем данные,если нет от RS так и остаеться 0, тоесть идет запись комманд
DDRA=0xff; //PORTA на вывод
PORTA=(data & 0xf0); //выводимая информация
PORTC|=(1‹‹PORTC2); //E-›1
__delay_cycles(0.00000045*CPU_FREQ);
PORTC&=~(1‹‹PORTC2);//E-›0
PORTA=((data‹‹4) & 0xf0);
PORTC|=(1‹‹PORTC2); //E-›1
__delay_cycles(0.00000045*CPU_FREQ);
PORTC&=~(1‹‹PORTC2);//E-›0

temp=0;
DDRA=send_tmp1; //обнуление портов
PORTC=send_tmp2;
_WDR();
return(temp);
}






void LCD_initialization(void)
{
_WDR();
rs_data_bit(0,0,0x2; //2 строки, 4-разр. шина, инициализируем по 8битной шине, т.к. она идет по умолчанию, после установки в 4разрядную, уже работаем только с ними
rs_data(0,0,0x0C); //вкл. LCD, квадратик, (подчеркивание, то 0x0C)
rs_data(0,0,0x06); //2 строки, 4-разр. шина
}

void clear_display(void)
{
_WDR();
rs_data(0,0,1);//Очистка LCD
}

void put_char_to_LCD(char ch,char string_number,char position)
{
_WDR();
if(string_number==1)
rs_data(0,0,(position-1)|(1‹‹PA7)); //перемещает символы в первой строке по очереди начиная с 0X80
else
rs_data(0,0,(0x40+position-1)|(1‹‹PA7));//перемещает символы во второй строке по очереди начиная с 0X80
_WDR();
rs_data(1,0,ch); // передаем как данные
}

void print_time_to_LCD(void)
{
int j; //Ввод данных
put_char_to_LCD('0',1,1);
put_char_to_LCD('0',1,2);
put_char_to_LCD(':',1,3);
put_char_to_LCD('0',1,4);
put_char_to_LCD(0,1,5);

}
Реклама:
Hellka вне форума  
Непрочитано 02.10.2006, 14:23  
avr123-nm-ru
Почётный гражданин KAZUS.RU
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

проверьте в VMLAB
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
avr123-nm-ru вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ЖКИ и CodeVision: 8-ми битный режим vikpol Микроконтроллеры, АЦП, память и т.д 33 09.03.2009 21:55
Режим реального времени в микроконтроллерах ATMega alex28411 Микроконтроллеры, АЦП, память и т.д 5 07.04.2008 01:26
Применение LCD 128 х 64 KOKAinOFF Микроконтроллеры, АЦП, память и т.д 3 10.08.2007 11:31
загрузка CPU при работе PROTEUS dimonbest Proteus 48 25.05.2007 20:30
AVRSTUDIO ATmega 48 \128\ 88 Tcom Микроконтроллеры, АЦП, память и т.д 1 13.10.2005 16:12


Часовой пояс GMT +4, время: 16:34.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot