Обсуждаем контроллеры компании Atmel.
Ответить

Запустить древний lcd HT1611(WM1611/KO-4B)

Сб мар 23, 2019 22:30:26

Всем привет. Пытаюсь запустить древний lcd HT1611(WM1611/KO-4B), безрезультатно.
Я недавно начал изучать Авр, поэтому мои познания весьма скудны. Пытался вывести символы из массива, но в результате имею хаотичный выброс символов, затем дисплей переходит в аппаратный режим таймера.
Ребята кто, в своё время имел дело с этим дисплеем подскажите, варианты.
МК Тини13,код:
Код:
#include <tiny13a.h>
#include <delay.h>
#define sk PORTB.0
#define di PORTB.1
#define led PORTB.2
#define lo 0
#define hi 1

unsigned char segment[]={1,2,3,4,5,6,7,8,9,0};

void write_disp (void) //функция вывода
 {
  unsigned char i;
  for(i=0;i<10;i++)    //вывод 10-ти элементов массива в 10 рязрядов дисплея
   { unsigned char y;
     for (y=0;y<4;y++) //вывод 4 бит кода одного символа
      { sk=hi;
        delay_us(2);
        if (segment[i]&0x4)
           {di=1;}
           else
           {di=0;}
        sk=lo;
        delay_us(3);
        segment[i]<<=1;
      }
     delay_us(6);
   }
 }
void main(void)
{

// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);



while (1)
      {     
      write_disp;
      while (1)  {};
      }
}

Re: Запустить древний lcd HT1611(WM1611/KO-4B)

Вс мар 24, 2019 06:18:26

Код:
// 10x1 holtek ht1611 display
#include "display.h"


void DisplayInit(void)
{
  off(CL); out(CL);
  out(DI);
  out(HK);
  SetDisplayMode();
  DelayMs(POWER_ON_TIME);
  DisplayChar('0');
}


void SetDisplayMode(void)
{
  off(HK);
  DelayUs(TA_TIME_US);
}


void SetClockMode(void)
{
  on(HK);
  DelayUs(TA_TIME_US);
}


void DisplayChar(uint8_t chr)
{
  int8_t i;

  if (chr == '0') chr = 10;
  else if (chr == '-') chr = 15;

  for (i = 3; i >= 0; --i) {
    chr & 1<<i ? on(DI) : off(DI);
    DelayUs(TA_TIME_US);
    on(CL);
    DelayUs(TB_TIME_US);
    off(CL);
  }
  DelayUs(TC_TIME_US);
}


void DisplayStr(uint8_t *s)
{
  SetDisplayMode();
  while (*s)
    DisplayChar(*s++);
}


Код:
#define LIDER_SPACE       1
#define DI                A,0,H         //   6k8
#define CL                A,1,L         // --/\/\-+-> HT
#define HK                A,2,H         // |-/\/\-+ 2k2

#define POWER_ON_TIME     2000
#define TA_TIME_US        4
#define TB_TIME_US        4
#define TC_TIME_US        10
#define LCD_SECOND_MAX    10            //время через которое происходит переключение на часы

Re: Запустить древний lcd HT1611(WM1611/KO-4B)

Вс мар 24, 2019 21:11:33

Спасибо OKF за предоставленный код, но если честно я смог его до конца понять например функцию:
Код:
void DisplayChar(uint8_t chr)
{
  int8_t i;

  if (chr == '0') chr = 10;
  else if (chr == '-') chr = 15;

  for (i = 3; i >= 0; --i) {
    chr & 1<<i ? on(DI) : off(DI);
    DelayUs(TA_TIME_US);
    on(CL);
    DelayUs(TB_TIME_US);
    off(CL);
  }
  DelayUs(TC_TIME_US);
}

Я решил вывести один символ без заумностей)):
Код:
sk=hi;
      di=1;
      delay_us(10);
      sk=lo;
      delay_us(20);
      sk=hi;
      di=1;
      delay_us(10);
      sk=lo;
      delay_us(20);
      sk=hi;
      di=1;
      delay_us(10);
      sk=lo;
      delay_us(20);
      sk=hi;
      di=1;
      delay_us(10);
      sk=lo;
      delay_us(20);
      led=hi;

Сначала дело не пошло, но увеличил задержки и символы стали выводиться.
Но с массива как изначально хотел пока не получается. Буду разбираться.

Re: Запустить древний lcd HT1611(WM1611/KO-4B)

Пн мар 25, 2019 04:56:59

На DI выводим биты с 3 по 0 chr. Каждый бит стробируем CL. Задержки TA, TB, TC расписаны.
Что именно не понятно?

Re: Запустить древний lcd HT1611(WM1611/KO-4B)

Пн мар 25, 2019 09:44:53

Логика понятна, не понятен синтаксис. Для какого компилятора код?
Например : chr & 1<<i ? on(DI) : off(DI);
Я начинающий, поэтому могу задать вопрос в простых вещах.

Re: Запустить древний lcd HT1611(WM1611/KO-4B)

Пн мар 25, 2019 09:53:11

Для любого.
Обычно задают вопросы когда нигде нельзя найти ответ.
http://cppstudio.com/post/304/

Re: Запустить древний lcd HT1611(WM1611/KO-4B)

Вс мар 31, 2019 21:03:53

OKF спасибо, я даже не знал о таком операторе.
В конце концов у меня удалось написать рабочую функцию, которая выводит 10 символов из массива, как я и хотел.)
Код:
unsigned char segment[]={1,2,3,4,5,6,7,8,9,0};
unsigned char temp;

void write_disp (void) //функция вывода
 {   
      unsigned char i;
      for (i=0;i<10;i++)
          {unsigned char y;
          temp=segment[i];
          delay_us(40);
             for (y=0;y<4;y++) //вывод 4 бит кода одного символа
              { sk=hi;   
                if (temp&0x8)  //если 1 то отпр. 1
                    {di=1;}
                   else
                    {di=0;}
                delay_us(10);
                sk=lo;
                delay_us(20);
                temp<<=1;
              } 
          }
 }
Ответить