FRMD KL25Z <=i2c=> NXP PCF8563 (RTC) FRMD KL25Z SPI=> MCP23S17 => (GLCD) T6963C FRMD KL25Z Tsi => 3 button : <--> <enter> <++> FRMD KL25Z => Bip()

Dependencies:   TSI mbed

Fork of RTC8564NB_Clock by masa miya

GLCD_spi.h

Committer:
szjenter
Date:
2014-05-14
Revision:
2:c271f83a69e4

File content as of revision 2:c271f83a69e4:

#ifndef GLCDSPI_H
#define GLCDSPI_H

/*** GLCD_spi.h***
*  Új változat  char* int_string(int)
* MCP23S17 - Microchip MCP23S17 16-bit Port Extender using SPI
* Copyright (c) 2010 Gert van der Knokke
*/
#include "mbed.h"

// for 21 characters on a row (6x8 font)
#define LCDFONTSEL  0xFF
// for 16 characters on a row (8x8 font)
// #define LCDFONTSEL 0xDF

#define IODIRA      0x00
#define IODIRB      0x01
#define IPOLA       0x02
#define IPOLB       0x03
#define GPINTENA    0x04
#define GPINTENB    0x05
#define DEFVALA     0x06
#define DEFVALB     0x07
#define INTCONA     0x08
#define INTCONB     0x09
#define IOCONA      0x0A
#define IOCONB      0x0B
#define GPPUA       0x0C
#define GPPUB       0x0D
#define INTFA       0x0E
#define INTFB       0x0F
#define INTCAPA     0x10
#define INTCAPB     0x11
#define GPIOA       0x12
#define GPIOB       0x13
#define OLATA       0x14
#define OLATB       0x15

// LCD pin connections/bit numbers
#define LCD_HALT    0x80
#define LCD_FS      0x20
#define LCD_RST     0x10
#define LCD_CD      0x08
#define LCD_CE      0x04
#define LCD_RD      0x02
#define LCD_WR      0x01

//      T6963C OPCODES
#define TXHOME      0x40    // SET TXT HOME ADDRESS
#define TXAREA      0x41    // SET TXT AREA
#define GRHOME      0x42    // SET GRAPHIC HOME ADDRESS
#define GRAREA      0x43    // SET GRAPHIC AREA
#define OFFSET      0x22    // SET OFFSET ADDRESS
#define ADPSET      0x24    // SET ADDRESS POINTER
#define AWRON       0xB0    // SET AUTO WRITE MODE
#define AWROFF      0xB2    // RESET AUTO WRITE MODE


/* This file contains definitions for all of the commands in a t6963. */
/********************************************************************/
/*  Register set */
#define CPS 0x21 //Cursor pointer set
#define ORS 0x22 //Offset register set
#define APS 0x24 //Address pointer set
#define THAS 0x40 //Text home address set
#define TAS 0x41 //Text area set
#define GHAS 0x42 //Graphic home address set
#define GAS 0x43 //Graphic area set
#define OM 0x80 //OR mode
#define EM 0x81 //EXOR mode
#define AM 0x83 //AND mode
#define TAM 0x84 //TEXT ATTRIBUTE mode
#define DOF 0x90 //Display OFF
#define CONBOF 0x92 //Cursor ON, Blink OFF
#define CONBON 0x93 //Cursor ON, Blink ON
#define TONGOF 0x94 //Text ON, Graphic OFF
#define TOFGON 0x98 //Text OFF, Graphic ON
#define TONGON 0x9C //Text ON, Graphic ON
#define LC1 0xA0 //1 Line cursor
#define LC2 0xA1 //2 Line cursor
#define LC3 0xA2 //3 Line cursor
#define LC4 0xA3 //4 Line cursor
#define LC5 0xA4 //5 Line cursor
#define LC6 0xA5 //6 Line cursor
#define LC7 0xA6 //7 Line cursor
#define LC8 0xA7 //8 Line cursor
#define DAWS 0xB0 //Data auto write set
#define DARS 0xB1 //Data auto read set
#define AR 0xB2 //Auto reset
#define DWAAI 0xC0 //Data write and ADP increment
#define DRAAI 0xC1 //Data read and ADP increment
#define DWAAD 0xC2 //Data write and ADP decrement
#define DRAAD 0xC3 //Data read and ADP decrement
#define DWAAN 0xC4 //Data write and ADP nonvariable
#define DRAAN 0xC5 //Data read and ADP nonvariable
#define SP 0xE0 //Screen PEEK
#define SC 0xE8 //Screen COPY
#define BR 0xF0 //Bit RESET
#define BS 0xF8 //Bit SET
//add 3 bit data to these
//commands to select bit

// for 21 characters on a row (6x8 font)
#define LCDFONTSEL  0xFF
// for 16 characters on a row (8x8 font)
// #define LCDFONTSEL 0xDF

// lcd dimensions in pixels
#define LCD_XWIDTH     128
#define LCD_YHEIGHT    64

