Witam.
Jakiś czas temu zakupiłem na allegro matryce wyświetlacza graficznego wraz z płytą główną kasy fiskalnej na której to był umieszczony układ SED1330F. Po zdemontowaniu układu SED z płyty zbudowałem własny sterownik w/w matrycy.
W obecnej chwili jestem po pierwszych testach które trwały 1 miesiąc
No i natrafiłem na problem z którym nie mogę sobie poradzić a mianowicie gdy wysyłam do sterownika komendę wyświetl literę
"E"
pobraną z wewnętrznego generatora znaków w efekcie dostaję
E_E
gdzie podkreślnik jest migającym kursorem. Poniżej zamieszczam zdjęcie pracującego wyświetlacza.
Nadmienię jeszcze że wyświetlacz jest o rozdzielczości 256x128 a panel składa się z dwóch osobnych paneli. Widać to na zdjęciu ponieważ jeden wyczyściłem programowo a drugi został zapisany przypadkowymi znakami znajdującymi się w pamięci RAM
Poza tym poniżej zamieszczam listing programu który steruje SED'm.
Za Wszelką pomoc serdecznie dziękuję
Pozdrawiam
Jakiś czas temu zakupiłem na allegro matryce wyświetlacza graficznego wraz z płytą główną kasy fiskalnej na której to był umieszczony układ SED1330F. Po zdemontowaniu układu SED z płyty zbudowałem własny sterownik w/w matrycy.
W obecnej chwili jestem po pierwszych testach które trwały 1 miesiąc
No i natrafiłem na problem z którym nie mogę sobie poradzić a mianowicie gdy wysyłam do sterownika komendę wyświetl literę
"E"
pobraną z wewnętrznego generatora znaków w efekcie dostaję
E_E
gdzie podkreślnik jest migającym kursorem. Poniżej zamieszczam zdjęcie pracującego wyświetlacza.
Nadmienię jeszcze że wyświetlacz jest o rozdzielczości 256x128 a panel składa się z dwóch osobnych paneli. Widać to na zdjęciu ponieważ jeden wyczyściłem programowo a drugi został zapisany przypadkowymi znakami znajdującymi się w pamięci RAM
Poza tym poniżej zamieszczam listing programu który steruje SED'm.
//PROGRAM DZIAŁAJĄCY krysztal 16MHz jeden takt trwa 62,5 ns
//działający kursor na 00
#include <avr/io.h>
#include <stdlib.h>
//====================================LCD GRAFICZNY SED1330F=========================================
//----------------------------------------LINIE DANYCH-----------------------------------------------
#define LCDG PORTC // PORT LINII STERUJACYCH
#define DLCDG DDRC
#define CS 6 // LINIA CHIP SELECT
#define A0 5 // LINIA WYBORU REJESTRU 0- REJESTR DANYCH, 1-REJESTR POLECEN
#define WR 4 // LINIA ZAPIS DANYCH DO SED1330F
#define RD 3 // LINIA ODCZYT DANYCH DO SED1330F
#define RES 2 // LINIA RESET AKTYWNY W STANIE NISKIM
//
#define SET_CS LCDG |= _BV(CS)
#define CLR_CS LCDG &= ~_BV(CS)
//
#define SET_A0 LCDG |= _BV(A0)
#define CLR_A0 LCDG &= ~_BV(A0)
//
#define SET_WR LCDG |= _BV(WR)
#define CLR_WR LCDG &= ~_BV(WR)
//
#define SET_RD LCDG |= _BV(RD)
#define CLR_RD LCDG &= ~_BV(RD)
//
#define SET_RES LCDG |= _BV(RES)
#define CLR_RES LCDG &= ~_BV(RES)
//----------------------------------------LINIE DANYCH-----------------------------------------------
#define LCDGd PORTA // PORT LINII DANYCH
#define DLCDGd DDRA
#define LCDG_PIN PINA
short int x;
//==========================================LCD==================================================
void dlns (void)
{
asm("nop");
asm("nop");
}
void dl(unsigned char x)
{
TCCR0=0x02;
OCR0=x;
while(1)
{
if(TCNT0>=OCR0)
break;
}
TCCR0=0;
TCNT0=0;
}
void dlms(unsigned char x) // 1,018ms
{
TCCR0=0x05;
OCR0=28;
for(;x>0;x--)
{
TCNT0=0;
while(1)
{
if(TCNT0>=OCR0)
break;
}
}
TCCR0=0;
TCNT0=0;
}
//==========================================================================================//
void wr_lcd_bus(unsigned char data) // procedura zapisujaca 8-bitowa dana na magistrale
{
int temp = data; // zaczytaj dana polecenie
LCDGd = temp;
dlns();
dlns();
dlns();
SET_WR; // WR ustaw w stan wysoki koniec zapisu
dlns();
SET_CS; // CS - chyp selekt w stan wysoki
LCDGd = 0x00;
dlns();
}
void lcdg_init(void) // procedura inicjacji wyjsc sterujących
{
dlms(2);
DLCDG = 0x7C;
dlns();
LCDG = 0x7C;
dlns(); // linie sterujace jako wyjsca
CLR_RES; //stan niski na resecie sed1330f przez conajmniej 1ms
dlms(3);
SET_RES; //stan wysoki na resecie sed1330f przez conajmniej 1ms
dlms(3);
LCDG = 0x7C; //stan wysoki +5V na liniach sterujacych
}
void lcdg_write_data(unsigned char data) // procedura zapisu danej do sterownika
{
DLCDGd = 0xFF; // linie sterujace jako wyjsca
LCDGd = 0x00; //stan niski 0V na liniach sterujacych
SET_RD; // RD=1 - RD w stanie wysokim nie będziemy odczytywać danych
SET_WR;
dlms(1);
CLR_A0; // A0=1 - zapis danej poprawnie wg dokumentacji
CLR_CS; // CS - chyp selekt w stan niski
dlns(); //czekaj min 30 ns ( 62,5ns czeka)
CLR_WR;
dlns();
wr_lcd_bus(data); // funkcja zapisu danej na magistrale
}
void lcdg_write_cmd(unsigned char cmd) // procedura zapisu polecenia do sterownika
{
DLCDGd = 0xFF; // linie sterujace jako wyjsca
LCDGd = 0x00; //stan niski 0V na liniach sterujacych
SET_RD; // RD=1 - RD w stanie wysokim nie będziemy odczytywać danych
SET_WR;
dlms(1);
SET_A0; // A0=1 - zapis polecenia poprawnie wg dokumentacji
CLR_CS; // CS - chyp selekt w stan niski
dlns(); //czekaj min 30 ns ( 62,5ns czeka)
CLR_WR;
dlns();
wr_lcd_bus(cmd); // funkcja zapisu danej na magistrale
}
unsigned char lcdg_read_status(void) // procedura odczytu flagi statusu
{
unsigned char stan;
stan=1;
DLCDGd = 0xBF; // linie danych jako wejścia
LCDGd = 0x40; // linie danych reagują na 0
SET_WR; // WR=1 - WR w stanie wysokim nie będziemy zapisywac danych/komendy
SET_RD;
dlms(1);
CLR_A0; // A0=0 - odczyt statusu
CLR_CS; // CS - chyp selekt w stan niski
dlns(); //czekaj min 30 ns ( 62,5ns czeka)
CLR_RD;
dlns();
dlns();
if(bit_is_clear(PINA,6))
{
stan=0;
}
SET_CS; // CS w stan wysoki koniec obslugi SED
SET_RD; // RD w stan wysoki odczytalismy dane
return stan;
}
void lcdg_init1(void)
{
lcdg_init();
lcdg_write_cmd(0x40); //C
lcdg_write_data(0x38); //P1 => DR, T/L, IV, 1, W/S, M2, M1, M0
lcdg_write_data(0x87); //P2=> WF 0 0 0 0 Fx2 Fx1 Fx0 szerokosc ramki znaku
lcdg_write_data(0x08); //P3 => 0 0 0 0 Fy3 Fy2 Fy1 Fy0 wysokosc ramki znaku
lcdg_write_data(0x1F); //P4 ilosc bajtow na linie 0x20=> 31 bajtow na linie 1F
lcdg_write_data(0x23); //P5 TC/R = C/R+4 TC/R=32+4=36 22, 31
lcdg_write_data(0x7F); //P6 L/F wysokość calkowita ekranu 127 linie na panel 3f 7F
lcdg_write_data(0x20); //P7
lcdg_write_data(0x00); //P8 szerokość całkowita wyświetlacza 2 starsze bajty bajty
}
void lcd_wyswietlaj(void)
{
lcdg_write_cmd(0x44); //C SCROLL
lcdg_write_data(0x00); //P1
lcdg_write_data(0x00); //P2
lcdg_write_data(0x40); //P3
lcdg_write_data(0x00); //P4
lcdg_write_data(0x02); //P5
lcdg_write_data(0x40); //P6
lcdg_write_data(0x00); //P7
lcdg_write_data(0x01); //P8
lcdg_write_data(0x00); //P9
lcdg_write_data(0x0A); //P10
lcdg_write_cmd(0x5A); //C HDOT SCR
lcdg_write_data(0x00); //P1
lcdg_write_cmd(0x5B); //C OVLAY
lcdg_write_data(0x01); //P1=> 0 0 0 OV DM2 DM1 MX1 MX0 określa tyb wyświetlania
lcdg_write_cmd(0x58); //C DISP ON/OFF
lcdg_write_data(0x47); //P1=> FP5, FP4, FP3, FP2, FP1, FP0, FC1, FC0 włącza i wyłącza wyświetlanie
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0x00); //P1 współrzędna CSRL
lcdg_write_data(0x00); //P2 współrzędna CSRH
lcdg_write_cmd(0x5D); //C CSR FROM --
lcdg_write_data(0x07); //P1 szerokość kursora w pikselach
lcdg_write_data(0x08); //P2 wysokośc kursora w liniach
lcdg_write_cmd(0x59); //C DISP ON/OFF
lcdg_write_data(0x47); //P1=> FP5, FP4, FP3, FP2, FP1, FP0, FC1, FC0 włącza i wyłącza wyświetlanie
lcdg_write_cmd(0x4C); //C CSR DIR
//------------------czyść pierwszy ekran LCD -----------------------------
lcdg_write_cmd(0x42); //C MWRITE
int i;
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0x20); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0x40); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0x60); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0x80); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0xA0); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0xC0); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0xE0); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<31;i++)
lcdg_write_data(0x20); //P1 ' '
//----------------------wyświetl znak na LCD-----------------------------
lcdg_write_cmd(0x46); //C CSRW ustawienie kursora w rządanym punkcie
lcdg_write_data(0x00); //P1 współrzędna CSRL ustawia w poziomie
lcdg_write_data(0x00); //P2 współrzędna CSRH ustawia w pionie
lcdg_write_cmd(0x42); //C MWRITE
for(i=0;i<1;i++)
lcdg_write_data(0x45); //P1 ' '
}
int main (void)
{
lcdg_init1();
lcd_wyswietlaj();
while(1)
{
dlms(200);
}
}
Za Wszelką pomoc serdecznie dziękuję
Pozdrawiam