реклама на сайте
подробности

 
 
> 4 битный режим ЖК, ничего не выходит
Hellka
сообщение Oct 2 2006, 11:09
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 2-10-06
Пользователь №: 20 895



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

Код
#include
#include //Для ф-ции
#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,0x28); //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);

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andy_F
сообщение Oct 5 2006, 05:48
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Вот так, например, можно:

Код
#ifndef _HD44780_H_
#define _HD44780_H_

#define    RS        PORTB_Bit7                // RC4 is RS line of LCD
#define    E        PORTB_Bit6                // RC5 is E line of LCD
#define LCD_DATA    PORTD            // RB0-RB3 are D4-D7 of LCD
#define DISP_ON        0x00C            // Display on
#define CLR_DISP    0x001            // Clear the Display (команда требует задержки на 5 mS)
#define ENTRY_INC    0x006            //
#define LINE1        0x080            // Начало первой линии
#define LINE2        0x0C0            // Начало второй линии
#define CGRAM        0x040            // CGRAM (0-ой переопределяемый символ)

void send_ins(char data);
void send_char(char data);
void init_LCD(void);
int putchar(int data);

#endif  //_HD44780_H_


Код
#include <ioavr.h>
#include <ina90.h>
#include "delay.h"
#include "HD44780.h"

//**************************************************************************
//           Send the nibble of 'data' out to the LCD                      *
//**************************************************************************
void nybble_out(char data)
{
  LCD_DATA = (data & 0x0F) | (LCD_DATA & 0xF0);    
  E = 1;
  _NOP();
  E = 0;
  delay_us(250);                // Задержка 250 uS    
}

//**************************************************************************
//                    Send an instruction out to the LCD                   *
//**************************************************************************
void send_ins(char data)                        
{
  RS = 0;
  _NOP();
  nybble_out(data >> 4);
  nybble_out(data);
}

//**************************************************************************
//                    Send the character out to the LCD                    *
//**************************************************************************
void send_char(char data)
//int putchar(int data)
{
  RS = 1;
  _NOP();
  nybble_out(data >> 4);
  nybble_out(data);
}

//**************************************************************************
//                       Initialize the LCD                                *
//**************************************************************************
void init_LCD(void)
{
  delay_ms(40);                // Задержка 40 mS
  RS = 0;
  nybble_out(0x03);    
  delay_ms(5);                // Задержка 5 mS
  nybble_out(0x02);    
  delay_us(250);                // Задержка 250 uS    
  send_ins(0x28);                // 4 bit, 2 Line, 5x7 font    
  send_ins(0x10);                // display shift off
  send_ins(CLR_DISP);            // Clear the Display RAM
  delay_ms(5);                // Задержка 5 mS
  send_ins(ENTRY_INC);            // increment cursor
  send_ins(0x0C);                // display on cursor off

  send_ins(LINE1);
}

int putchar(int data)
{
  send_char((unsigned char)data);
  return data;
}


А потом printf'ами, printf'ами ... smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 5 2006, 16:01
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Andy_F @ Oct 5 2006, 08:48) *
Вот так, например, можно:

Согласен, но совсем красиво будет так:

Код
void init_LCD(void)
{
  delay_ms(40);                // Задержка 40 mS
  RS = 0;
  nybble_out(0x03);    
  delay_ms(5);                // Задержка 5 mS
  nybble_out(0x03);    
  delay_ms(5);                // Задержка 5 mS
  nybble_out(0x03);    
  delay_ms(5);                // Задержка 5 mS
  nybble_out(0x02);    
  delay_us(250);                // Задержка 250 uS    
  .........

вот объяснение: http://electronix.ru/forum/index.php?s=&am...st&p=143374


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Hellka   4 битный режим ЖК   Oct 2 2006, 11:09
- - sff   Цитата(Hellka @ Oct 2 2006, 15:09) инициа...   Oct 2 2006, 11:50
|- - Hellka   Цитата(sff @ Oct 2 2006, 14:50) Цитата(He...   Oct 2 2006, 12:03
|- - sff   Цитата(Hellka @ Oct 2 2006, 16:03) [code]...   Oct 2 2006, 12:26
- - Dog Pawlowa   Задержки правильно считаются? void ShortDelay(vo...   Oct 2 2006, 12:11
- - Hellka   данные на PA0-PA7, но так как 4битный режим то пер...   Oct 2 2006, 12:34
|- - sff   Цитата(Hellka @ Oct 2 2006, 16:31) данные...   Oct 2 2006, 12:35
- - Hellka   а в передаче данных\команд всё так и оставить...   Oct 2 2006, 12:52
- - prottoss   в http://electronix.ru/forum/index.php?showtopic=1...   Oct 2 2006, 19:23
|- - Igor26   Цитата(prottoss @ Oct 2 2006, 23:23) в ht...   Oct 3 2006, 05:13
- - SasaVitebsk   А вот документ сам пользовался.   Oct 3 2006, 07:40
- - Hellka   народ как си кодом поменять местами старшую и млад...   Oct 4 2006, 09:52
|- - prottoss   Цитата(Hellka @ Oct 4 2006, 17:52) народ ...   Oct 4 2006, 10:11
|- - SasaVitebsk   Цитата(prottoss @ Oct 4 2006, 13:11) Цита...   Oct 4 2006, 10:41
- - ps1x   Ну так заработал дисплей? Есть одна версия - если ...   Oct 4 2006, 23:41
- - Andy_F   Цитата(Сергей Борщ @ Oct 5 2006, 20:01) С...   Oct 5 2006, 20:38


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016