LCD 128x64 PIC16F877 nejde načíst hodnota bytu

Ahoj,
po dlouhé době zase já a moje GLCD. Kvůli křížené čar a obrazců potřebuji načítat hodnotu, která je zapsaná v LCD. Udělal jsem si na to jednoduchý program, kdy to na první řádek vypíše 3 byte a na druhý by to mělo vyčíst hodnoty z prvního a zapsat je. Bohužel mi to vypisuje na druhý řádek kydy. Mohl by mi to někdo prosím projít na co jsem zapomněl, nebo kde jsem udělal chybu. Děkuji
PS: Bota bude asi ve funkci GLCD_read, zbytek mi funguje.

[code]int GLCD_read(int x, int y)
{
TRISD = 0x1111111;
int data;

Select_page(1);
if (x > 63)
{ 
	Select_page(0);	
}
GLCD_Comd(0b10111000 | y);
GLCD_Comd(0b01000000 | x);

RS = 1;
RW = 1;

E = 1;
data = DATA;
E = 0;
TRISD = 0x00000000;

return data;

}

void GLCD_write(int x, int y, int data) // x= (0;127), y= (0;7)
{
Select_page(1);
if (x > 63)
{
Select_page(0);
}
GLCD_Comd(0b10111000 | y);
GLCD_Comd(0b01000000 | x);

GLCD_Data(data);    

}

void GLCD_Init()
{
unsigned char Comd[5]={0xc0,0xb8,0x40,0x3f};
Select_page(1);
for(i=0 ;i<4; i++)
GLCD_Comd( Comd* );
Select_page(0);
for(i=0; i<4; i++)
GLCD_Comd( Comd* );
}
void Select_page(unsigned char Page)
{
if(Page == 0)
{
CS1 = 0;
CS2 = 1;
}
else
{
CS1 = 1;
CS2 = 0;
}
}
void GLCD_Comd(unsigned char command)
{
RS = 0;
RW = 0;
E=1;
DATA=command;
E=0;
}
void GLCD_Data(unsigned char data)
{
RS = 1;
RW = 0;
E=1;
DATA=data;
E=0;;
}
void GLCD_ClrScr(void)
{
for (Page=0; Page<8; Page++)
{
Select_page(1);
GLCD_Comd(0xb8 | Page);
GLCD_Comd(0x40);
for (Column=0; Column<128; Column++)
{
if (Column == 64)
{
Select_page(0);
GLCD_Comd(0xb8 | Page);
GLCD_Comd(0x40);
}
GLCD_Data(0x00); //This is Method 3
}
}
}

void main(void)
{
ADCON1 = 7;
TRISA = 0x00000000;
TRISC = 0x00000000;
TRISD = 0x00000000;

GLCD_Init();
__delay_ms(100);
GLCD_ClrScr();

while(1)
{

	GLCD_ClrScr();		

	__delay_ms(500);
	GLCD_write(1,0,0b00001111);
	GLCD_write(2,0,0b11110000);
	GLCD_write(3,0,0b00111100);

	GLCD_write(1,1,GLCD_read(1,0)); 
	GLCD_write(2,1,GLCD_read(2,0)); 
	GLCD_write(3,1,GLCD_read(3,0)); 

	__delay_ms(5000);
}

}
[/code]**

Načti si to nejdřív do proměnných, a pak až GLCD_write(3,1,promenna).

Doplnil jsem to tedy o načtení napřed do proměnné, ale bez výsledku :frowning:
Už to nevypisuje to co před tím, ale furt to nevypíše to co to má vypsat

[code]while(1)
{

	GLCD_ClrScr();		
	int promenna = 0;
	__delay_ms(500);

	GLCD_write(1,0,0b00001111);
	GLCD_write(2,0,0b11110000);
	GLCD_write(3,0,0b00111100);

	promenna = GLCD_read(1,0);
	GLCD_write(1,1,promenna); 
	promenna = 0;

	promenna = GLCD_read(2,0);
	GLCD_write(2,1,promenna); 
	promenna = 0;

	promenna = GLCD_read(3,0);
	GLCD_write(3,1,promenna); 
	promenna = 0; 

	__delay_ms(5000);
}[/code]

Je to s řadičem KS0108 ? Mělo by se využívat busy (viz datasheet).Pozor na časový prodlevy (taky v datasheetu).

Ano, je to řadič KS0108. Zkusím ošetřit tedy busy a prodlevy. Díky za rady

Pokud by to nechodilo,můžeš zkusit univerzální knihovnu u8glib. Podporuje většinu řadičů.Dají se z toho vytáhnout věci,který člověk zrovna potřebuje.

Něco málo jsem zkusil, ale bez výsledku. Teď na to nebudu mít čas, tak to dám zatím asi k ledu. Díky

Tak problém vyřešen, 0b11111111 jsem měl 0x11111111, což je trošku něco jinýho :slight_smile:

