Witam piszę prosty program wyświetlający różne zmienne z programu na wyświetlaczu LCD.
Wyświetlacz podłączyłem i wszstko gra, moge wyświetlać napisy ale nie mogę wyświetlić zmiennych.
podam kod do mojego programu i krótko go opiszę:
Program miał wyswietlac godzinę na wyświetlaczu, do odliczania 1 sekundy wykorzystałem timer 16 bitowy z preskalerem 64. Chciałem wyświetlić chociaz jedną zmienna ale nic z tego
poczytałem troszkę i znalazłem funkcję itoa wykorzystałem ją i było prawie dobrze bo wyświetlało 1,2,3....9 a potem krzaki.
Jak wyświetlić zmienne wykorzystując gotową bibliotekę zamieszczoną poniżej?
Oto mój program:
Jak widać dodałem bibliotekę HD44780 którą widać poniżej:
HD44780.h
HD47780.c
Proszę o pomoc w wyswietleniu z zmiennych int lub innych liczbowych
znalazłem jeszcze coś takiego ale to też działać nie chce:
Wyświetlacz podłączyłem i wszstko gra, moge wyświetlać napisy ale nie mogę wyświetlić zmiennych.
podam kod do mojego programu i krótko go opiszę:
Program miał wyswietlac godzinę na wyświetlaczu, do odliczania 1 sekundy wykorzystałem timer 16 bitowy z preskalerem 64. Chciałem wyświetlić chociaz jedną zmienna ale nic z tego
poczytałem troszkę i znalazłem funkcję itoa wykorzystałem ją i było prawie dobrze bo wyświetlało 1,2,3....9 a potem krzaki.
Jak wyświetlić zmienne wykorzystując gotową bibliotekę zamieszczoną poniżej?
Oto mój program:
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <HD44780.c>
int WriteInt(int variable, int col, int row)
{
int i, n, temp, p;
p=0;
if(variable == 0)
{
LCD_WriteText("0");
return 0;
}
if(variable < 0)
{
variable = (-1)*variable;
LCD_GoTo(col, row);
LCD_WriteText("-");
p=1;
}
temp = variable;
n = 0;
while(temp>0)
{
n++;
temp = temp/10;
}
char txt[n];
for(i=n-1; i>=0; i--)
{
txt[i] = variable%10 + 0x30;
variable = variable/10;
}
for(i=0; i<n; i++)
{
LCD_GoTo(col+i+p, row);
LCD_WriteText(txt[i]);
}
}
int main(void)
{
LCD_Initalize();
LCD_Clear();
LCD_GoTo(1,0);
LCD_WriteText("W I T A M");
LCD_GoTo(3,1);
LCD_WriteText("NELIK :)");
DDRC = 0; // Ustawienie rejestru B jako wejście (PRZYCISKI)
//PORTC |= _BV(0); //Ustaw PC0 w stan wysoki (podciągnięcie do jedynki)
//PORTC |= _BV(1); //Ustaw PC1 w stan wysoki (podciągnięcie do jedynki)
unsigned int sekundy = 0;
unsigned int minuty = 0;
unsigned int godziny = 0;
unsigned char buf;
TCCR1B |= ((1 << CS01) | (1 << CS00)); //Ustawia timer0 z preskalerem Fcpu/64
while(1)
{
if(TCNT1>=15625) // jeżeli mineła 1 sekunda
{
sekundy++;
if(sekundy>=60)
{
sekundy=0;
minuty++;
if(minuty>=60)
{
minuty=0;
godziny++;
if(godziny>=24)
godziny=0;
}
}
LCD_GoTo(0,0);
buf=sekundy;
itoa(sekundy,buf,10);
//LCD_WriteText(buf);
WriteInt(sekundy,0,0);
TCNT1 = 0; // Zeruje wartość timera
}
}
return 0;
}Jak widać dodałem bibliotekę HD44780 którą widać poniżej:
HD44780.h
//-------------------------------------------------------------------------------------------------
// Wyświetlacz alfanumeryczny ze sterownikiem HD44780
// Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
// z dowolnym przypisaniem sygnałów sterujących
// Plik : HD44780.h
// Mikrokontroler : Atmel AVR
// Kompilator : avr-gcc
// Autor : Radosław Kwiecień
// Źródło : http://radzio.dxp.pl/hd44780/
// Data : 24.03.2007
//-------------------------------------------------------------------------------------------------
#include <avr/io.h>
#include <util/delay.h>
//-------------------------------------------------------------------------------------------------
//
// Konfiguracja sygnałów sterujących wyświetlaczem.
// Można zmienić stosownie do potrzeb.
//
//-------------------------------------------------------------------------------------------------
#define LCD_RS_DIR DDRD
#define LCD_RS_PORT PORTD
#define LCD_RS_PIN PIND
#define LCD_RS (1 << PD0)
#define LCD_RW_DIR DDRD
#define LCD_RW_PORT PORTD
#define LCD_RW_PIN PIND
#define LCD_RW (1 << PD1)
#define LCD_E_DIR DDRD
#define LCD_E_PORT PORTD
#define LCD_E_PIN PIND
#define LCD_E (1 << PD2)
#define LCD_DB4_DIR DDRB
#define LCD_DB4_PORT PORTB
#define LCD_DB4_PIN PINB
#define LCD_DB4 (1 << PB0)
#define LCD_DB5_DIR DDRB
#define LCD_DB5_PORT PORTB
#define LCD_DB5_PIN PINB
#define LCD_DB5 (1 << PB1)
#define LCD_DB6_DIR DDRB
#define LCD_DB6_PORT PORTB
#define LCD_DB6_PIN PINB
#define LCD_DB6 (1 << PB2)
#define LCD_DB7_DIR DDRB
#define LCD_DB7_PORT PORTB
#define LCD_DB7_PIN PINB
#define LCD_DB7 (1 << PB3)
//-------------------------------------------------------------------------------------------------
//
// Instrukcje kontrolera Hitachi HD44780
//
//-------------------------------------------------------------------------------------------------
#define HD44780_CLEAR 0x01
#define HD44780_HOME 0x02
#define HD44780_ENTRY_MODE 0x04
#define HD44780_EM_SHIFT_CURSOR 0
#define HD44780_EM_SHIFT_DISPLAY 1
#define HD44780_EM_DECREMENT 0
#define HD44780_EM_INCREMENT 2
#define HD44780_DISPLAY_ONOFF 0x08
#define HD44780_DISPLAY_OFF 0
#define HD44780_DISPLAY_ON 4
#define HD44780_CURSOR_OFF 0
#define HD44780_CURSOR_ON 2
#define HD44780_CURSOR_NOBLINK 0
#define HD44780_CURSOR_BLINK 1
#define HD44780_DISPLAY_CURSOR_SHIFT 0x10
#define HD44780_SHIFT_CURSOR 0
#define HD44780_SHIFT_DISPLAY 8
#define HD44780_SHIFT_LEFT 0
#define HD44780_SHIFT_RIGHT 4
#define HD44780_FUNCTION_SET 0x20
#define HD44780_FONT5x7 0
#define HD44780_FONT5x10 4
#define HD44780_ONE_LINE 0
#define HD44780_TWO_LINE 8
#define HD44780_4_BIT 0
#define HD44780_8_BIT 16
#define HD44780_CGRAM_SET 0x40
#define HD44780_DDRAM_SET 0x80
//-------------------------------------------------------------------------------------------------
//
// Deklaracje funkcji
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteCommand(unsigned char);
unsigned char LCD_ReadStatus(void);
void LCD_WriteData(unsigned char);
unsigned char LCD_ReadData(void);
void LCD_WriteText(char *);
void LCD_GoTo(unsigned char, unsigned char);
void LCD_Clear(void);
void LCD_Home(void);
void LCD_Initalize(void);
void LCD_ProgrammChar(unsigned char nr, unsigned char znak[]);
//-------------------------------------------------------------------------------------------------
//
// Koniec pliku HD44780.h
//
//-------------------------------------------------------------------------------------------------
HD47780.c
//-------------------------------------------------------------------------------------------------
// Wyświetlacz alfanumeryczny ze sterownikiem HD44780
// Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
// z dowolnym przypisaniem sygnałów sterujących
// Plik : HD44780.c
// Mikrokontroler : Atmel AVR
// Kompilator : avr-gcc
// Autor : Radosław Kwiecień
// Źródło : http://radzio.dxp.pl/hd44780/
// Data : 24.03.2007
//-------------------------------------------------------------------------------------------------
#include "HD44780.h"
//-------------------------------------------------------------------------------------------------
//
// Funkcja wystawiająca półbajt na magistralę danych
//
//-------------------------------------------------------------------------------------------------
void _LCD_OutNibble(unsigned char nibbleToWrite)
{
if(nibbleToWrite & 0x01)
LCD_DB4_PORT |= LCD_DB4;
else
LCD_DB4_PORT &= ~LCD_DB4;
if(nibbleToWrite & 0x02)
LCD_DB5_PORT |= LCD_DB5;
else
LCD_DB5_PORT &= ~LCD_DB5;
if(nibbleToWrite & 0x04)
LCD_DB6_PORT |= LCD_DB6;
else
LCD_DB6_PORT &= ~LCD_DB6;
if(nibbleToWrite & 0x08)
LCD_DB7_PORT |= LCD_DB7;
else
LCD_DB7_PORT &= ~LCD_DB7;
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja wystawiająca półbajt na magistralę danych
//
//-------------------------------------------------------------------------------------------------
unsigned char _LCD_InNibble(void)
{
unsigned char tmp = 0;
if(LCD_DB4_PIN & LCD_DB4)
tmp |= (1 << 0);
if(LCD_DB5_PIN & LCD_DB5)
tmp |= (1 << 1);
if(LCD_DB6_PIN & LCD_DB6)
tmp |= (1 << 2);
if(LCD_DB7_PIN & LCD_DB7)
tmp |= (1 << 3);
return tmp;
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
//
//-------------------------------------------------------------------------------------------------
void _LCD_Write(unsigned char dataToWrite)
{
LCD_DB4_DIR |= LCD_DB4;
LCD_DB5_DIR |= LCD_DB5;
LCD_DB6_DIR |= LCD_DB6;
LCD_DB7_DIR |= LCD_DB7;
LCD_RW_PORT &= ~LCD_RW;
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite >> 4);
LCD_E_PORT &= ~LCD_E;
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite);
LCD_E_PORT &= ~LCD_E;
while(LCD_ReadStatus()&0x80);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja odczytu bajtu z wyświetacza (bez rozróżnienia instrukcja/dane).
//
//-------------------------------------------------------------------------------------------------
unsigned char _LCD_Read(void)
{
unsigned char tmp = 0;
LCD_DB4_DIR &= ~LCD_DB4;
LCD_DB5_DIR &= ~LCD_DB5;
LCD_DB6_DIR &= ~LCD_DB6;
LCD_DB7_DIR &= ~LCD_DB7;
LCD_RW_PORT |= LCD_RW;
LCD_E_PORT |= LCD_E;
tmp |= (_LCD_InNibble() << 4);
LCD_E_PORT &= ~LCD_E;
LCD_E_PORT |= LCD_E;
tmp |= _LCD_InNibble();
LCD_E_PORT &= ~LCD_E;
return tmp;
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu rozkazu do wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteCommand(unsigned char commandToWrite)
{
LCD_RS_PORT &= ~LCD_RS;
_LCD_Write(commandToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja odczytu bajtu statusowego
//
//-------------------------------------------------------------------------------------------------
unsigned char LCD_ReadStatus(void)
{
LCD_RS_PORT &= ~LCD_RS;
return _LCD_Read();
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu danych do pamięci wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteData(unsigned char dataToWrite)
{
LCD_RS_PORT |= LCD_RS;
_LCD_Write(dataToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja odczytu danych z pamięci wyświetlacza
//
//-------------------------------------------------------------------------------------------------
unsigned char LCD_ReadData(void)
{
LCD_RS_PORT |= LCD_RS;
return _LCD_Read();
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja wyświetlenia napisu na wyswietlaczu.
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteText(char * text)
{
while(*text)
LCD_WriteData(*text++);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja ustawienia współrzędnych ekranowych
//
//-------------------------------------------------------------------------------------------------
void LCD_GoTo(unsigned char x, unsigned char y)
{
LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja czyszczenia ekranu wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Clear(void)
{
LCD_WriteCommand(HD44780_CLEAR);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Home(void)
{
LCD_WriteCommand(HD44780_HOME);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Procedura inicjalizacji kontrolera HD44780.
//
//-------------------------------------------------------------------------------------------------
void LCD_Initalize(void)
{
unsigned char i;
LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
LCD_DB5_DIR |= LCD_DB5; //
LCD_DB6_DIR |= LCD_DB6; //
LCD_DB7_DIR |= LCD_DB7; //
LCD_E_DIR |= LCD_E; //
LCD_RS_DIR |= LCD_RS; //
LCD_RW_DIR |= LCD_RW; //
_delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
LCD_E_PORT &= ~LCD_E; // wyzerowanie linii E
LCD_RW_PORT &= ~LCD_RW;
for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
{
LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x03); // tryb 8-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(5); // czekaj 5ms
}
LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x02); // tryb 4-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(1); // czekaj 1ms
LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
}
// funkcja służąca do wpisywania własnych znaków
// nr - zmienna określająca numer znaku (dostępnych jest 8) od 0 - 7.
// znak[] - określa kształt znaku.. przykładowo uint8_t serduszko[] = {4, 10, 17, 23, 23, 17, 31, 0}; definiuje wygląd serca.
void LCD_ProgrammChar(unsigned char nr, unsigned char znak[])
{
unsigned char i;
LCD_WriteCommand(HD44780_CGRAM_SET|(nr*8));
for (i=0; i<=7; i++)
{
LCD_WriteData(znak[i]);
}
LCD_WriteCommand(HD44780_DDRAM_SET);
}
//-------------------------------------------------------------------------------------------------
//
// Koniec pliku HD44780.c
//
//-------------------------------------------------------------------------------------------------
Proszę o pomoc w wyswietleniu z zmiennych int lub innych liczbowych
znalazłem jeszcze coś takiego ale to też działać nie chce:
int WriteInt(int variable, int col, int row)
{
int i, n, temp, p;
p=0;
if(variable == 0)
{
LCD_WriteText("0");
return 0;
}
if(variable < 0)
{
variable = (-1)*variable;
LCD_GoTo(col, row);
LCD_WriteText("-");
p=1;
}
temp = variable;
n = 0;
while(temp>0)
{
n++;
temp = temp/10;
}
char txt[n];
for(i=n-1; i>=0; i--)
{
txt[i] = variable%10 + 0x30;
variable = variable/10;
}
for(i=0; i<n; i++)
{
LCD_GoTo(col+i+p, row);
LCD_WriteText(txt[i]);
}
}