REKLAMA

cbs0084-ht1621.7z

Jak zidentyfikować i sterować wyświetlaczem w stacji lutowniczej ZD912?

http://www.datasheetcatalog.com/datasheets_pdf/H/T/1/6/HT1621.shtml HT1621 - toto samo co siedzi w lcd z ARTRONIC'a (lcd mają symbole kVA kWh: http://artronic.pl/o_produkcie.php?id=603?). Załączam do tych z artronica sterownik - pisany stosunkowo brzydko (moje początki w avr-gcc :P ) ale jest sporo komentarzy :) więc powinieneś sobie poradzić :) Najpierw trzeba wywołać cbs_InitPort potem cbs_Init :)


Pobierz plik - link do postu
  • cbs0084-ht1621.7z
    • lcd_cbs0084.h
    • lcd_cbs0084.c
    • makra.h


cbs0084-ht1621.7z > lcd_cbs0084.h

#ifndef CBS0084_H_INCLUDED
#define CBS0084_H_INCLUDED

/*
CBS LCD µP pin-config:
// Wyœwietlacz CBS0084
#define LCD_CBS_CS_PORT B
#define LCD_CBS_CS_PIN 0
#define LCD_CBS_WR_PORT B
#define LCD_CBS_WR_PIN 1
#define LCD_CBS_DATA_PORT B
#define LCD_CBS_DATA_PIN 2

*/

#define LCDCBS_SYS_DIS 0x00
#define LCDCBS_SYS_EN 0x01
#define LCDCBS_LCD_OFF 0x02
#define LCDCBS_LCD_ON 0x03

#define LCDCBS_BIAS_12 0x20
#define LCDCBS_BIAS_13 0x21
#define LCDCBS_BIAS_2C 0x00
#define LCDCBS_BIAS_3C 0x04
#define LCDCBS_BIAS_4C 0x08

void lcd_cbs_InitPort(void);
void lcd_cbs_init(void);
void lcd_cbs_cls(void);
void lcd_cbs_send_digit(uint8_t data, uint8_t digit);

#endif // CBS0084_h_included


cbs0084-ht1621.7z > lcd_cbs0084.c

#include & lt; avr/io.h & gt;
#include & lt; inttypes.h & gt;
#include & lt; avr/pgmspace.h & gt;
#include & lt; stdlib.h & gt;

#include " harddef.h "
#include " makra.h "
#include " delay.h "
#include " lcd_cbs0084.h "

// Funkcje " poziomu sprzêtowego "
void static inline LCD_CBS_WR_PULSE(void) {
//delay100us8(1);
PORT(LCD_CBS_WR_PORT) & = ~(1 & lt; & lt; LCD_CBS_WR_PIN); // WR = 0
//delay100us8(1);
PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN; // WR = 1 ; zapis bitu w lcd
//delay100us8(1);
PORT(LCD_CBS_WR_PORT) & = ~(1 & lt; & lt; LCD_CBS_WR_PIN); // WR = 0
//delay100us8(1);
}

// po ostatnim bicie linia WR musi byæ w H
void static inline LCD_CBS_WR_PULSE_2(void) {
//delay100us8(1);
PORT(LCD_CBS_WR_PORT) & = ~(1 & lt; & lt; LCD_CBS_WR_PIN); // WR = 0
//delay100us8(1);
PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN; // WR = 1 ; zapis bitu w lcd
//delay100us8(1);
//PORT(LCD_CBS_WR_PORT) & = ~(1 & lt; & lt; LCD_CBS_WR_PIN); // WR = 0
//delay100us8(1);
}


