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

Revision:
2:c271f83a69e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GLCD_spi.h	Wed May 14 04:46:52 2014 +0000
@@ -0,0 +1,446 @@
+#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
\ No newline at end of file