Dobrý den,
Mám podobný problém s podobnou sestavou (PIC16F877A, displej 128x64 ST7920 (Digole 12864ZW - datasheet v příloze), kompilátor XC8 a následující kód:

#include <xc.h>
#define _XTAL_FREQ 20000000

#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF

#define DATA_OUT PORTD
#define RW PORTAbits.RA4
#define RS PORTAbits.RA5
#define EN PORTAbits.RA3
#define RST PORTAbits.RA0
#define PSB PORTAbits.RA2

void Send_Data(unsigned char data);
void Send_Command(unsigned char command);
void Set_GraphicMode();
void Initialise();
void Clear_Graphics();
void Write_String (unsigned Y ,char * string);

char message[16] =  "ahoj";

void main(void)
{
    __delay_ms(5000);       // Allow time for Vdc to settle on GLCD
    TRISD = 0x00000000;              //Set data port  B as output
    TRISB = 0x00000000;             // Set control port D as output
    TRISA = 0x00000000;
    PSB = 1; //nastaveni paralelni komunikace (podle DS))
    RST = 0;                      // Set reset line to low
    Initialise();                  //Initialise GLCD
    __delay_ms(200);
    while(1)
    {
        Send_Command(0b00000001); //smazani displeje
        Send_Command(0x80);    // Setting location to write characters. In this case 0,0 - Top Left Corner
        Send_Data(0x03);             // Sending a PREDEFINED character as described in ST7920 Datasheet.
        __delay_ms(3000);
        Send_Data(0x04);             // another one
        __delay_ms(3000);
        Send_Data(0x05);             // another one
        __delay_ms(3000);                   // Must send a Clear command otherwise display could be corrupt.
    }
    return;
}


//======================== All the command codes below can be found on the ST7920 datasheet ======================
void Initialise()
{
    __delay_ms(80);
    RS=0;
    RW=0;
    __delay_us(200);
    RST = 1;
    __delay_ms(10);                           // Short delay after resetting.
    Send_Command(0b00110000);    // 8-bit mode.
    __delay_us(200);
    Send_Command(0b00110000);     // 8-bit mode again.
    __delay_us(200);
    Send_Command(0b00001100);     // display on
    __delay_us(200);
    Send_Command(0b00000001);  // Clears screen.
    __delay_ms(20);
    Send_Command(0b00000110);  // Cursor moves right, no display shift.
    __delay_us(80);
    Send_Command(0b00000010);  // Returns to home. Cursor moves to starting point.
}


 //========= Setting the control lines to send a Command to the data bus ================
void Send_Command(unsigned char command)
{
    RW=0;
    RS=0;
    __delay_us(20);
    EN=1;
    DATA_OUT = command;
    __delay_us(50);
    EN=0;
}

//============= Setting the control lines to send Data to the data bus =====================
void Send_Data(unsigned char data)
{
    RW=0;
    RS=1;
    __delay_us(40);
    DATA_OUT = data;
    __delay_us(30);
    EN = 1;
    __delay_us(20);
    EN = 0;
    __delay_us(20);
}


 //======================= Sent Command to set Extanded mode ====================
void Set_GraphicMode()
{
    Send_Command(0b00110100); // Extended instuction set, 8bit
    __delay_us(100);
    Send_Command(0b00110110);   // Repeat instrution with bit1 set
    __delay_us(100);
}


 //=========== This function set all the pixels to off in the graphic controller =================
void Clear_Graphics()
{
    unsigned char x, y;
    for(y = 0; y < 64; y++)
    {
        if(y < 32)
        {
            Send_Command(0x80 | y);
            Send_Command(0x80);
        }
        else
        {
            Send_Command(0x80 | (y-32));
            Send_Command(0x88);
        }
        for(x = 0; x < 16; x++)
        {
            Send_Data(0x00);
        }
    }
}

//==== Send one character at the time from the 'message' string ===========
 void Write_String ( unsigned Y ,char * string )
 {
    Send_Command(Y);
    while(*string!= '\0')      // Looking for code signigying 'end of line' .
    {
        Send_Data(*string++);
    }
 }

Který jsem převzal odtud: microchip.com/forums/m830183.aspx
Ale musel ho upravit pro PIC16.
Čas na náběh LCD jsem nechal 5s, ale poté se nic nestane. Na displeji se nic neobjeví.
Nemohl by jste někdo prosím zkontrolovat správnost příkazů podle datasheetu?
Děkuji za odpověď!
Display 12864ZW.pdf (1010 KB)

Pro inspiraci můžeš zkusit kouknout na tento web a zkusit stáhnout příklady ke vývojový desce PIC-EK.Ti číňani jsou exoti - funkčnost všech příkladů není stoprocentní.Je tam ale příklad,kterej je pro st7920 ,schéma desky.Pro angličtinu je tam potřeba vyřadit jednu proceduru,která tam cpe čínštinu.

Mohl by jste prosím upřesnit, kde se taková procedura vypíná?
Děkuji!

Je to ve funkci write_data.Oni tam používají cyklus na úpravu.Stačí ten cyklus smazat a poslat data přímo (PORTD = Rsspdata;)
Celá funkce by měla vypadat nějak takhle:
void write_data(unsigned char Rsspdata)
{
Rs=0;
RW=1;
E=1;
E=0;
TRISD=0B00000000;
Rs=1;
RW=0;
PORTD = Rsspdata;
E=1;
asm(“NOP”);
asm(“NOP”);
asm(“NOP”);
E=0;
}