forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
LCD 128x64 PIC16F877 nejde načíst hodnota bytu

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
B0sc0
Profesionál
Profesionál


Založen: 28.1.2011
Příspěvky: 221
Bydliště: Absurdistán nebo Banánová republika

PříspěvekZaslal: 20 únor 2015, 20:11    Předmět: LCD 128x64 PIC16F877 nejde načíst hodnota bytu Citovat

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.

kód:
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[i] );
   Select_page(0);
   for(i=0; i<4; i++)
      GLCD_Comd( Comd[i] );
}
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);
   }
}



20150220_191125.jpg
 Komentář:

Stáhnout
 Soubor:  20150220_191125.jpg
 Velikost:  408.71 kB
 Staženo:  194 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
kolemjdoucí
Anonymní





PříspěvekZaslal: 21 únor 2015, 0:32    Předmět: Citovat

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

 
B0sc0
Profesionál
Profesionál


Založen: 28.1.2011
Příspěvky: 221
Bydliště: Absurdistán nebo Banánová republika

PříspěvekZaslal: 21 únor 2015, 9:25    Předmět: Citovat

Doplnil jsem to tedy o načtení napřed do proměnné, ale bez výsledku Sad
Už to nevypisuje to co před tím, ale furt to nevypíše to co to má vypsat
kód:
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);
   }

_________________
MPLAB + HI-TECH + PICKIT2
Zatím jenom amatér Smile a asi i navždy
SMT technolog+vše okolo LED modulů
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Sender
Profesionál
Profesionál


Založen: 16.8.2014
Příspěvky: 56

PříspěvekZaslal: 22 únor 2015, 1:08    Předmět: Citovat

Je to s řadičem KS0108 ? Mělo by se využívat busy (viz datasheet).Pozor na časový prodlevy (taky v datasheetu).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
B0sc0
Profesionál
Profesionál


Založen: 28.1.2011
Příspěvky: 221
Bydliště: Absurdistán nebo Banánová republika

PříspěvekZaslal: 22 únor 2015, 10:05    Předmět: Citovat

Ano, je to řadič KS0108. Zkusím ošetřit tedy busy a prodlevy. Díky za rady
_________________
MPLAB + HI-TECH + PICKIT2
Zatím jenom amatér Smile a asi i navždy
SMT technolog+vše okolo LED modulů
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Sender
Profesionál
Profesionál


Založen: 16.8.2014
Příspěvky: 56

PříspěvekZaslal: 22 únor 2015, 11:34    Předmět: Citovat

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ávrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
B0sc0
Profesionál
Profesionál


Založen: 28.1.2011
Příspěvky: 221
Bydliště: Absurdistán nebo Banánová republika

PříspěvekZaslal: 25 únor 2015, 21:05    Předmět: Citovat

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
_________________
MPLAB + HI-TECH + PICKIT2
Zatím jenom amatér Smile a asi i navždy
SMT technolog+vše okolo LED modulů
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
B0sc0
Profesionál
Profesionál


Založen: 28.1.2011
Příspěvky: 221
Bydliště: Absurdistán nebo Banánová republika

PříspěvekZaslal: 07 březen 2015, 17:48    Předmět: Citovat

Tak problém vyřešen, 0b11111111 jsem měl 0x11111111, což je trošku něco jinýho Smile
_________________
MPLAB + HI-TECH + PICKIT2
Zatím jenom amatér Smile a asi i navždy
SMT technolog+vše okolo LED modulů
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 02 červenec 2015, 8:04    Předmět: Citovat

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:
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: http://www.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
 Komentář:

Stáhnout
 Soubor:  Display 12864ZW.pdf
 Velikost:  1010.86 kB
 Staženo:  118 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Sender
Profesionál
Profesionál


Založen: 16.8.2014
Příspěvky: 56

PříspěvekZaslal: 02 červenec 2015, 22:01    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Matyáš
Profesionál
Profesionál


Založen: 2.4.2014
Příspěvky: 49

PříspěvekZaslal: 03 červenec 2015, 8:02    Předmět: Citovat

Mohl by jste prosím upřesnit, kde se taková procedura vypíná?
Děkuji!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Sender
Profesionál
Profesionál


Založen: 16.8.2014
Příspěvky: 56

PříspěvekZaslal: 03 červenec 2015, 23:10    Předmět: Citovat

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;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2018 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)