roboforum.ru

Технический форум по робототехнике.

Виртульный порт(Разные ножки для LCD).

Виртульный порт(Разные ножки для LCD).

grek » 30 мар 2010, 09:35

Возникала проблема надо перейти от одного LCD на другой.Получилось так,что ножки портов данных на LCD разбросаны по разным портам.Например бит0 - PORTС.0 бит1 - PORTB.1, ну и так далее.Ищу программное решение.Порты подключены по следующей схеме
Код: Выделить всёРазвернуть
#define DB0 PORTC.3
#define DB1 PORTA.6
#define DB2 PORTA.5
#define DB3 PORTA.4
#define DB4 PORTC.4
#define DB5 PORTC.5
#define DB6 PORTC.6
#define DB7 PORTC.7
#define A0 PORTC.0
#define CS PORTB.6
#define RES PORTB.5
#define E PORTC.2
#define RW PORTC.1

Хотелось бы,что бы с помощью присвоение значения переменной сразу присваивалось значение порту
void __my_dat_port_lcd(unsigned char data_lcd_portf)
чтобы при передачи значения char data_lcd_portf,например 0x77, виртуальный порт принимал данное значения и передавал в реальные порты микроконтроллера.Может кто поможет с программной реализацией данного вопроса.

Re: Виртульный порт(Разные ножки для LCD).

$ilent » 30 мар 2010, 10:01

Используйте маску. И ни каких проблем.
Код: Выделить всёРазвернуть
void write_44780 (unsigned char *p, int len, char command)
       {
      while (len--)
             {
           switch (command)
                  {
                case 0:
                     RS0;             // адрес регистра комманд
                    break;
                case 1:
                     RS1;            // адрес регистра данных
                    break;
                }
                   RW0;                  // операция записи
                   E1;               // строб
                   if ((*p & 0x80) == 0x80) {PORTB |= BIT(3);} else {PORTB &= ~BIT(3);}
                  if ((*p & 0x40) == 0x40) {PORTB |= BIT(2);} else {PORTB &= ~BIT(2);}
                  if ((*p & 0x20) == 0x20) {PORTB |= BIT(1);} else {PORTB &= ~BIT(1);}
                  if ((*p & 0x10) == 0x10) {PORTB |= BIT(0);} else {PORTB &= ~BIT(0);}
                E0;
                asm("nop");
                E1;
                if ((*p & 0x08) == 0x08) {PORTB |= BIT(3);} else {PORTB &= ~BIT(3);}
                  if ((*p & 0x04) == 0x04) {PORTB |= BIT(2);} else {PORTB &= ~BIT(2);}
                  if ((*p & 0x02) == 0x02) {PORTB |= BIT(1);} else {PORTB &= ~BIT(1);}
                  if ((*p & 0x01) == 0x01) {PORTB |= BIT(0);} else {PORTB &= ~BIT(0);}
                E0;
                PORTB |= 0x0f;
                  p++;
         }
      }

Только переделайте под свою восьми битную шину и порты.

Re: Виртульный порт(Разные ножки для LCD).

grek » 30 мар 2010, 12:49

Все заработало,спасибо остался небольшой вопрос.Сколько по длительности времени выполняется данный макрос.Только у меня на 8 бит?

Re: Виртульный порт(Разные ножки для LCD).

$ilent » 30 мар 2010, 13:17

Понятия не имею, сам уж посчитай. Добавлю лишь, что в начале должна ещё присутствовать функция проверки готовности ЖКИ (в этой версии у меня его нету).

Re: Виртульный порт(Разные ножки для LCD).

grek » 30 мар 2010, 13:45

Спасибо,разобрался все заработало,не хватало данного макроса.

Re: Виртульный порт(Разные ножки для LCD).

Vanno44 » 05 июл 2010, 20:25

пример программы можно посмотреть с таким кодом ???

Re: Виртульный порт(Разные ножки для LCD).

$ilent » 05 июл 2010, 23:29

Vanno44 писал(а):пример программы можно посмотреть с таким кодом ???
Код: Выделить всёРазвернуть
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "def.h"



static unsigned char lcd_init_8[1]=
{
0x30,
};
static unsigned char lcd_init_4[3]=
{
0x28,
0x0d,
0x06,
};
static unsigned char lcd_clean[2]=
{
0x01,
0x02,
};