#if LCDFONTSEL == 0xFF
// lcd dimensions in characters
#define LCD_WIDTH   22
#define LCD_HEIGHT  16
#define PIXELWIDTH  6
#else
#define LCD_WIDTH   16
#define LCD_HEIGHT  16
#define PIXELWIDTH  8
#endif

#define TEXT_STARTADDRESS       0x0000
#define GRAPHIC_STARTADDRESS    0x1000

   
#define CENTERX 50
#define CENTERY 32
#define INNER_RADIUS    20
#define OUTER_RADIUS    25
#define CENTER_CIRCLE   5

extern char d[14]={0};  // inttochar() visszaadott érték string-je 

//DigitalOut K_LED(LED1), P_LED(LED3), Z_LED(LED2);
SPI spi(PTC6, PTC7, PTC5);  // mosi, miso, sclk
DigitalOut cs2(PTC10);       //CS1=PTC11; CS2=PTC10; CS3=PTC4 Hardware CS a panelon
//----------------------------------------------------
void SPI_init()
{
    // set SPI to full speed (10 MHz mode)
    spi.format(8,0);
    spi.frequency(10000000);
    //spi.frequency(10000);
}
//----------------------------------------------------

void lcd_data(unsigned char d)  // write 8 bits lcd data
{
    cs2=0;
    spi.write(0x40);
    spi.write(GPIOB);  // select GPIOB
    spi.write(d);      // set data byte
    cs2=1;

    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA
    spi.write(LCDFONTSEL-LCD_CE-LCD_CD);   
    cs2=1;

    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA
    spi.write(LCDFONTSEL - LCD_WR - LCD_CE - LCD_CD);   
    cs2=1;

    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA
    spi.write(LCDFONTSEL - LCD_CD);   
    cs2=1;
    
}
//----------------------------------------------------

void lcd_command(unsigned char c)   // write 8 bits lcd command
{
    cs2=0;
    spi.write(0x40);
    spi.write(GPIOB);  // select GPIOB
    spi.write(c);      // set data byte
    cs2=1;

    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA
    spi.write(LCDFONTSEL-LCD_CE);   
    cs2=1;

    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA
    spi.write(LCDFONTSEL - LCD_WR - LCD_CE);   
    cs2=1;

    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA
    spi.write(LCDFONTSEL);   
    cs2=1;
}
//----------------------------------------------------
void lcd_init()     //Grafikus LCD initializálása
{
    cs2=0;
    spi.write(0x40);
    spi.write(IODIRA);  // select IODIRA at start
    spi.write(0x00);    // IODIRA all outputs
    spi.write(0x00);    // IODIRB all outputs
    cs2=1;
    wait(0.1);
    
    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA at start
    spi.write(LCDFONTSEL-LCD_RST);    // activate reset
    spi.write(0x00);    // all B outputs 0
    cs2=1;
    wait(0.1);

    cs2=0;
    spi.write(0x40);
    spi.write(GPIOA);  // select GPIOA at start
    spi.write(LCDFONTSEL);    // deactivate reset
    cs2=1;
    wait(0.1);

    // set text home address at 0x0000
    lcd_data(TEXT_STARTADDRESS%0x100);
    lcd_data(TEXT_STARTADDRESS/0x100);
    lcd_command(TXHOME);
    
    // set graphic home address at 0x1000
    lcd_data(GRAPHIC_STARTADDRESS%0x100);
    lcd_data(GRAPHIC_STARTADDRESS/0x100);
    lcd_command(GRHOME);
    
    // set text area 
    lcd_data(LCD_WIDTH);
    lcd_data(0x00);
    lcd_command(TXAREA);

    // set graphic area
    lcd_data(LCD_WIDTH);
    lcd_data(0x00);
    lcd_command(GRAREA);
    
    // mode set (internal character generation mode)
    lcd_command(0x80);
    
    // set offset register
    lcd_data(0x02);
    lcd_data(0x00);
    lcd_command(OFFSET);
    
    // display mode (text on graphics on cursor off)
    lcd_command(0x90+0x08+0x04);
        
}
//-------------------------------------------------