void lcd_cbs_send_command(uint8_t data) {
uint8_t n=0;
uint16_t dana=0;

dana = 4 & lt; & lt; 8;// 100 na bity 8-10
dana |= data;

PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN; // WR = 1
PORT(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN; // CS = 1
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN; // DATA = 1
//delay100us8(10); // 1ms
PORT(LCD_CBS_CS_PORT) & = ~(1 & lt; & lt; LCD_CBS_CS_PIN); // CS = 0

PORT(LCD_CBS_WR_PORT) & = ~(1 & lt; & lt; LCD_CBS_WR_PIN);

dana = dana & lt; & lt; 5; // przesuñ do pocz¹tku (czyli 15bit jest " pierwszy " ;) ) liczby bity
//dana |= 0x1f;
for (n=11;n!=0;--n) {
// jeœli bit
if (dana & gt; = 0x8000) PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
else PORT(LCD_CBS_DATA_PORT) & = ~(1 & lt; & lt; LCD_CBS_DATA_PIN);
LCD_CBS_WR_PULSE();
dana = dana & lt; & lt; 1;
}
PORT(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN;
PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN;
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
}

void lcd_cbs_send_digit(uint8_t data, uint8_t digit) {
uint8_t x = 0;
uint16_t dana = 0;

PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN; // WR = 1
PORT(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN; // CS = 1
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN; // DATA = 1
//delay100us8(10); // 1ms
PORT(LCD_CBS_CS_PORT) & = ~(1 & lt; & lt; LCD_CBS_CS_PIN); // CS = 0
PORT(LCD_CBS_WR_PORT) & = ~(1 & lt; & lt; LCD_CBS_WR_PIN); // WR = 0
// wpisz ID " 1 0 1 " - bêdzie nadawana cyfra (które segmenty maj¹ sie paliæ :) na wyœwietlaczu )
dana = 5 & lt; & lt; 6;
if ((digit & gt; 12) || (digit & lt; 1)) digit = 1;
// Trzeba zmieniæ kolejnoœæ numeracji cyfr na LCD (kontroler liczy od prawej do lewej ,a my od lewej do prawej) :)
if (digit == 1) dana |= 22;
if (digit == 2) dana |= 20;
if (digit == 3) dana |= 18;
if (digit == 4) dana |= 16;
if (digit == 5) dana |= 14;
if (digit == 6) dana |= 12;
if (digit == 7) dana |= 10;
if (digit == 8) dana |= 8;
if (digit == 9) dana |= 6;
if (digit == 10) dana |= 4;
if (digit == 11) dana |= 2;
if (digit == 12) dana |= 0;
//dana |= (x & lt; & lt; 2); // przesuñ do " pocz¹tku " (6bitów)
dana & lt; & lt; = 7; // przesuñ wszytko na " pocz¹tek " liczby
// wys³anie adresu
for (x=9;x!=0;--x) {
if (dana & gt; = 0x8000) PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
else PORT(LCD_CBS_DATA_PORT) & = ~(1 & lt; & lt; LCD_CBS_DATA_PIN);
LCD_CBS_WR_PULSE();
dana = dana & lt; & lt; 1;
}
// wyœlij dane
// Kolejnoœæ wysy³ania na wyœwietlacz: [adr: x]D0D1D2D3 [adr: x+1]D0D1D2D3
// Kolejnioœæ wysy³ania " data " : [7654 3210] czyli (po podzieleniu na 2cz 4bit) [3210 3210]
for (x=8; x!=0; --x) {
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
if ((data & 0x01) & gt; = 0x01) PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
else PORT(LCD_CBS_DATA_PORT) & = ~(1 & lt; & lt; LCD_CBS_DATA_PIN);
LCD_CBS_WR_PULSE();
data & gt; & gt; =1;
}
PORT(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN;
PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN;
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
}

// Inicja portów steruj¹cych LCD
void lcd_cbs_InitPort(void) {
DDR(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN;
DDR(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN;
DDR(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
PORT(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN;
PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN;
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
}

void lcd_cbs_cls(void) {
uint8_t x = 0;
uint16_t dana = 0;

PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN; // WR = 1
PORT(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN; // CS = 1
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN; // DATA = 1
//delay100us8(10); // 1ms
PORT(LCD_CBS_CS_PORT) & = ~(1 & lt; & lt; LCD_CBS_CS_PIN); // CS = 0
PORT(LCD_CBS_WR_PORT) & = ~(1 & lt; & lt; LCD_CBS_WR_PIN); // WR = 0
// wpisz ID " 1 0 1 " - bêdzie nadawana cyfra (które segmenty maj¹ sie paliæ :) na wyœwietlaczu )
dana = 5 & lt; & lt; 13;
// wys³anie adresu
for (x=9;x!=0;--x) {
if (dana & gt; = 0x8000) PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
else PORT(LCD_CBS_DATA_PORT) & = ~(1 & lt; & lt; LCD_CBS_DATA_PIN);
LCD_CBS_WR_PULSE();
dana = dana & lt; & lt; 1;
}
// wyœlij dane
// Kolejnoœæ wysy³ania na wyœwietlacz: [adr: x]D0D1D2D3 [adr: x+1]D0D1D2D3
// Kolejnioœæ wysy³ania " data " : [7654 3210] czyli (po podzieleniu na 2cz 4bit) [3210 3210]
PORT(LCD_CBS_DATA_PORT) & = ~(1 & lt; & lt; LCD_CBS_DATA_PIN);
for (x=96; x!=0; --x) {
LCD_CBS_WR_PULSE();
}
PORT(LCD_CBS_CS_PORT) |= 1 & lt; & lt; LCD_CBS_CS_PIN;
PORT(LCD_CBS_WR_PORT) |= 1 & lt; & lt; LCD_CBS_WR_PIN;
PORT(LCD_CBS_DATA_PORT) |= 1 & lt; & lt; LCD_CBS_DATA_PIN;
}

void lcd_cbs_init(void) {
lcd_cbs_send_command(LCDCBS_SYS_EN);
lcd_cbs_send_command(LCDCBS_LCD_ON);
lcd_cbs_send_command((LCDCBS_BIAS_13|LCDCBS_BIAS_4C));
}


cbs0084-ht1621.7z > makra.h

// ------------- Makra
#ifndef MAKRA_H_INCLUDED
#define MAKRA_H_INCLUDED

// *** PORT
#define PORT(x) XPORT(x)
#define XPORT(x) (PORT##x)
// *** PIN
#define PIN(x) XPIN(x)
#define XPIN(x) (PIN##x)
// *** DDR
#define DDR(x) XDDR(x)
#define XDDR(x) (DDR##x)

#define NOP() {asm volatile( " nop " ::);}

#endif