void LCD_write (unsigned char *p, int len, char command, char flag)
    {
      while (len--)
            {
          if (flag==0){LCD_read();}
           switch (command)
                  {
                case 0:
                     CLEARBIT(LCD_PORT_D, A);                      // адрес регистра комманд
                    break;
                case 1:
                     SETBIT(LCD_PORT_D, A);                     // адрес регистра данных
                    break;
                }
                CLEARBIT(LCD_PORT_D, WR);                           // операция записи
                SETBIT(LCD_PORT_D, E);                           // строб
                if ((*p & 0x80) == 0x80) SETBIT(LCD_PORT_B, BIT3);
                else CLEARBIT(LCD_PORT_B,BIT3);

                if ((*p & 0x40) == 0x40) SETBIT(LCD_PORT_B, BIT2);
                else CLEARBIT(LCD_PORT_B,BIT2);

                if ((*p & 0x20) == 0x20) SETBIT(LCD_PORT_B, BIT1);
                else CLEARBIT(LCD_PORT_B,BIT1);

                if ((*p & 0x10) == 0x10) SETBIT(LCD_PORT_B, BIT0);
                else CLEARBIT(LCD_PORT_B,BIT0);

                CLEARBIT(LCD_PORT_D, E);                     // сбрасывам строб
                SETBIT(LCD_PORT_D, E);                        // строб
                if ((*p & 0x08) == 0x08) SETBIT(LCD_PORT_B, BIT3);
                else CLEARBIT(LCD_PORT_B,BIT3);

                if ((*p & 0x04) == 0x04) SETBIT(LCD_PORT_B, BIT2);
                else CLEARBIT(LCD_PORT_B,BIT2);

                if ((*p & 0x02) == 0x02) SETBIT(LCD_PORT_B, BIT1);
                else CLEARBIT(LCD_PORT_B,BIT1);

                if ((*p & 0x01) == 0x01) SETBIT(LCD_PORT_B, BIT0);
                else CLEARBIT(LCD_PORT_B,BIT0);

                CLEARBIT(LCD_PORT_D,E);                     // сбрасываем строб
                  p++;                                    // увеличиваем счётчик передаваемых байт
         }
      }

int LCD_read (void)
       {
       unsigned char dataRead=0;
       LCD_DIR  = 0x00;                                    // порт индикатора на вход

       CLEARBIT(LCD_PORT_D, A);                                  // адрес регистра комманд

       SETBIT(LCD_PORT_D, WR);                                    // операция чтения

       SETBIT(LCD_PORT_D, E);                                    // строб
      while(CHECKBIT (LCD_IN, BIT3)) {};                        // ждём флага (0)
       dataRead = (LCD_IN &((BIT3)|(BIT2)|(BIT1)|(BIT0)))<<4;         // читаем верхнюю тетраду
       CLEARBIT(LCD_PORT_D,E);                                 // сбрасываем строб

      SETBIT(LCD_PORT_D, E);                                    // строб
        dataRead |=(int) (LCD_IN &((BIT3)|(BIT2)|(BIT1)|(BIT0)));      // читаем нижнюю тетраду
       CLEARBIT(LCD_PORT_D,E);                                 // сбрасываем строб

      CLEARBIT(LCD_PORT_D,WR);                              // отменяем операцию чтения

      LCD_DIR  = 0xFF;                                    // порт индикатора на выход
      return dataRead;                                    // возвращаем прочтённые данные (если нужны)
      }

void init_LCD (void)
{
_delay_ms (20);
LCD_write (lcd_init_8, sizeof(lcd_init_8), comm, no_check_flag);      // 8-ми проводный интерфейс
_delay_us (40);
LCD_write (lcd_init_8, sizeof(lcd_init_8), comm, no_check_flag);      // 8-ми проводный интерфейс
_delay_us (40);
LCD_write (lcd_init_8, sizeof(lcd_init_8), comm, no_check_flag);      // 8-ми проводный интерфейс
_delay_us (40);
LCD_write (lcd_init_4, sizeof(lcd_init_4), comm, check_flag);         // 4-х проводный интерфейс
}

void LCD_clean (void)
{
LCD_write (lcd_clean, sizeof(lcd_clean), comm, check_flag);         // очистка дисплея и установка курсора в позицию 0
}



Re: Виртульный порт(Разные ножки для LCD).

grek » 06 июл 2010, 11:42

Ты вроде спрашиваешь про codevision,а пример программы написал для winavr? Суть конечно не в этом? Бери любой proteus или тому подобное, и простейший код и пробуй.

Re: Виртульный порт(Разные ножки для LCD).

avr123.nm.ru » 06 июл 2010, 14:03

Да и в CVAVR должен работать, только заголовки инклуд поменять, def.h скачать.

Добавлено спустя 39 минут 40 секунд:
$ilent писал(а):#include "def.h"


def.h - наверно выложиь тут надо.

Re: Виртульный порт(Разные ножки для LCD).

$ilent » 06 июл 2010, 20:39

Код: Выделить всёРазвернуть
#define BIT(x)              (1 << (x))
#define SETBIT(x, y)         (x |= y)
#define CLEARBIT(x, y)       (x &= ~y)
#define CHECKBIT(x, y)       (x & y)

#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01

#define LCD_PORT_D   PORTD
#define LCD_PORT_B   PORTB
#define LCD_DIR      DDRB
#define LCD_IN      PINB

#define A BIT4
#define WR BIT5
#define E BIT6

#define comm 0
#define data 1
#define check_flag 0
#define no_check_flag 1


Rambler\'s Top100 Mail.ru counter