Warning: file_get_contents(https://graph.facebook.com/?ids=http%3A%2F%2Fwww.stsystem.pl%2Findex.php%3Foption%3Dcom_content%26view%3Darticle%26id%3D21) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /domains/stsystem.pl/public_html/plugins/content/fbar/fbar.php on line 210

Warning: file_get_contents(https://graph.facebook.com/?ids=http%3A%2F%2Fwww.stsystem.pl%2Findex.php%3Foption%3Dcom_content%26view%3Darticle%26id%3D21) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /domains/stsystem.pl/public_html/plugins/content/fbar/fbar.php on line 210

Temat obsługi wyświetlaczy alfanumerycznych wielokrotnie poruszany jest na forach internetowych. Przyznam szczerze, że w początkach mojej przygody z AVR obsługa tego elementu również była wyzwaniem. Na podstawie wielu różnych dostępnych kursów "zlepiłem" wtedy swoją prostą bibliotekę do obsługi LCD. Poniżej przedstawiam efekty:

- zawartość pliku MACRO_PORT.h

#ifndef MACRO_PORT_H
#define MACRO_PORT_H
#define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1)
#define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2)
#endif
- zawartość pliku lcd.h
#ifndef LCD_H
#define LCD_H
#include "MACRO_PORT.h"
#include <util/delay.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
/* Szybkosc zapisu do wyswietlacza:
SZYBKOSC==0 * Bardzo szybki wyswietlacz - t 1us ****************** 
SZYBKOSC==1 * Szybki wyswietlacz - t 10us ****************** 
SZYBKOSC==2 * Sredni wyswietlacz - t 300us ****************** 
SZYBKOSC==3 * Wolny wyswietlacz - t 1ms ****************** 
SZYBKOSC==4 * Bardzo wolny wyswietlacz - t 3ms ****************** 
*/
#define SZYBKOSC 1#define RSPIN 3
#define RSPORT PORTB#define EPIN 0
#define EPORT PORTB#define D4PIN 4
#define D4PORT PORTA#define D5PIN 5
#define D5PORT PORTA#define D6PIN 6
#define D6PORT PORTA#define D7PIN 7
#define D7PORT PORTA#define Miganie 0
#define WlKursora 0
#define Rollowanie 0
#define WlWyswietl 0
#define CarrReturn 0
//***************************************************************************
#define RSDDR DDR(RSPORT)
#define EDDR DDR(EPORT)
#define D4DDR DDR(D4PORT)
#define D5DDR DDR(D5PORT)
#define D6DDR DDR(D6PORT)
#define D7DDR DDR(D7PORT)
//koniec definicji pinów LCD
#define SET_D4 D4PORT|=(1<<D4PIN)
#define SET_D5 D5PORT|=(1<<D5PIN)
#define SET_D6 D6PORT|=(1<<D6PIN)
#define SET_D7 D7PORT|=(1<<D7PIN)#define CLR_D4 D4PORT&=~(1<<D4PIN)
#define CLR_D5 D5PORT&=~(1<<D5PIN)
#define CLR_D6 D6PORT&=~(1<<D6PIN)
#define CLR_D7 D7PORT&=~(1<<D7PIN)#define SET_E EPORT|=(1<<EPIN)
#define CLR_E EPORT&=~(1<<EPIN)#define SET_RS RSPORT|=(1<<RSPIN)
#define CLR_RS RSPORT&=~(1<<RSPIN)#define CLRDISP 0x01 //czysc wyswietlacz
#define HOMEDISP 0x02 //kursor na pozycje 0,0
#define OFFDISP 0x08 //wylacz ekran
#define ONDISP 0x0c //wlacz ekran
#define SHIFT 0x9f // przesuwanie kursora
//koniec uproszczeń
//******************************************************************************
void LCDcmd(char d); //Wyślij komendę do LCD
//******************************************************************************
void LCDchr(char d); //Wyślij 1 znak do LCD
//******************************************************************************
void LCDinit(void); //inicjalizacja LCD
//******************************************************************************
void LCDcls(void); //wyczyść wyśw.
//******************************************************************************
//wyślij tekst z RAM na wyśw.
void LCDtext(char *txt);
//wyślij tekst z ROM na wyśw.
void LCDpgmtext(const uint8_t *FlashLoc);
//******************************************************************************
//umieść kursor na pozycji x,y - brak kontroli dla x i y
void LCDxy(char x, char y);
//******************************************************************************
//włącz wyswietlacz
//a=1 wł
//a=0 wył
#if WlWyswietl==1
void LCD_ON(char a);
#endif
//******************************************************************************
//wlączanie kurosra 
//a=1 wł
//a=0 wył
#if WlKursora==1
void LCD_CURSOR(char a);
#endif
//******************************************************************************
//miganie kursora
//a=1 wł
//a=0 wył
#if Miganie==1
void LCD_BLINK(char a);
#endif
//******************************************************************************
//przesuwanie tekstu
//a=1 w prawo
//a=2 w lewo
//a=0 wył
#if Rollowanie==1
void LCD_SHIFT(char a);
#endif
//******************************************************************************
//ustaw kursor na pozycji 0,0
#if CarrReturn
void LCDhome(void);
#endif
//******************************************************************************
#endif
- zawartość pliku lcd.c
//**********************************
//TextXY(x,y,text)
//**********************************
//wyczyść wyśw.
//LCDcls(void)
//**********************************
//włącz wyswietlacz
//a=1 wł
//a=0 wył
//LCD_ON(int a) 
//**********************************
//wlączanie kurosra 
//a=1 wł
//a=0 wył
//LCD_CURSOR(int a) 
//**********************************
//miganie kursora
//a=1 wł
//a=0 wył
//LCD_BLINK(int a) 
//**********************************
//przesuwanie tekstu
//a=1 w prawo
//a=2 w lewo
//a=0 wył
//void LCD_SHIFT(int a) 
//**********************************
//ustaw kursor na pozycji 0,0
//LCDhome(void)
//**********************************
//wyślij tekst z RAM na wyśw.
//LCDtext(char *txt)
//**********************************
//umieść kursor na pozycji x,y
//LCDxy(char x,char y)
//**********************************
#include "lcd.h"
//******************************************************************************
void LCDresetdata(void) //wyzeruj szynę danych LCD
{
CLR_D4;
CLR_D5;
CLR_D6;
CLR_D7;
}
//******************************************************************************
void LCDwrite(char d) //zapis bajtu do LCD
{
LCDresetdata();
SET_E;
if (d & 0x10) {
SET_D4;
}
if (d & 0x20) {
SET_D5;
}
if (d & 0x40) {
SET_D6;
}
if (d & 0x80) {
SET_D7;
}
CLR_E;
LCDresetdata();
SET_E;
if (d & 0x01) {
SET_D4;
}
if (d & 0x02) {
SET_D5;
}
if (d & 0x04) {
SET_D6;
}
if (d & 0x08) {
SET_D7;
}
CLR_E;#if SZYBKOSC==0
_delay_us(1);
#warning ****************** Bardzo szybki wyswietlacz - t 1us ******************
#elif SZYBKOSC==1
_delay_us(10);
#warning ****************** Szybki wyswietlacz - t 10us ******************
#elif SZYBKOSC==2
_delay_us(250);
_delay_us(50);
#warning ****************** Sredni wyswietlacz - t 300us ******************
#elif SZYBKOSC==3
_delay_ms(1);
#warning ****************** Wolny wyswietlacz - t 1ms ******************
#elif SZYBKOSC==4
_delay_ms(3);
#warning ****************** Bardzo wolny wyswietlacz - t 3ms ******************
#else 
#error Nie wybrano szybkosci wyswietlacza!!!
#endif
}//******************************************************************************
void LCDcmd(char d) //Wyślij komendę do LCD
{
CLR_RS;
LCDwrite(d);
return;
}
//******************************************************************************
void LCDchr(char d) //Wyślij 1 znak do LCD
{
SET_RS;
LCDwrite(d);
return;
}
//******************************************************************************
void LCDinit(void) //inicjalizacja LCD
{
RSDDR |= (1 << RSPIN);
EDDR |= (1 << EPIN);
D4DDR |= (1 << D4PIN);
D5DDR |= (1 << D5PIN);
D6DDR |= (1 << D6PIN);
D7DDR |= (1 << D7PIN);
CLR_RS;
CLR_E;
_delay_ms(20);
CLR_D7;
CLR_D6;
SET_D4;
SET_D5;
unsigned char i;
for (i = 0; i < 3; i++) {
SET_E;
_delay_us(10);
CLR_E;
_delay_ms(5);
}
CLR_D4;
SET_E;
_delay_us(10);
CLR_E;
_delay_ms(5);
LCDcmd(0x28); //function set - interface=4 bit,line=2,font=5x7
LCDcmd(ONDISP); //display ctrl - display on
LCDcmd(0x06); //entry mode set - increment
LCDcmd(0x01); //clear display
return;
}
//******************************************************************************
//wyczyść wyśw.
void LCDcls(void) {
LCDcmd(CLRDISP);
return;
}
//******************************************************************************
//włącz wyswietlacz
//a=1 wł
//a=0 wył
#if WlWyswietl
void LCD_ON(char a) {
if (a) {
LCDcmd(ONDISP);
} else {
LCDcmd(OFFDISP);
}
return;
}
#endif
//******************************************************************************
//wlączanie kurosra 
//a=1 wł
//a=0 wył
#if WlKursora==1
void LCD_CURSOR(char a) {
if (a) {
LCDcmd(ONDISP | 0x02);
} else {
LCDcmd(ONDISP);
}
return;
}
#endif
//******************************************************************************
//miganie kursora
//a=1 wł
//a=0 wył
#if Miganie==1
void LCD_BLINK(char a) {
if (a) {
LCDcmd(ONDISP | 0x01);
} else {
LCDcmd(ONDISP);
}
return;
}
#endif
//******************************************************************************
//przesuwanie tekstu
//a=1 w prawo
//a=2 w lewo
//a=0 wył
#if Rollowanie==1
void LCD_SHIFT(char a) {
if (a == 1) {
LCDcmd(SHIFT | 0x04);
} //w prawo
else if (a == 2) {
LCDcmd(SHIFT);
} // w lewo
else {
LCDcmd(ONDISP);
} // wyłączenie przesuwania
return;
}
#endif
//******************************************************************************
//ustaw kursor na pozycji 0,0
#if CarrReturn==1
void LCDhome(void) {
LCDcmd(HOMEDISP);
return;
}
#endif
//******************************************************************************
//wyślij tekst z RAM na wyśw.
void LCDtext(char *txt) {
while (*txt) {
LCDchr(*txt++);
}
return;
}void LCDpgmtext(const uint8_t *FlashLoc) {
register char znak;
while((znak=pgm_read_byte(FlashLoc++)))
LCDchr(znak);
return;
}
//******************************************************************************
//umieść kursor na pozycji x,y - brak kontroli dla x i y
void LCDxy(char x, char y) {
unsigned char com = 0x80;
com |= (x | (y << 6));
LCDcmd(com);
return;
}
//******************************************************************************
Do swojego projektu dodajemy poprzez #include plik lcd.h. Jak widać, w pliku tym znajduje się kilka zmiennych wymagających konfiguracji pod kątem konkretnej aplikacji. Są to:- nazwy i numery użytych wyprowadzeń- "szybkość" zapisu do wyświetlacza, ja standardowo używam tu wartości 1, lecz zdarzają się wyświetlacze wymagające wyższej wartości- parametry pracy samego wyświetlacza (rollowanie, mruganie itp. )Wyświetlacz pracuje w standardowej konfiguracji:- tryb 4-ro bitowy- sygnały RS i E podłączone do mikrokontrolera- sygnał RW podłączony do GNDReasumując - bezwzględnym minimum do skonfigurowania są poniższe linijki:
#define SZYBKOSC 1#define RSPIN 3
#define RSPORT PORTB#define EPIN 0
#define EPORT PORTB#define D4PIN 4
#define D4PORT PORTA#define D5PIN 5
#define D5PORT PORTA#define D6PIN 6
#define D6PORT PORTA#define D7PIN 7
#define D7PORT PORTA
Ze względu na zaoszczędzenie jednego pinu procesora oraz garści pamięci programu pin RW na stałe podłączony jest do masy. Niestety wymusza to wprowadzenie zmiennej SZYBKOŚĆ umożliwiającej dobranie prędkości wysyłanych do wyświetlacza danych pod konkretny egzemplarz. W przypadku problemów z uruchomieniem wyświetlacza proponuję rozpoczęcie pracy z wartością szybkości ustawioną na 4 i sucesywne jej zmniejszanie. OBSŁUGANa samym początku programu, przed główną petlą umieszczamy kod:
LCDinit();
LCDcls();
Następnie w głównej pętli programu wykorzystujemy sekwencje:
LCDxy(0,0); //ustawienie pozycjiLCDtext("moj tekst"); //wyswietlenie tekstu
Zamiast stringu "moj tekst" możemy także napisać coś takiego:
LCDtext(utoa(value,result,10));
gdzie:- value - zmienna uint 16- result - bufor w formie tablicy char o rozmiarze 6 znaków (5 znaków dla maksymalnej wartości 65535 + 1 znak na znak końca linii)- 10 - podstawa liczbowa wyświetlania (dla innych podstaw wyświetlania KONIECZNA JEST zmiana rozmiary bufora wynikowego result - w przeciwnym wypadku program nam się najzwyczajniej "wykrzaczy" a kompilator nikoniecznie nas o tym poinformuje...)Dostępna jest również funkcja do wyświetlania tekstu zapisanego w pamięci programu:
void LCDpgmtext(nazwa);
gdzie "nazwa" to:
const uint8_t nazwa[] PROGMEM="moj tekst";
Jeżeli zabrnąłeś aż tutaj to bardzo mi miło :) Polecam, abyś zapoznał się także z tym wpisem. Na jego podstawie w łatwy sposób przyswoisz informacje zawarte tutaj.

Do pobrania:

Użyj opcji uploadu plików, aby przekazać mi kod do sprawdzenia. Postaram się zajrzeć do niego tak szybko jak będzie to możliwe. Paczkę z poprawionym kodem umieszczę w tym samym miejscu.

 

 

Jeżeli wystąpi sytuacja, w której zostanie wyświetlona zawartość folderu z innego działu - należy wyczyścić cache przeglądarki! Następnie przeładować stronę.

Komentarze  

 
# DanielDaniel 2016-10-26 08:43
cell phone lookup by name I was just searching for this
Odpowiedz | Odpowiedz z cytatem | Cytować
 

Licznik odwiedzin

Mapa odwiedzin



 

Copyright © ST WebSite 2017

Stronę hostuje FutureHost. []

Strona korzysta z plików cookie. Dane przechowywane na Twoim komputerze służą wyłą…cznie do poprawienia funkcjonalnoś›ci witryny. Jeżeli tego nie akceptujesz - powinieneś› ją… opuś›cić‡.

Akceptujesz ciasteczka z tej witryny?