logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega][C] kod LCD 2*16 - problem z wyświetlaniem liczby

karolczyzycki 31 Lip 2010 15:47 2186 4
REKLAMA
  • #1 8351074
    karolczyzycki
    Poziom 20  
    Witam.
    Mam kod do wyświetlenia napisów na LCD do dla Atmegi.
    Problem polega na tym że za pomocą tego kodu potrafię wyświetlić tylko znak i tekst, nie umiem wyświetlić liczby.
    Przykładowo stanu licznika, albo najprościej.

    int i=0;
    
    	if (bit_is_clear(PINB,PINB0)){
    			i++;
    	         PORTD&= ~(1<<PORTD1);  //przypisanie "0" na portD6 
    	        }else{
    	           PORTD|= (1<<PORTD1);   //przypisanie "1" na portD6      
    			}


    z każdym kolejnym wciśnięciem przycisku "i" się zwiększa ale nie potrafię wyświetlić tego na LCD
    Poniżej wstawiony kod pozwala na wyświetlanie tekstu lub znaku, można jakoś to zmienić żebym mógł wyświetlić wartość "i"?
    
    //***************************************************funkcje LCD****************************************
    // funkcja wystawiająca na szynę danych połówkę bajtu, pod uwagę brana jest młodsza połówka parametru
    void out_nibble(char x)
    {
    if(x & _BV(0)) SET_DA4; else  CLR_DA4;
    if(x & _BV(1)) SET_DA5; else  CLR_DA5;
    if(x & _BV(2)) SET_DA6; else  CLR_DA6;
    if(x & _BV(3)) SET_DA7; else  CLR_DA7;
    }
    // funkcja zapisująca do LCD bajt danych
    void write_to_lcd(char x)
    {
    SET_E;
    out_nibble(x >> 4); // wystawienie na szynę danych starszej połówki bajtu
    CLR_E; // opadające zbocze na E powoduje zapis do wyświetlacza
    SET_E;
    out_nibble(x); // wystawienie na szynę danych młodszej połówki bajtu
    CLR_E; // opadające zbocze na E powoduje zapis do wyświetlacza
    _delay_ms(10); // opóźnienie ok 1 ms
    }
    // funkcja zapisująca do LCD rozkaz
    void write_command(char x)
    {
    CLR_RS; // niski stan na RS -> zapis instrukcji
    write_to_lcd(x); // zapis do LCD
    }
    // funkcja zapisujaca do LCD znak
    void write_char(char x)
    {
    SET_RS; // wysoki stan na RS -> zapis danej
    write_to_lcd(x); // zapis do LCD
    }
    // funkcja zapisu tekstu do wyświetlacza LCD
    void write_text(char * s)
    {
    while(*s) // do napotkania 0
      {
      write_char(*s); // zapisz znak wskazywany przez s na LCD
      s++; // zwiększ s (przygotuj nastepny znak)
      }
    }
    // funkcja inicjująca LCD
    void lcd_init(void)
    {
    // ustawienie wszystkich linii sterujących LCD jako wyjścia
    DDR_DA4 |= _BV(DA4);
    DDR_DA5 |= _BV(DA5);
    DDR_DA6 |= _BV(DA6);
    DDR_DA7 |= _BV(DA7);
    DDR_E |= _BV(E);
    DDR_RS |= _BV(RS);
    
    //DDRA|= (1<<DDA1); // LCD BLINK 
    //PORTA|= (1<<PORTA1);   //przypisanie "1" na portA1   (POŚWIETLENIE lcd)
    
    
    //
    _delay_ms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
    CLR_E; // E = 0
    CLR_RS; // RS = 0
    char f; // zmianna licznikowa
    for(f = 0; f < 3; f++) // trzykrotne powtórzenie bloku instrukcji
      {
      SET_E; // E = 1
      out_nibble(0x03);
      CLR_E; // E = 0
      _delay_ms(5); // czekaj 5ms
      }
    SET_E; // E = 1
    out_nibble(0x02);
    CLR_E; // E = 0
    _delay_ms(1); // czekaj 1ms
    write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
    write_command(0x08); // wyłącz LCD, kursor i miganie
    write_command(0x01); // czyść LCD
    write_command(0x06); // bez przesuwania w prawo
    write_command(0x0C); // włącz LCD, bez kursora i mrugania
    }
    void LCDxy(char x,char y)
    {
       unsigned char com=0x80;
       com|=(x|(y<<6));
       write_command(com);
    }
    
    void LCD_clear(void)
    {
      write_command(0x01);	// wyczyść LCD
      waitms(3);		// czekaj chwilę
      LCDxy(0,0);		// ustaw kursor na początek
    }
    
    //*************************************************************koniec kodu finkcji LCD************************************
    
  • REKLAMA
  • #2 8351109
    tadzik85
    Poziom 38  
    itoa(); załatwi problem
  • REKLAMA
  • #3 8351127
    karolczyzycki
    Poziom 20  
    no i tym czytałem ze to zamiana chyba char na ascii...

    int i=0;
    char buffer [33];
    itoa(i,buffer,2);'


    Mam coś takiego, ale nie wiem jak tego użyć...
  • REKLAMA
  • #5 8351152
    karolczyzycki
    Poziom 20  
    Super, gra. Dzięki.
REKLAMA