Witam,
Pracuję na zestawie ZL3AVR z Kamami. Kwarc mam ustawiony na wewnętrzny 8MHz.
Przerabiam lekcję 15 z Kursu programowania mikrokontrolerów w języku C z EdW.
Podłączyłem wyświetlacz zgodnie z kursem, ale nic się nie pojawiło na wyświetlaczu. Sprawdzałem połączenia, przylutowałem przewody do drugiego wyświetlacze i też nic.
Poniż zamieszczam kod:
W tych wyświetlaczach też są różne sterowniki. Udało się komuś odpalić coś na tym wyświetlaczu. Jak na forum mikrokontrolerów AVR na elektrodzie wpisałem 3510i to dostałem z 10-15 postów. Większość w fazie uruchamiania.
Może tutaj też jest problem z inicjalizacją??
Opis z EdW:
http://www.sendspace.com/file/4xztfd
Pracuję na zestawie ZL3AVR z Kamami. Kwarc mam ustawiony na wewnętrzny 8MHz.
Przerabiam lekcję 15 z Kursu programowania mikrokontrolerów w języku C z EdW.
Podłączyłem wyświetlacz zgodnie z kursem, ale nic się nie pojawiło na wyświetlaczu. Sprawdzałem połączenia, przylutowałem przewody do drugiego wyświetlacze i też nic.
Poniż zamieszczam kod:
////////////////////////////////////////////////////////////////////////////////////////////
// main.c - plik główny pierwszego uruchomienia wyświetlacza Nokia3510i
//
// przeznaczenie: "Programowanie procesorów w języku C (EdW)"
//
// Autor: Radosław Koppel Kompilator: WinAVR 20050214
////////////////////////////////////////////////////////////////////////////////////////////
#include <avr\io.h>
#include <inttypes.h>
#include <util\delay.h>
#include "makra.h"
#include "harddef.h"
#include "lcd3510i.h"
int main(void)
{
// Inicjacja wyprowadzeń
DDR(LCD_PORT) = 1<<LCD_RES | 1<<LCD_SCK | 1<<LCD_SIO | 1<<LCD_CS;
PORT(LCD_PORT) = 1<<LCD_SCK | 1<<LCD_SIO | 1<<LCD_CS;
// Inicjacja portu SPI
#if defined LCD_HARDWARE_SPI
SPCR = 1<<SPE | 1<<MSTR | 1<<CPOL | 1<<CPHA;
SPSR = 1<<SPI2X;
#endif
// Inicjacja wyświetlacza
lcd_Init();
// Włączenie wyświetlacza
lcd_On();
uint16_t n;
lcd_Command(LCD_RAMWR); // Komenda zapisu do pamięci
for(;;)
{
// Po 6 linii każdego koloru (3 baity - 2 piksele)
// Biały
for(n=0; n<882; n++)
{
lcd_Data(0xFF);
}
// Szary
for(n=0; n<882; n++)
{
lcd_Data(0x77);
}
// Czarny
for(n=0; n<882; n++)
{
lcd_Data(0);
}
// Czerwony
for(n=0; n<294; n++)
{
lcd_Data(0xF0);
lcd_Data(0x0F);
lcd_Data(0x00);
}
// Zielony
for(n=0; n<294; n++)
{
lcd_Data(0x0F);
lcd_Data(0);
lcd_Data(0xF0);
}
// Niebieski
for(n=0; n<294; n++)
{
lcd_Data(0);
lcd_Data(0xF0);
lcd_Data(0x0F);
}
// Żółty
for(n=0; n<294; n++)
{
lcd_Data(0xFF);
lcd_Data(0x0F);
lcd_Data(0xF0);
}
// Pomarańczowy
for(n=0; n<294; n++)
{
lcd_Data(0xF7);
lcd_Data(0x0F);
lcd_Data(0x70);
}
// Jasny fiolet
for(n=0; n<294; n++)
{
lcd_Data(0xF0);
lcd_Data(0xFF);
lcd_Data(0x0F);
}
// Ciemny fiolet
for(n=0; n<294; n++)
{
lcd_Data(0x90);
lcd_Data(0xF9);
lcd_Data(0x0F);
}
// Jasny niebieski
for(n=0; n<294; n++)
{
lcd_Data(0x0F);
lcd_Data(0xF0);
lcd_Data(0xFF);
}
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
// lcd3510i.c - Biblioteka obsługi wyświetlacza Nokia3510i
//
// Autor: Radosław Koppel Kompilator: WinAVR 20050214
////////////////////////////////////////////////////////////////////////////////////////////
#include <avr\io.h>
#include <inttypes.h>
#include <util\delay.h>
#include "makra.h"
#include "harddef.h"
#include "lcd3510i.h"
//__________________________________________________________________________________________
// Funkcje niskiego poziomu
// Pomocnicza funkcja wewnętrzna realizująca szybkie wyszeregowanie
static inline void lcd_serout(uint8_t data)
{
// 7
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<7)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// 6
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<6)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// 5
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<5)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// 4
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<4)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// 3
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<3)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// 2
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<2)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// 1
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<1)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// 0
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
if(data & 1<<0)
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
}
// Funkcja przesyła instrukcje
void lcd_Command(uint8_t command)
{
PORT(LCD_PORT) &= ~(1<<LCD_CS);
#if defined LCD_HARDWARE_SPI
// Wyłączenie spi
SPCR &= ~(1<<SPE);
// Wysłanie 0 - komenda
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
PORT(LCD_PORT) |= 1<<LCD_SCK;
// Włączenie spi
SPCR |= 1<<SPE;
// Wysłanie danej
SPDR = command;
while(!(SPSR & 1<<SPIF)) {};
#else
// 0 - dla komendy
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) &= ~(1<<LCD_SIO);
// Clk (wystarczy 30ns L i 30ns H)
PORT(LCD_PORT) |= 1<<LCD_SCK;
lcd_serout(command);
#endif
PORT(LCD_PORT) |= 1<<LCD_CS;
}
// Funkcja przesyła daną
void lcd_Data(uint8_t data)
{
PORT(LCD_PORT) &= ~(1<<LCD_CS);
#if defined LCD_HARDWARE_SPI
// Wyłączenie spi
SPCR &= ~(1<<SPE);
// Wysłanie 1 - dana
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) |= 1<<LCD_SIO;
PORT(LCD_PORT) |= 1<<LCD_SCK;
// Włączenie spi
SPCR |= 1<<SPE;
// Wysłanie danej
SPDR = data;
while(!(SPSR & 1<<SPIF)) {};
#else
// 1 - dla danej
PORT(LCD_PORT) &= ~(1<<LCD_SCK);
PORT(LCD_PORT) |= 1<<LCD_SIO;
// Clk (wystarczy 30ns L i 30ns H)
PORT(LCD_PORT) |= 1<<LCD_SCK;
lcd_serout(data);
#endif
PORT(LCD_PORT) |= 1<<LCD_CS;
}
//__________________________________________________________________________________________
// Obsługa wyświetlacza
// Inicjacja wyświetlacza
void lcd_Init(void)
{
uint8_t n; // licznik pętli
// Zerowanie sprzętowe
PORT(LCD_PORT) &= ~(1<<LCD_RES);
_delay_ms(10.0);
PORT(LCD_PORT) |= 1<<LCD_RES | 1<<LCD_SCK | 1<<LCD_SIO | 1<<LCD_CS;
_delay_ms(5.0);
// Instrukcja zerowania programowego
lcd_Command(LCD_SWRESET);
_delay_ms(5.0);
// Inicjacja ustawień
lcd_Command(LCD_INIESC);
//____________________________________________________________________________
// <Display setup 1>
lcd_Command(LCD_REFSET); // Inicjacja stanów
lcd_Data(0);
lcd_Command(LCD_DISCTL); // Ustawienie parametrów sterowania wyświetlaczem
lcd_Data(128); // Ilość cykli dla składowej, wartość zalecana. Umożliwia fizycznie uzyskanie 128 odcieni.
lcd_Data(0x80); // bit7 = 1 - nie wykonuj inwersji n-tej lini
lcd_Data(0x81); // dziel częstotliwość przez 2 dla trybu IDLE, napięcie matrycy 1/9, IC na górze modułu, organizacja 98x67
lcd_Data(84); // Dalej do końca cykle pracy. Według zalecanych w dokumentacji, z dwoma cyklami przerwy
lcd_Data(69);
lcd_Data(82);
lcd_Data(67);
lcd_Command(LCD_GCPSET0); // Gray Scale Position (Rejestr GCPSET0) - ustawienie odcieni szarości dla poszczególnych wartości (0 ustawione zawsze na 0)
lcd_Data(1);//1
lcd_Data(2);//2
lcd_Data(4);//3
lcd_Data(8);//4
lcd_Data(16);//5
lcd_Data(30);//6
lcd_Data(40);//7
lcd_Data(50);//8
lcd_Data(60);//9
lcd_Data(70);//10
lcd_Data(80);//11
lcd_Data(90);//12
lcd_Data(100);//13
lcd_Data(110);//14
lcd_Data(127);//15
lcd_Command(LCD_GAMSET); // Wybranie krzywej gamma
lcd_Data(LCD_GAM0);
lcd_Command(LCD_COMOUT); // Sposób sterowania wyprowadzeniami linii wyświtlacza
lcd_Data(4); // Pierwsze linie 0-41 (konieczne dla 67 linii), z przeprotem
//__________________________________________________________________
// <Power supply setup>
lcd_Command(LCD_PWRCTL);
lcd_Data(4); // zegar ok. 26kHz, high power mode, wewnętrzna rezystancja dla V1out
lcd_Command(LCD_SLPOUT); // Statruje wewnętrzny oscylator sterownika
lcd_Command(LCD_VOLCTL); // Wartość napięcia na przetwornicy
lcd_Data(127);
lcd_Data(3);
// Kontrast - pasuje nam wartość domyślna, więc nie trzeba jej zmieniać
lcd_Command(LCD_TEMPGRD); // Korekcja temperaturowa
for(n=0; n<14; n++)
lcd_Data(0);
lcd_Command(LCD_BSTON); // Włączenie przetwornicy
//__________________________________________________________________
// <Display setup2>
lcd_Command(LCD_INVON); // Włączam inwersje - dla 0xffff biały dla 0 czarny
// Tryb normalny - nie włączamy trybu częściowego
// Nie konfigurujemy obszarów poziomego przewijania
//__________________________________________________________________
// <Display setup3>
// Tryb dostępu do pamici 12 bit - nie zmieniamy domyślnego
// Nie ustawiamy palety dla 256 kolorów
// Domyślny sposób dostępu do pamięci obrazu nam pasuje
// Okno zapisu zdefiniowane domyślnie na cały obszar wyświetlania
//__________________________________________________________________
// Zanim wyświetlacz zostanie włączony konieczne jest odczekanie min. 40ms od chwili włączenia przetwornicy
_delay_ms(20.0); // 40ms konieczne dla stabilizacji napięcia przetwornicy
_delay_ms(20.0);
}
// Włączenie wyświetlacza
void lcd_On(void)
{
lcd_Command(LCD_DISON);
}
void lcd_Off(void)
{
lcd_Command(LCD_DISOFF);
}
//__________________________________________________________________________________________
// Obsługa bufora
////////////////////////////////////////////////////////////////////////////////////////////
// harddef.h - definicja sprzętu dla programu testującego możliwości wyświetlacza z noki3310
// przeznaczenie: "Programowanie procesorów w języku C (EdW)"
//
////////////////////////////////////////////////////////////////////////////////////////////
#ifndef HARDDEF_H_INCLUDED
#define HARDDEF_H_INCLUDED
// Przypisanie wyprowadzeń wyświetlacza
#define LCD_PORT B
#define LCD_RES 4
#define LCD_CS 3
#define LCD_SIO 5
#define LCD_SCK 7
// Sprzętowy SPI
#define LCD_HARDWARE_SPI
#endif //HARDDEF_H_INCLUDED
////////////////////////////////////////////////////////////////////////////////////////////
// lcd3510i.h - Biblioteka obsługi wyświetlacza Nokia3510i
//
// Autor: Radosław Koppel Kompilator: WinAVR 20050214
////////////////////////////////////////////////////////////////////////////////////////////
#ifndef LCD3510I_H_INCLUDED
#define LCD3510I_H_INCLUDED
// Rozmiary pola wyświetlacza
#define LCD_SX 98
#define LCD_SY 67
// Funkcje niskiego poziomu
void lcd_Command(uint8_t command);
void lcd_Data(uint8_t data);
// Funkcje obsługi LCD
void lcd_Init(void);
void lcd_On(void);
//**********************************************************************************************
// Definicje komend
/*
NOP, NOP2 - brak operacji
Komenda powoduje wyjście z trybu zapisu / odczytu pamięci. Umożliwia wyjście z trybu testowego (patrz komenda TSTMOD).
Dla zapewnienia stabilności działania zalecane jest jej periodyczne wywoływanie.
*/
#define LCD_NOP 0x00
#define LCD_NOP2 0xAA
/*
SWRESET - reset programowy
Jej działanie jest identyczne jak podanie stanu niskiego na wejście /RST
*/
#define LCD_SWRESET 0x01
/*
BSTOFF / BSTON - wyłącza / włącza wbudowaną przetwornice napięcia.
Komendy SLPIN/SLPOUT także wyłączają i włączają przetwornicę,
jednak ta komenda zmienia jej stan niezależnie.
* Po zerowaniu przetwornica jest wyłączona
*/
#define LCD_BSTOFF 0x02
#define LCD_BSTON 0x03
/*
RDDST - umożliwia odczyt statusu wyświetlacza. Brak zastosowania w projekcie.
!!! Aby odczyt był możliwy, linia LCD_SIO musi mieć możliwość stania się linią wejściową!!!
W odpowiedzi przesyłane jest 5 bajtów
0: błędne dane - wynika z działania interfejsu
1: D31 - D24
2: ...
3: ...
4: D7 - D0
Szczegóły w dokumentacji
*/
#define LCD_RDDST 0x09 // ODCZYT !!!
/*
SLPIN / SLPOUT - wejście w tryb uśpienia
W trybie uśpienia przetwornica napięcia jest wyłączona, oscylator zatrzymany. Wszystkie piksele nieaktywne.
* Po zerowaniu wyświetlacz jest w trybie uśpienia
*/
#define LCD_SLPIN 0x10
#define LCD_SLPOUT 0x11
/*
PTLON - wejście w tryb niepełnego wyświetlania
W trybie tym istnieje możliwość wybrania zakresu obsługiwanej powierzchni wyświetlacza
Pozostałe piksele są wygaszone.
Ustawienie zakresu wyświetlanych linii jest możliwe przy pomocy komendy PLTAR
Aby wyjść z tego trybu należy podać komendę NORON.
* Po zerowaniu wyświetlacz jest w trybie normalnym
*/
#define LCD_PTLON 0x12
/*
NORON - wejście w tryb normalny
Wprowadza wyświetlacz w zwykły tryb wyświetlania.
* Jest to domyślny stan po zerowaniu układu
*/
#define LCD_NORON 0x13
/*
INVOFF / INVON - wyłączenie / włączenie inwersji pikseli
Działanie komendy odnosi się do sposobu przetwarzania danych z pamięci na obraz.
Nie zmienia zawartości pamięci obrazu.
* Po zerowaniu inwersja jest wyłączona
*/
#define LCD_INVOFF 0x20
#define LCD_INVON 0x21
/*
FIXOFF / FIXON - wygaszenie / zapalenie wszystkich pikseli
Sterownik zaprzestaje dostępu do pamięci obrazu i wysterowuje wszystkie piksele
jako wyłączone / włączone.
Wyjście z tego trybu jest możliwe przez wydanie komendy NORON albo PLTON
* Po zerowaniu wszystkie piksele są wyłączone
*/
#define LCD_FIXOFF 0x22
#define LCD_FIXON 0x23
/*
WRTCNTR - ustawienie kontrastu
Po wysłaniu komendy należy wysłać daną o wartości 0-127.
Średni kontrast ma wartość 63. Napięcie wyświetlacza rośnie wraz ze wzrostem wartości kontrastu.
* Po zerowaniu domyślna wartość kontrastu wynosi 63
*/
#define LCD_WRCNTR 0x25
/*
DISOFF / DISON - wyłączenie / włączenie wyświetlacza
*/
#define LCD_DISOFF 0x28
#define LCD_DISON 0x29
/*
CASET - ustawienie adresów kolumn
PASET - ustawienie adresów stron
+--------------------+
| +-------------+ | < SP - strona (linia) początkowa
| | Okno zapisu | |
| +-------------+ | < EP - strona (linia) końcowa
| |
+--------------------+
^ ^
SC EC - kolumna początkowa i końcowa
Po komendach następuje przesłanie 8 bitowych liczb oznaczających początek i koniec okna zapisu.
Początek musi być liczbą mniejszą niż koniec. Jeśli podano wartości które nie mieszczą się w pamięci
obrazu, przesyłane w to miejsce dane będą ignorowane.
Funkcje umożliwiają zdefiniowanie sposobu "okna" w którym będą umieszczane zapisywane dane.
Jest to o tyle wygodne, że jeśli chcemy odświeżyć tylko część obrazu, nie musimy zmieniać ustawień.
Wysyłamy blok danych a sterownik umieszcza je w odpowiednich miejscach pamięci, tak aby pasowały
do zdefiniowanego okna.
* Po zerowaniu, zależnie od wybranego typu wyświetlacza przyjęte są następujące wartości wartości obejmujące cały obszar wyświetlacza
dla naszego 98x67:
SC=0; EC=97; SP=0; EP=66;
*/
#define LCD_CASET 0x2A
#define LCD_PASET 0x2B
/*
RAMWR - rozpoczęcie zapisu do pamięci wyświetlacza
Po wysłaniu tej komendy adres zapisu jest ustawiany na początek zdefiniowanego okna.
Każda wysłana dana powoduje przesunięcie wskaźnika o jedną pozycję.
Zapis przerywa wysłanie dowolnej innej komendy.
*/
#define LCD_RAMWR 0x2C
/*
RGBSET - ustawienie palety kolorów dla interfejsu 8bpp
Umożliwia ustawienie palety kolorów służącej do przejścia między trybem 256 kolorów (8bpp) na tryb 4096 kolorów (12bpp).
Oddzielnie ustawiane są składowe wszystkich kolorów.
W trybie 8bpp kolory czerwony oraz zielony mają 3 bity a niebieski 2.
Dane palety mają format jak niżej:
Dane Index
X X X X R3 R2 R1 R0 0
X X X X R3 R2 R1 R0 1
X X X X R3 R2 R1 R0 2
X X X X R3 R2 R1 R0 3
X X X X R3 R2 R1 R0 4
X X X X R3 R2 R1 R0 5
X X X X R3 R2 R1 R0 6
X X X X R3 R2 R1 R0 7
X X X X G3 G2 G1 G0 0
X X X X G3 G2 G1 G0 1
X X X X G3 G2 G1 G0 2
X X X X G3 G2 G1 G0 3
X X X X G3 G2 G1 G0 4
X X X X G3 G2 G1 G0 5
X X X X G3 G2 G1 G0 6
X X X X G3 G2 G1 G0 7
X X X X B3 B2 B1 B0 0
X X X X B3 B2 B1 B0 1
X X X X B3 B2 B1 B0 2
X X X X B3 B2 B1 B0 3
Uwaga: Dane w pamięci przechowywane są w postaci 12bpp. Zmiana odbywa się jeszcze przed zapisem wartości do pamięci obrazu.
Zatem sama zmiana palety nie daje od razu widocznych zmian na wyświetlaczu.
* Po zerowaniu zawartość palety jest nieokreślona. Jeśli zamierzamy korzystać z trynu 8bpp konieczna jest inicjacja.
*/
#define LCD_RGBSET 0x2D
/*
RAMRD - odczyt danych z pamięci obrazu. Brak zastosowania w projekcie.
!!! Aby odczyt był możliwy, linia LCD_SIO musi mieć możliwość stania się linią wejściową!!!
*/
#define LCD_RAMRD 0x2E // ODCZYT !!!
/*
PLTAR - obszar częściowy
Funkcja umożliwia ustawienie początkowej i końcowej wyświetlanej linii.
Aby jej działanie było widoczne konieczne jest wejście w specjalny tryb komendą PLTON.
*/
#define LCD_PTLAR 0x30
/*
VSCRDEF - ustawienie obszarów przewijania
*/
#define LCD_VSCRDEF 0x33
/*
MADCTL - kontrola dostępu do pamięci
Ustawia sposób dostępu do pamięci zarówno od strony mikrokontrolera jak i od strony kontrolera LCD
Za komendą należy wysłać jeden bajt zawierający parametry:
B7 B6 B5 B4 B3 0 0 B0
B7: Ustawia pozycję zerowej strony (lini)
0 - od góry do dołu
1 - od dołu do góry
B6: Ustawia pozycję zerowej kolumny
0 - od lewej do prawej
1 - od prawej do lewej
B5: Ustawienie kolejności zmian lini / kolumny
0 - tryb normalny: zmieniany jest adres kolumny aż przeskanowana zostanie cała linia w oknie,
wtedy zmienia się adres linii a kolumna zaczyna się od początku.
+------------+
|123456789ABC|
|DEFGHIJKLMNO|
|PRSTUWXYZ |
+------------+
1 - tryb odwrócony: zmieniany jest adres linii aż przeskanowana zostanie cała kolumna,
wtedy zmienia się adres kolumny a linia zaczyna się od początku.
+------------+
|147ADGJMPTX |
|258BEHKNRUY |
|369CFILOSWZ |
+------------+
B4: Wybranie kierunku skanowania linii wyświetlacza
0 - skanowanie od góry do dołu
1 - skanowanie od dołu do góry
B3: Kolejność składowych koloru
0 - RGB
1 - BGR
B0: Odwrócenie wyświetlacza w pionie
0 - tryb normalny
1 - wyświetlacz odwrócony
* Po zerowaniu, wartość domyślna to same 0
*/
#define LCD_MADCTL 0x36
#define LCD_P0TOP 0
#define LCD_P0BOTTOM 0x80
#define LCD_C0LEFT 0
#define LCD_C0RIGHT 0x40
#define LCD_MODENORM 0
#define LCD_MODEINV 0x20
#define LCD_SCANTOPBOTTOM 0
#define LCD_SCANBOTTOMTOP 0x10
#define LCD_RGB 0
#define LCD_BGR 0x08
#define LCD_VERTNORM 0
#define LCD_VERTINV 0x01
/*
VSCRSADD - Adres początku obszaru przewijanego
*/
#define LCD_VSCRSADD 0x37
/*
IDMOFF / IDMON - wyjście / wejście w tryb IDLE
W trybie IDLE, pobór mocy jest zmniejszony, wyświetlacz wyświetla tylko 8 kolorów
(brane pod uwagę są tylko najstarsze bity z każdej składowej koloru).
* Po zerowaniu tryb IDLE jest wyłączony
*/
#define LCD_IDMMOFF 0x38
#define LCD_IDMON 0x39
/*
COLMOD - tryb koloru
Umożliwia wybranie trybu koloru z punktu widzenia interfejsu z mikrokontrolerem.
Za komendą należy przesłać daną ustawiającą wybrany tryb:
2 - 256 kolrów
3 - 4096 kolorów
W pamięci kolory przechowywane są w formacie 12 bitowym. Zmiana odbywa się w chwili wpisywania danych.
* Domyślnym trybem po zerowaniu jest tryb 12bpp
*/
#define LCD_COLMOD 0x3A
#define LCD_COL8bpp 2
#define LCD_COL12bpp 3
/*
TSTMOD - Wejście w tryb testowy
Funkcja umożliwia testowanie układu. Użyteczna praktycznie tylko z punktu widzenia producenta.
W trybie testowym wyświetlacz nie jest sterowany prawidłowo.
Istnieje możliwość, że wyświetlacz odbierze tą właśnie komendę z powodu zakłóceń.
Wyjście z trybu testowego odbywa umożliwia komenda NOP lub NOP2.
*/
#define LCD_TSTMOD 0xDE
/*
INIESC - inicjacja ustawień wewnętrznych sterownika
Konieczne wywołanie w odpowiednim miejscu sekwencji inicjującej.
Powinna być wywołana przed rozpoczęciem konfiguracji.
*/
#define LCD_INIESC 0xC6
/*
GCPSET0, GCPSET1 - ustawienie skali szarości (krzywa gamma)
Ustawiane można ustawić dwie krzywe wybierane następnie instrukcją GAMSET.
Po komendzie należy przesłać 15 wartości, kolejno poziom szarości (natężenie koloru)
dla danej 0001, 0010, ..., 1111.
Wartość dla danej koloru 0000 jest ustawiona na stałe.
Należy zadbać aby wpisywane wartości były rosnące.
Uwaga: Nie zmieniać w czasie wyświetlania obrazu (aktywny wyświetlacz)
* Po zerowaniu zawartość obu krzywych jest nieokreślona
*/
#define LCD_GCPSET0 0xB3
#define LCD_GCPSET1 0xB4
/*
GAMSET - umożliwia wybranie jednej z definiowanych krzywych gamma
Wysłana za instrukcją dana umożliwia wybranie krzywej:
* * * * * * P11 P10
P11 P10
0 0 - bez zmian
0 1 - krzywa 0
1 0 - krzywa 1
1 1 - bez zmian
* Po zerowaniu wybrana jest krzywa 0
*/
#define LCD_GAMSET 0xB5
#define LCD_GAM0 1
#define LCD_GAM1 2
/*
DISCTL - konfiguracja wyświetlacza
Za komendą należy przesłać 7 bajtów danych konfigurujacych wyświetlacz.
W to dane standardowe zależne od konkretnego modułu wyświetlacza.
Szczegóły w dokumentacji
Uwaga 1: Funkcja ustawaia także parametry których nie należy zmieniać w czasie pracy wyświetlacza.
Uwaga 2: W starszej wersji sterownika (zwykle nie mamy możliwości sprawdzenia z jaką mamy do czynienia)
ustawienia powinny być zmieniane tylko raz po zerowaniu.
* Po zerowaniu ustawienia są nieokreślone. Należy przeprowadzić inicjację.
*/
#define LCD_DISCTL 0xB6
/*
TEMPGRD - ustawienie kompensacji temperaturowej
Po komendzie należy przesłać 14 bajtów. Tylko dwa najmłodsze bity z pierwszego bajtu mają znaczenie.
Reszta służy do testowania układu (przydatne dla producenta). Bezpiecznie można wysłać same 0 (włącznie z pierwszym bajtem)
B1 B0 %/K
0 0 -0.05
0 1 -0.10
1 0 -0.15
1 1 -0.20
* Po zerowaniu ustawienia są nieokreślone. Należy przeprowadzić inicjację.
*/
#define LCD_TEMPGRD 0xB7
/*
REFSET - ustawienie statusu sterownika
Powinna być wywołana przed konfiguracją sterownika (? - na pewno przy inicjacj. Nie jestem pewien czy zawsze)
Za komendą trzeba wysłać bajt danych z 0 na 3 najmłodszych pozycjach. Reszta bitów nie ma znaczenia.
*/
#define LCD_REFSET 0xB9
/*
VOLCTL - kontrola napięcia przetwornicy (sterującego wyświetlaczem)
Po komendzie należy przesłać dwa bajty
1: 0-127 - wartość napięcia
2: dwa najmłodsze bity = 1, reszta bez znaczenia
* Po zerowaniu ustawienia są nieokreślone. Należy przeprowadzić inicjację.
*/
#define LCD_VOLCTL 0xBA
/*
COMOUT - sposób sterowania wyprowadzeń wspólnych (linie)
Po instrukcji należy przesłać jeden bajt. Znacenie mają 4 najmłodsze bity:
* * * * B3 B2 B1 B0
B3: kolejność wyświetlania połówek wyświetlacza. Dla wyświetlacza o 67 liniach musi być = 0
B2: wybór sposobu sterowania
0 - normalnie
1 - z przeplotem
B1, B0 - kierunek przemiatania wyprowadzeń. Dla nas ma małe znaczenie, wpisujemy 00
*/
#define LCD_COMOUT 0xBD
/*
PWRCTL - sterowanie zasilaniem
Po komendzie należy przesłać jeden bajt danych:
* B6 B5 B4 B3 B2 B1 B0
B6 - wybór źródła zegara dla przetwornicy
0 - ustawienie przy pomocy B2, B1, B0
1 - połowa częstotliwości taktowania wyświetlacza
B5 - musi być równy 0. Ważny dla ustawień wewnętrznych
B4 - sterowanie sposobem wyrównania napięcia zasilania matrycy
0 - przy pomocy wewnętrznej rezystancji (dla wyświetlacza 3510i)
1 - przy pomocy zewnętrznej rezystancji
B3 - zmiana mocy wyjścia generującego napięcie matrycy
0 - duża moc
1 - mała moc
Mała moc umożliwia zaoszczędzenie około 100uA, jednak obraz może stać się niestabilny.
B2, B1, B0 - wartość od 0 do 4. Ustawienie częstotliwości pracy przetwornicy.
Większa wartość - więsza częstotliwość. Powoduje to większy pobór prądu ale mniejsze zniekształcenia obrazu.
Szczegóły w dokumentacji
* Po zerowaniu ustawienia są nieokreślone. Należy przeprowadzić inicjację.
*/
#define LCD_PWRCTL 0xBE
// Koniec definicji komend
//**********************************************************************************************
#endif //LCD3510I_H_INCLUDED
//////////////////////////////////////////////////////////////////////////////////////////////////
// makra.h - makra pomocnicze
//
// Autor: Radosław Koppel Kompilator: WinAVR 20050214
//////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef MAKRA_H_INCLUDED
#define MAKRA_H_INCLUDED
// Makra upraszczające dostęp do portów
// *** Port
#define PORT(x) XPORT(x)
#define XPORT(x) (PORT##x)
// *** Pin
#define PIN(x) XPIN(x)
#define XPIN(x) (PIN##x)
// *** DDR
#define DDR(x) XDDR(x)
#define XDDR(x) (DDR##x)
// NOPek
#define NOP() {asm volatile("nop"::);}
// Ilość elementów tablicy
#define ELEMS(p) (sizeof(p)/sizeof(p[0]))
// Zamiana dwóch elementów
#define XCHG(a, b, var_type) \
{\
var_type temp##a##b; \
temp##a##b = b; \
b = a; \
a = temp##a##b; \
}
// /\ Ta konstrukcja daje mi 100 % pewności, że nazwa zmiennej tymczasowej będzie inna niż zmiennych a i b
// Wybór wartości maksymalnej i minimalnej
#define MAX(a, b) (((a)>=(b)) ? (a) : (b))
#define MIN(a, b) (((a)<=(b)) ? (a) : (b))
#endif //MAKRA_H_INCLUDED
W tych wyświetlaczach też są różne sterowniki. Udało się komuś odpalić coś na tym wyświetlaczu. Jak na forum mikrokontrolerów AVR na elektrodzie wpisałem 3510i to dostałem z 10-15 postów. Większość w fazie uruchamiania.
Może tutaj też jest problem z inicjalizacją??
Opis z EdW:
http://www.sendspace.com/file/4xztfd
