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

 
 
> hd44780, не работает экран
Dars
сообщение Feb 5 2006, 19:55
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 238
Регистрация: 11-08-05
Пользователь №: 7 557



В общем ситуация такая, всю жизнь сидел на CodeVision, а тут решил перейти на IAR. А там как оказалось нет библиотеки для ЖК, ну я взял и попытался написать простенькую прогу которая выводит букву А на экран ( 20 * 4 ), ну и нифига у меня не работает sad.gif

У кого есть библиотечка выложите пожалуйста smile.gif
Ну или ткините кто нибудь в ошибку (если вся программа не есть ошибка).

Код
#include <delay.h>
#include <iom128.h>
#include <intrinsics.h>

void DB_SET_RESET (int DB7, int DB6, int DB5, int DB4);
void LCD_PORT_INIT (void);
void LCD_INIT (void);
void LCD_PRINT (void);
void LCD_CLEAR (void);

int main( void )
{

  delay_s(2);                                                                   //Пауза
  DDRB |= (1<<4);
  PORTB |= (1<<4);                                                              // Зажгли светодиод
  
  LCD_PORT_INIT();                                                              //Установили порт С на выход
  LCD_CLEAR();                                                                  //Очистка экрана
  LCD_PRINT();                                                                  //Выводим букву А                                                                
                                                                              
  
  
  for(;;);
  return 0;
}

void DB_SET_RESET (int DB7, int DB6, int DB5, int DB4)
{
  if (DB7)
    PORTC |= (1<<7);                                                            // DB7 = 1
  else
    PORTC &= 0x7F;                                                              // DB7 = 0
  
  if (DB6)
    PORTC |= (1<<6);                                                            // DB6 = 1
  else
    PORTC &= 0xBF;                                                              // DB6 = 0
      
  if (DB5)
    PORTC |= (1<<5);                                                            // DB5 = 1
  else
    PORTC &= 0xDF;                                                              // DB5 = 0
      
  if (DB4)
    PORTC |= (1<<4);                                                            // DB4 = 1
  else
    PORTC &= 0xEF;                                                              // DB4 = 0

}

void LCD_PORT_INIT (void)
{
   /* Инициализация портов для LCD */
  DDRC |= (1<<0);                                                             //  RS
  DDRC |= (1<<1);                                                             //  RW
  DDRC |= (1<<2);                                                             //  EN
  DDRC |= (1<<4);                                                             //  DB4
  DDRC |= (1<<5);                                                             //  DB5
  DDRC |= (1<<6);                                                             //  DB6
  DDRC |= (1<<7);                                                             //  DB7
  
}

void LCD_INIT (void)
{
  PORTC = 0x30;                                                                 // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1
  
  delay_ms(5);
  
  PORTC = 0x30;                                                                 // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1
  
  delay_us(100);
  
  PORTC = 0x30;                                                                  // RS=0,R/W=0,E=0, DB7=0, DB6=0, DB5=1, DB4=1
  
  delay_us(100);
  
  DB_SET_RESET(0,0,1,0);                                                        // Установка 4 битного режима DB7=0, DB6=0, DB5=1, DB4=0
  delay_ms(2);
  
  DB_SET_RESET(0,0,1,0);                                                        //Установка параметров DB7=0, DB6=0, DB5=1, DB4=0
  delay_ms(2);
  DB_SET_RESET(1,0,0,0);                                                         //DB7=1, DB6=0, DB5=0, DB4=0
  delay_ms(2);
  
  DB_SET_RESET(0,0,0,0);                                                         //Включение дисплея  DB7=0, DB6=0, DB5=0, DB4=0
  delay_ms(2);
  DB_SET_RESET(1,0,0,0);                                                         //DB7=1, DB6=0, DB5=0, DB4=0
  delay_ms(2);
  
  DB_SET_RESET(0,0,0,0);                                                         //Очистка дисплея DB7=0, DB6=0, DB5=0, DB4=0
  delay_ms(2);
  DB_SET_RESET(0,0,0,1);                                                         //DB7=0, DB6=0, DB5=, DB4=1
  delay_ms(2);
  
  DB_SET_RESET(0,0,0,0);                                                        //Установка режима ввода данных DB7=0,DB6=0,DB5=1,DB4=0
  delay_ms(2);
  DB_SET_RESET(0,1,1,0);                                                         //DB7=0, DB6=1, DB5=1, DB4=0
  delay_ms(2);
  
}

void LCD_PRINT (void)
{
  
  /* Установка адреса 0 */
  
  PORTC &= 0xFE;                                                                //  RS = 0
  PORTC &= 0xFD;                                                                //  R/W = 0
  PORTC |= (1<<2);                                                              //  E = 1
  PORTC |= (1<<7);                                                              //  DB7 = 1
  
  DB_SET_RESET(1,0,0,0);
  PORTC &= 0xFB;                                                                //  E = 0
  delay_us(50);
  PORTC |= (1<<2);                                                              //  E = 1
  DB_SET_RESET(0,0,0,0);                                                        //  DB7=0, DB6 = 0, DB5 = 0, DB4 = 0
  PORTC &= 0xFB;                                                                //  E = 0
  delay_us(50);
  
  /* Вывод буквы A */
  
  PORTC |= (1<<0);                                                              //  RS = 1
  PORTC |= (1<<2);                                                              //  E = 1
  DB_SET_RESET(0,1,0,0);
  PORTC &= 0xFB;                                                                //  E = 0
  delay_us(40);
  PORTC |= (1<<2);                                                              //  E = 1
  DB_SET_RESET(0,0,0,1);
  PORTC &= 0xFB;                                                                //  E = 0
  delay_us(50);

}

void LCD_CLEAR(void)
{
PORTC &= 0xFE;                                                                //  RS = 0
PORTC &= 0xFD;                                                                //  R/W = 0
PORTC |= (1<<2);                                                              //  E = 1

DB_SET_RESET(0,0,0,0);
PORTC &= 0xFB;                                                                //  E = 0
delay_ms(2);

PORTC |= (1<<2);                                                              //  E = 1
DB_SET_RESET(0,0,0,1);
PORTC &= 0xFB;                                                                //  E = 0

delay_ms(2);
}


Сообщение отредактировал Dars - Feb 5 2006, 19:58
Go to the top of the page
 
+Quote Post



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

 


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


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