//------------------------------------------------------
char* int_string(double da){    // elő nullák nélküli kiíratás

    int b,c,dx,i;  //b=adott helyiértéken a számjegy, c=0 akkor elő nulla; dx= az elő nullák nélküli helyiérték száma
    char* f;        // egy karakter tipusú változó pointere
    c=0;
    dx=0;
    for(i=0;i<15;i++){d[i]=char(0x00);}
    //teszt adat: 
    //da=123456;
    b=int(da/100000000);    // 9. helyiérték
    if(b>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*100000000;  // 8. helyiérték
    b=int(da/10000000);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*10000000;  // 7. helyiérték
    b=int(da/1000000);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*1000000;  // 6. helyiérték
    b=int(da/100000);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*100000;  // 5. helyiérték
    b=int(da/10000);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*10000;  // 4. helyiérték
    b=int(da/1000);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*1000;  // 3. helyiérték
    b=int(da/100);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*100;  // 2. helyiérték
    b=int(da/10);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    da = da - b*10;  // 1. helyiérték
    b=int(da);
    if(b>0 | c>0){c=1;d[dx]=0x30 | char(b);dx++;}
    // visszatérési érték: d[] string
    f = d;  // f tartalmazza a d char tömb pointerét
    return f;
}



//------------------------------------------------------
void lcd_string(char y,char x,char *s)      // put a text string at position x,y (character row,column)
{                                                 
    int adr;
    adr=TEXT_STARTADDRESS+x+y*LCD_WIDTH;    // 0x0000 + x + y + 22
    lcd_data(adr%0x100);                    // % maradék képzés jele
    lcd_data(adr/0x100);
    lcd_command(ADPSET);
    lcd_command(AWRON);
    while (s[0]){
        // convert from ascii to t6963
        lcd_data(s[0]-32);
        s++;
    }
    lcd_command(AWROFF);
}
//----------------------------------------------------
void lcd_cls()      // clear lcd display memory (8k)        
{
    int a;
    lcd_data(0x00);
    lcd_data(0x00);
    lcd_command(ADPSET);
    lcd_command(AWRON);
    for (a=0; a<8192; a++) lcd_data(0);
    lcd_command(AWROFF);
}
//----------------------------------------------------
void lcd_plot(char x,char y,char color)     // set or reset a pixel on the display on position x,y with color 0 or 1
{
    int adr;                         
    adr = GRAPHIC_STARTADDRESS + ((LCD_WIDTH) * y) + (x/PIXELWIDTH);   // calculate offset
    lcd_data(adr%0x100);       // set low byte
    lcd_data(adr/0x100);       // set high byte
    lcd_command(ADPSET);           // set address pointer
    if (color) lcd_command(BS + ((PIXELWIDTH-1)-(x%PIXELWIDTH)));   // use bit set mode
        else  lcd_command(BR + ((PIXELWIDTH-1)-(x%PIXELWIDTH)));  // use bit reset mode
}
//----------------------------------------------------

void lcd_line(int x0, int y0, int x1, int y1,char color)        // Bresenham line routine 0-128 x 0-64 color= char(1)
{                                                               // color 1, 0
    char steep=1;
    int i,dx,dy,e;
    signed char sx,sy;
    
    dx = abs(x1-x0);
    sx = ((x1 - x0) >0) ? 1 : -1;
    dy=abs(y1-y0);
    sy = ((y1 - y0) >0) ? 1 : -1;
    
    if (dy > dx)
    {
        steep=0;
        // swap X0 and Y0
        x0=x0 ^ y0;
        y0=x0 ^ y0;
        x0=x0 ^ y0;

        // swap DX and DY
        dx=dx ^ dy;
        dy=dx ^ dy;
        dx=dx ^ dy;

        // swap SX and SY
        sx=sx ^ sy;
        sy=sx ^ sy;
        sx=sx ^ sy;
    }

    e = (dy << 1) - dx;

    for (i=0; i<=dx; i++)
    {
        if (steep)
        {
            lcd_plot(x0,y0,color);
        }
        else
        {
            lcd_plot(y0,x0,color);
        }
        while (e >= 0)
        {
            y0 += sy;
            e -= (dx << 1);
        }
        x0 += sx;
        e += (dy << 1);
    }
 }
//----------------------------------------------------

// kör kirajzolása
void lcd_circle(int x0,int y0, int radius, char color)      // Bresenham circle routine
{
    int i;
    float cx =1.3;       // kör rajzolás  LCD torzítás kompenzálása
    i=0;
    //char sa[3];
    int f = 1 - radius;
    int dx = 1;
    int dy = -2 * radius;
    int x = 0;
    int y = radius;
    //float cx =1.3;
    lcd_plot(x0 * cx, y0 + radius,color);
    lcd_plot(x0 * cx, y0 - radius,color);
    lcd_plot((x0 + radius) * cx, y0,color);
    lcd_plot((x0 - radius) * cx, y0,color);
 
    while(x < y){
        i++;
        if(f >= 0) 
        {
            y--;
            dy += 2;
            f += dy;
        }
        x++;
        dx += 2;
        f += dx;    
        lcd_plot((x0 + x) * cx, y0 + y,color);
        //a=(x0+x)*cx;
        //glcd_inttochar(a);
        //lcd_string(0,0,d);
        //a= y0 + y;
        //glcd_inttochar(a);
        //lcd_string(12,0,d);
        lcd_plot((x0 - x) * cx, y0 + y,color);
        lcd_plot((x0 + x) * cx, y0 - y,color);
        lcd_plot((x0 - x) * cx, y0 - y,color);
        lcd_plot((x0 + y) * cx, y0 + x,color);
        lcd_plot((x0 - y) * cx, y0 + x,color);
        lcd_plot((x0 + y) * cx, y0 - x,color);
        lcd_plot((x0 - y) * cx, y0 - x,color);
        //wait(.2);
    }
}

#endif