#include <avr/io.h>
#include <stdlib.h>
#include "global.h"
#include "config.h"
#include "delay.h"
#include <stdint.h>
#include <inttypes.h>
#define CMD 0
#define DATA 1
//dyrektywy kompilatora
#include <avr/io.h>
#include <stdlib.h>
#include "delay.h"
//marka
#define PORT_3510i PORTB
#define SCK_3510i 7
#define SIO_3510i 5
#define CS_3510i 4
#define RES_3510i 3
//dane - dane do wyslania
//rodzaj - rodzaj informacji: 0 - COMMAND, 1 - DATA
void send_3510i(unsigned char data, unsigned char op_kind)
{
PORT_3510i &= ~(1<<CS_3510i); //CS ustaw na zero
// Wyłączenie spi
SPCR &= ~(1<<SPE); //ustawienie bitu SPE na zero
//transmisja bitu D8
PORT_3510i &= ~(1<<SCK_3510i); //ustawienie SCK na zero
//wyslanie odpowiedniego bitu w zaleznosci od
//rodzaju przesylanych danych
if (op_kind==0)
{ //komenda - wyslij zero
PORT_3510i &= ~(1<<SIO_3510i);
}
else
{ //dane - wyslij jeden
PORT_3510i |= 1<<SIO_3510i;
}
PORT_3510i |= 1<<SCK_3510i; //podciagnij SCK
//transmisja bitow D7-D0
//odblokowanie SPI
SPCR |= 1<<SPE; //uaktywnienie SPI
//wyslanie danych do sterownika
SPDR = data;
while(!(SPSR & 1<<SPIF)) {};
//poczekaj na ustawienie flagi
PORT_3510i |= 1<<CS_3510i; //ustaw CS jako jeden
}
void init_SPI(void)
{
DDRB=0xff; //11111111
PORTB=0xb0;
SPCR = _BV(SPE) | _BV(MSTR) | _BV(CPOL);
SPSR = _BV(SPI2X);
} // init_SPI
//inicjacja wyswietlacza nokia 3510i
void init_3510i(void)
{
int i; // licznik pętli
uint8_t x, y;
//hardware reset
PORT_3510i &= ~(1<<RES_3510i);
delayms(5);
PORT_3510i |= 1<<RES_3510i | 1<<SCK_3510i | 1<<SIO_3510i | 1<<CS_3510i;
delayms(5);
send_3510i(0x01, CMD); // LCD Software Reset
delayms(10);
send_3510i(0xC6, CMD); // Initial Escape
delayms(10);
//*** phase 2: display setup 1
send_3510i(0xB9, CMD); // Refresh set
send_3510i(0x00, DATA);
send_3510i(0xB6, CMD); // Display Control
send_3510i(0x80, DATA);
send_3510i(0x80, DATA); //no N line inversion
send_3510i(0x81, DATA); //frame freq; bias rate of LCD drive voltage; 98x67; diplay duty=1/67;
send_3510i(84, DATA);
send_3510i(69, DATA);
send_3510i(82, DATA);
send_3510i(67, DATA);
send_3510i(0xB3, CMD); // Gray Scale Position
send_3510i(0x11, DATA);
send_3510i(0x22, DATA);
send_3510i(0x33, DATA);
send_3510i(0x44, DATA);
send_3510i(0x55, DATA);
send_3510i(0x66, DATA);
send_3510i(0x77, DATA);
send_3510i(0x88, DATA);
send_3510i(0x99, DATA);
send_3510i(0xAA, DATA);
send_3510i(0xBB, DATA);
send_3510i(0xCC, DATA);
send_3510i(0xDD, DATA);
send_3510i(0xEE, DATA);
send_3510i(0xFF, DATA);
send_3510i(0xB5, CMD); // Gamma Curve Set
send_3510i(1, DATA);
send_3510i(0xBD, CMD); // Common driver setup
send_3510i(0, DATA);
//*** phase 3: power supply
send_3510i(0xBE, CMD); // Power Control
send_3510i(4, DATA);
send_3510i(0x11, CMD); // Sleep out
send_3510i(0xBA, CMD); // Voltage control
send_3510i(127, DATA);
send_3510i(3, DATA);
send_3510i(0x25, CMD); // Write contrast
send_3510i(63, DATA);
send_3510i(0x2D, CMD); // Colour set (only for 8-bit/pixel)
send_3510i(0x00, DATA); // RED
send_3510i(0x02, DATA);
send_3510i(0x04, DATA);
send_3510i(0x06, DATA);
send_3510i(0x09, DATA);
send_3510i(0x0b, DATA);
send_3510i(0x0d, DATA);
send_3510i(0x0f, DATA);
send_3510i(0x00, DATA); // GREEN
send_3510i(0x02, DATA);
send_3510i(0x04, DATA);
send_3510i(0x06, DATA);
send_3510i(0x09, DATA);
send_3510i(0x0b, DATA);
send_3510i(0x0d, DATA);
send_3510i(0x0f, DATA);
send_3510i(0x00, DATA); // BLUE
send_3510i(0x05, DATA);
send_3510i(0x0a, DATA);
send_3510i(0x0f, DATA);
send_3510i(0xB7, CMD); // Temperature gradient set
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0, DATA);
send_3510i(0x03, CMD); // Booster Voltage ON
delayms(40);
//*** phase 4: display setup 2
send_3510i(0x21, CMD); // Inversion control (OFF)
//*** phase 5: display setup 3
send_3510i(0x3A, CMD); // 8bpp
send_3510i(0x02, DATA);
send_3510i(0x29, CMD); // Display On
}
int main(void)
{
DDRB=0xff;
init_SPI();
init_3510i();
delayms(100);
unsigned int n;
unsigned char kolor;
while(1)
{
send_3510i(0x2C, 0);
for(n=0;n<6566;n++)
{
if(n==0)kolor=0b11100000;
if(n==2000)kolor=0b00011100;
if(n==4000)kolor=0b00000011;
send_3510i(kolor, 1);
}
}
return 0;
}