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.
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"?
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************************************