ARM STM32F4DISCOVERY board

Cortex. ARM3, ARM5, ARM7 magok, mindenféle gyártóktól. Programozás-fejlesztés-tippek.

Te használnád az STM32F4DISCOVERY-t?

Igen!
6
67%
Nem!
3
33%
 
Szavazatok száma: 9

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

ARM STM32F4DISCOVERY board

Hozzászólás Szerző: kapu48 »

Itt legyen a téma az: STM32F4DISCOVERY board

http://www.st.com/internet/evalboard/product/252419.jsp

STM32F4DISCOVERY
STM32F4 high-performance discovery board
http://www.st.com/internet/com/TECHNICA ... 039084.pdf


Mivel igen olcsón árulják ezeket a lapokat.
Valószínű el fognak hamar terjedni.
Ezért remélem, lesznek többen is, akik érdeklődnek a téma iránt.


MCU Reference manual
STM32F405xx, STM32F407xx, STM32F415xx and TM32F417xx
advanced ARM-based 32-bit MCUs
http://www.st.com/internet/com/TECHNICA ... 031020.pdf

Nagy segítség, hogy már eleve rajtavan az USB programozó!
On-board ST-LINK/V2 with selection mode switch to use the kit as a standalone ST-LINK/V2 (with SWD connector for programming and debugging)

És a fenti linken szinte mindenre van példa program.
+ a neten is lehet keresgélni.

Én ezt használom :
Running FreeRTOS Demo within TrueSTUDIO
http://ph-elec.com/archives/freertos-de ... ruestudio/

Telepités után, lehet importálni kész demó projecteket vele.
Amik nagyon megkönnyítik a kezdők dolgát.

Ha esetleg úgy érzed, hogy már kinőtted a 8 bitesek világát?
Bátran vágj bele a 32 bites ARM megismerésébe.
Most ez a legtámogatottabb MCU mint gyártó és fejlesztő oldalról.
:D
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

ARM kezdő lépések! #01

Legelsőnek talán megjegyezném, hogy itt minden téren kezdő vagyok!
És a hibáimból csak tanulni lehet, azokért nem vállalok felelősséget!

Amin itt a kísérleteket végezzük HW: User manual
Getting started with software and firmware environments for the STM32F4DISCOVERY Kit
http://www.st.com/internet/com/TECHNICA ... 037368.pdf

SW: Download Atollic TrueSTUDIO® for ARM® Lite
http://www.atollic.com/index.php/downlo ... io-for-arm

Hogyan is működik ez a rendszer?

Miután regisztráltunk és letöltöttük az Atollic TrueSTUDIO for ARM Lite Eclipse változatát. (Ezután csak TS.)
Kapunk regisztrációs kódot mailben.

Telepítsük valami a későbbiekben könnyen elérhető helyre
pl.: "C:\Program Files\TrueSTUDIO for ARM Lite 3.1.0\
Ha elindítjuk a TrueSTUDIOT a feljövő Workspace ablakban felajánlja a default munkaterület beállítást.
Elfogadhatjuk, de inkább keressünk vagy hozzunk létre valami könnyebben elérhetőt.
Pl.:Win.XP alatt pl.: C:\Atolic

Mindezt a később szükséges elérési útvonalak beállításának könnyebbé tevéséhez.

Talán kezdjünk valami már meglevő demo programmal ismerkedni.
Elindítjuk a TS.-t.
Internet kapcsolat szükséges!
Némi kötelező ismertető video megnézése után, bezárjuk az info. ablakot.

Ikonsor előcsalása a menüsor: > Windw > Shov Tolbar
Keressük meg az ikon soron az ;Import Example Project; nevűt. Némi töltögetés után feljövő TS. Import Wizard ablakban megkeressük a kedvünkre való projectet.

Én mivel egy már Bascomos területen megismert grafikus LCD (T6963C) vezérlésével akartam kezdeni, ezért valami Periféria vezérlőt kerestem.
Útvonal:
A CPU gyártója: > STMicroelectronics
A Board neve: > STM32F4_Discovery
A Project: > STM32F4_Discovery_IO_Toggle

Letöltés után kapunk egy LED villogtató Projectet.
Amit a bal szélen levő ;Project Explorer; ablakban meg is nyithatunk.
Benne van minden fájl, ami nekünk kel. (A részletekbe inkább most nem mennék bel.)
És automatikusan bealítódnak az elérési útvonalak.

Az ;scr\main.c;-ben lesz a 4db alaplapi LED-et villogtató programunk.
Amit akár le is fordíthatunk és kipróbálhatunk. (Project > Build Project)

Program feltöltése beállítások:
Csatlakoztatjuk az STM32F4_Discoveryt USB (CN1) Csatlakozón a PC-hez.

Ellenőrizzük? Menü: Run Debug > Debuger > JTAG Probe > ST-LINK.?

Elindítjuk a Debug gombbal.
Feljön a Debug ablak, betölti a programunkat, és elindíthatjuk a Resume ( F8 ) gombbal.

Itt aztán van mit nézelődni!
Rendezzük, az ablakokat egymásmellé mondjuk: Main.c, Debug, Registers, SFRs. A többit egyelőre zárjukba.

Ha a Debug fülön (||) Suspend gombot nyomunk leáll a programfutás, és lehet soronként, lépésenként nézelődni a Step Over (F6) gombbal.
SFRs ablakban GPIOD IDR, ODR regiszterét állítgatjuk. GPIOD_Pin- 12 15-re vannak kötve a LED-ek.


Ha készen vagyunk, leállítjuk a Debugert a Terminate gombbal (piros négyzettel).

Most sikeresen kipróbáltuk a Botloadert és a Debug rendszert!

Lehet bele piszkálni a programba és gyakorolni. Főképpen tanulni a már meglevő rutinokból.

És legyen itt a LED villogtató: ;main.c; szemléltetőnek.
A hozzászólást 2 alkalommal szerkesztették, utoljára kapu48 2012. augusztus 19. vasárnap, 19:41-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Kód: Egész kijelölése

/**
  ******************************************************************************
  * @file    IO_Toggle/main.c 
  * @author  MCD Application Team
  * @version V1.0.1
  * @date    15-May-2012
  * @brief   Main program body
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "stm32f4_discovery.h"

/** @addtogroup STM32F4_Discovery_Peripheral_Examples
  * @{
  */

/** @addtogroup IO_Toggle
  * @{
  */ 

/* Private typedef -----------------------------------------------------------*/
GPIO_InitTypeDef  GPIO_InitStructure;

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void Delay(__IO uint32_t nCount);
/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f4xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
        system_stm32f4xx.c file
     */

  /* GPIOD Periph clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  while (1)
  {
    /* PD12 to be toggled */
    GPIO_SetBits(GPIOD, GPIO_Pin_12);
    
    /* Insert delay */
    Delay(0x3FFFFF);
    
    /* PD13 to be toggled */
    GPIO_SetBits(GPIOD, GPIO_Pin_13);
    
    /* Insert delay */
    Delay(0x3FFFFF);
  
    /* PD14 to be toggled */
    GPIO_SetBits(GPIOD, GPIO_Pin_14);
    
    /* Insert delay */
    Delay(0x3FFFFF);
    
    /* PD15 to be toggled */
    GPIO_SetBits(GPIOD, GPIO_Pin_15);
    
    /* Insert delay */
    Delay(0x7FFFFF);
    
    GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
    
    /* Insert delay */
    Delay(0xFFFFFF);
  }
}

/**
  * @brief  Delay Function.
  * @param  nCount:specifies the Delay time length.
  * @retval None
  */
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Szerintem egy kis C tanulás, programozás és gyakorlás után, már könnyebb, mint a Bascom!
Ha belenéztek a MCU Reference manualba elképesztő mi minden van ebben a kis IC-ben.
És belül megy akár 168MHz-el, Míg a Portok egyenként állíthatók 100, 50, 20MHz-re.

Most rákötjük az Grafikus LCD-t az > stm32f4discoveryre.

Ehhez szükségünk van a: STM32F4DISCOVERY schematics:
http://www.st.com/internet/com/TECHNICA ... ry_sch.zip
És a másik szereplő:
PQG2412A SERIES (240 * 128 DOTS) PIN CONNECTIONS
http://www.palmtech.com.tw/rimages/757/P37-PQG2412A.pdf

A Discoveryn elég nehéz lesz 1 Porton 8 egybefüggő szabad Pint találni.

Az én megoldásom:
Az LCD vezérlés az ide került:
// GLCD Control Port = GPIOD
#define GLCD_CONT_PORT ((GPIO_TypeDef *) GPIOD) // GLCD Control Port

#define GLCD_WR GPIO_Pin_6 // GLCD_WR Write enable
#define GLCD_RD GPIO_Pin_7 // GLCD_RD Read aneble
#define GLCD_CE GPIO_Pin_8 // GLCD_CE Chip enable
#define GLCD_CD GPIO_Pin_9 // GLCD_CD H:Comand, L: Data
#define GLCD_RST GPIO_Pin_10 // GLCD_RST Reset
#define GLCD_FS GPIO_Pin_11 // GLCD_FS Font Select H:6*8, L:8*8

LCD Adat Byte bekötés:
/** Bekötjük az LCD Adat vonalát **/
#define GLCD_DATA_PORT ((GPIO_TypeDef *) GPIOE)
#define GLCD_DB0 GPIO_Pin_3
#define GLCD_DB1 GPIO_Pin_4
#define GLCD_DB2 GPIO_Pin_5
#define GLCD_DB3 GPIO_Pin_6
#define GLCD_DB4 GPIO_Pin_7
#define GLCD_DB5 GPIO_Pin_8
#define GLCD_DB6 GPIO_Pin_9
#define GLCD_DB7 GPIO_Pin_10

Itt nevet adtunk az LCD Pineknek és megadtuk, hogy a Discoveri melyik Pinjére kötöttük őket.

Ezt elhelyezük a glcd_T6963C.h álományba.
Létre hozzuk:
ST. > Project: > STM32F4_Discovery_IO_Toggle > src\ > Nev > Header File > glcd_T6963C.h
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Kód: Egész kijelölése

/*
 * glcd_t6963c.h
 **
 * stm32f4_discovery Board to:
 * PQG2412A SERIES (240 * 128 DOTS)
 * Graphic LCD_T6963C
 * http://www.lcd-module.de/eng/pdf/zubehoer/t6963.pdf
 *
 *  Created on: Aug 26, 2012
 *      Author: kapu48.	kapu48@gmail(dot)com
 */

#ifndef GLCD_T6963C_H_
#define GLCD_T6963C_H_


/* Includes */
#include <stdarg.h>
#include <stdio.h>



#define GPIO_Pin_LByte               ((uint16_t)0x00FF)  /* All 8 pins selected */
#define GPIO_Pin_HByte               ((uint16_t)0xFF00)  /* High 8 pins selected */

/** Bekötjük az LCD-t **/
#define GLCD_DATA_PORT 	GPIOE		// ((GPIO_TypeDef*) GPIOE)
#define GLCD_DB0 		GPIO_Pin_3		//	GLCD_DB0
#define GLCD_DB1 		GPIO_Pin_4
#define GLCD_DB2 		GPIO_Pin_5
#define GLCD_DB3 		GPIO_Pin_6
#define GLCD_DB4 		GPIO_Pin_7
#define GLCD_DB5 		GPIO_Pin_8
#define GLCD_DB6 		GPIO_Pin_9
#define GLCD_DB7 		GPIO_Pin_10

/* GLCD beginning Data Pins	*/
#define GLCD_DBN 		3		//  0 = GLCD_DB0 = Pin0,  1 = GLCD_DB0 = Pin1, ....
#define GLCD_DBP_MASK 		(uint16_t)(0x00FF << GLCD_DBN)	// Data Byte Mask
#define GLCD_DBP_EXTMASK 	(uint16_t)(0xFFFF^GLCD_DBP_MASK)	// Data EXT Byte Mask

/* GLCD Control Port = GPIOD	*/
#define GLCD_CONTROL_PORT ((GPIO_TypeDef *) GPIOD)	//  GLCD Control Port

#define GLCD_WR 		GPIO_Pin_6		//	GLCD_WR		Write enable
#define GLCD_RD 		GPIO_Pin_7		//	GLCD_RD		Read aneble
#define GLCD_CE 		GPIO_Pin_8		//	GLCD_CE		Chip enable
#define GLCD_CD 		GPIO_Pin_9		//	GLCD_CD		H:Comand, L: Data
#define GLCD_RST 		GPIO_Pin_10		//	GLCD_RST	Reset
#define GLCD_FS 		GPIO_Pin_11		//	GLCD_FS 	Font Select	H:6*8, L:8*8

#define GLCD_CONTROLP_MASK 		(uint16_t)(0x003F << 6)	// Control Mask (GPIO_Pin_6)

/****                  Graphic LCD_T6963C Comands list                   ****/
/*    REGISTERS SETTING	*/
#define T6963CMD_SET_CURSOR_POINTER				((uint8_t)0x21)		// X ADDRES, Y ADDRES

#define T6963CMD_SET_OFFSET_REGISTER			((uint8_t)0x22)		// DATA, 0x00H

#define T6963CMD_SET_ADDRESS_POINTER			((uint8_t)0x24)		// LOW ADDRES, HIGH ADDRES
/* SET CONTROL WORD	*/
#define T6963CMD_SET_TEXT_HOME_ADDRESS			((uint8_t)0x40)		// 01000000, Low address, High address

#define T6963CMD_SET_TEXT_AREA					((uint8_t)0x41)		// 01000001, Columns, 0x00

#define T6963CMD_SET_GRAPHIC_HOME_ADDRESS		((uint8_t)0x42)		// 01000010, Low address, High address

#define T6963CMD_SET_GRAPHIC_AREA				((uint8_t)0x43)		// 01000011, Columns, 0x00

/* MODE SET Internal CG ROM mode	*/

#define T6963CMD_INT_ORmode					((uint8_t)0x80)		// 10000000
#define T6963CMD_INT_EXORmode				((uint8_t)0x81)		// 10000001
#define T6963CMD_INT_ANDmode				((uint8_t)0x83)		// 10000011
#define T6963CMD_INT_TEXT_Attributemode		((uint8_t)0x84)		// 10000100
/* MODE SET External CG RAM mode	*/
#define T6963CMD_EXT_ORmode					((uint8_t)0x88)		// 10001000
#define T6963CMD_EXT_EXORmode				((uint8_t)0x89)		// 10001001
#define T6963CMD_EXT_ANDmode				((uint8_t)0x8B)		// 10001011
#define T6963CMD_EXT_TEXT_Attributemode		((uint8_t)0x8C)		// 10001100
/* DISPLAY MODE	*/
/* Cursor off (ki), blink off (ki)  b1001XX10	*/
#define T6963CMD_TEXTOnGRAPHICOffCursorOff	((uint8_t)0x94)		// 10010100  Text Be, Graphic Ki,  Cursor off (ki)
#define T6963CMD_TEXTOffGRAPHICOnCursorOff	((uint8_t)0x98)		// 10011000  Text Ki, Graphic Be
#define T6963CMD_TEXTOnGRAPHICOnCursorOff	((uint8_t)0x9c)		// 10011100  Text Be, Graphic Be
/* Cursor on (be), blink off (ki)  b1001XX10	*/
#define T6963CMD_TEXTOnGRAPHICOffBlinkOff	((uint8_t)0x96)		// 10010110  Text Be, Graphic Ki
#define T6963CMD_TEXTOffGRAPHICOnBlinkOff	((uint8_t)0x9A)		// 10011010  Text Ki, Graphic Be
#define T6963CMD_TEXTOnGRAPHICOnBlinkOff	((uint8_t)0x9E)		// 10011110  Text Be, Graphic Be
/* Cursor on, blink on		b1001XX11	*/
#define T6963CMD_TEXTOnGRAPHICOffBlinkOn	((uint8_t)0x97)		// 10010111  Text Be, Graphic Ki
#define T6963CMD_TEXTOffGRAPHICOnBlinkOn	((uint8_t)0x9B)		// 10011011  Text Ki, Graphic Be
#define T6963CMD_TEXTOnGRAPHICOnBlinkOn		((uint8_t)0x9F)		// 10011111  Text Be, Graphic Be
/* Cursor off	*/
#define T6963CMD_DISPLAY_OFF				((uint8_t)0x90)		// 10010000  Display Ki
/* CURSOR PATTERN SELECT	*/
#define T6963CMD_1_LineCursor				((uint8_t)0xA0)		// 10100000
#define T6963CMD_2_LineCursor				((uint8_t)0xA1)		// 10100001
#define T6963CMD_3_LineCursor				((uint8_t)0xA2)		// 10100010
#define T6963CMD_4_LineCursor				((uint8_t)0xA3)		// 10100011
#define T6963CMD_5_LineCursor				((uint8_t)0xA4)		// 10100100
#define T6963CMD_6_LineCursor				((uint8_t)0xA5)		// 10100101
#define T6963CMD_7_LineCursor				((uint8_t)0xA6)		// 10100110
#define T6963CMD_8_LineCursor				((uint8_t)0xA7)		// 10100111
/* DATA AUTO READ / WRITE	*/
#define T6963CMD_SETDataAutoWRITE			((uint8_t)0xB0)		// 10110000
#define T6963CMD_SETDataAutoREAD			((uint8_t)0xB1)		// 10110001
#define T6963CMD_AUTORESET					((uint8_t)0xB2)		// 10110010
/* DATA READ / WRITE	*/
#define T6963CMD_DataWRITEAndIncrement		((uint8_t)0xC0)		// 11000000, Data
#define T6963CMD_DataREADAndIncrement		((uint8_t)0xC1)		// 11000001
#define T6963CMD_DataWRITEAndDecrement		((uint8_t)0xC2)		// 11000010, Data
#define T6963CMD_DataREADAndDecrement		((uint8_t)0xC3)		// 11000011
#define T6963CMD_DataWRITEAndNonvariable	((uint8_t)0xC4)		// 11000100, Data
#define T6963CMD_DataREADAndNonvariable		((uint8_t)0xC5)		// 11000101

#define T6963CMD_SCREEN_PEEK				((uint8_t)0xE0)		// 11100000
#define T6963CMD_SCREEN_COPY				((uint8_t)0xE8)		// 11101000
/* BIT  RESET				b11110XXX	*/
#define T6963CMD_BIT_RESET					((uint8_t)0xF0)			// 11110XXX

#define T6963CMD_RESBIT0					((uint8_t)0xF0)		// 11110000 (LSB)
#define T6963CMD_RESBIT1					((uint8_t)0xF1)		// 11110001
#define T6963CMD_RESBIT2					((uint8_t)0xF2)		// 11110010
#define T6963CMD_RESBIT3					((uint8_t)0xF3)		// 11110011
#define T6963CMD_RESBIT4					((uint8_t)0xF4)		// 11110100
#define T6963CMD_RESBIT5					((uint8_t)0xF5)		// 11110101
#define T6963CMD_RESBIT6					((uint8_t)0xF6)		// 11110110
#define T6963CMD_RESBIT7					((uint8_t)0xF7)		// 11110111 (MSB)
/* BIT SET					b11111XXX	*/
#define T6963CMD_Bit_Set					((uint8_t)0xF8)		// 1111_1000

#define T6963CMD_SETBIT0					((uint8_t)0xF8)		// 11111000 (LSB)
#define T6963CMD_SETBIT1					((uint8_t)0xF9)		// 11111001
#define T6963CMD_SETBIT2					((uint8_t)0xFA)		// 11111010
#define T6963CMD_SETBIT3					((uint8_t)0xFB)		// 11111011
#define T6963CMD_SETBIT4					((uint8_t)0xFC)		// 11111100
#define T6963CMD_SETBIT5					((uint8_t)0xFD)		// 11111101
#define T6963CMD_SETBIT6					((uint8_t)0xFE)		// 11111110
#define T6963CMD_SETBIT7					((uint8_t)0xFF)		// 11111111 (MSB)


/***                3. GLCD What does status checking means.         ***/
/*	STA0 Check command execution capability	*/
#define STATUSCHECK_MASK1 	((uint16_t)(GLCD_DB0))	//STA0 = 1 0x01 - 0 = command being executed, 1 = ready for new data and command.
/*	STA1 Check data read / write capability	*/
#define STATUSCHECK_MASK2 	((uint16_t)(GLCD_DB1))	//STA1 = 1 0x02 - 0 = internal data read/write occurring, 1 = ready for new data and command.
/*	STA0 | STA1	*/
#define STATUSCHECK_MASK3 	((uint16_t)(GLCD_DB0 | GLCD_DB1))	// 0x03 - 1|1 = ready - internal data  and command read/write
/* STA2 Check Auto mode data read capability	*/
#define RDCHECK_MASK4 		((uint16_t)(GLCD_DB2))	//STA2 = 1 READ		 - 0 = internal automode data read occurring, 1 = ready for next data read.
/*	STA3 Check Auto mode data write capability	*/
#define WRCHECK_MASK8 		((uint16_t)(GLCD_DB3))	//STA3 = 1 WRITE	 - 0 = internal automode data write occurring, 1 = ready for next data write.
/*	STA5 Check controller operation capability	*/
#define WRCHECK_MASK32 		((uint16_t)(GLCD_DB5))	// - 1 = controller capable of operation. 1
/*	STA6 Error flag. Used for Screen Peek and Screen copy commands.	*/
#define WRCHECK_MASK64 		((uint16_t)(GLCD_DB6))	// - 1 = screen peek/copy error (address not in graphic RAM), 0 = no error.
/*	STA7 Check the blink condition	*/
#define WRCHECK_MASK128		((uint16_t)(GLCD_DB7))	// - 0 = blinking areas of display off, 1 = blinking areas of display on. */

/* GLCD Horizontal dots 240	*/
#define GLCD_HORIZONTAL_DOTS 			((uint8_t)240)
/* GLCD Vertical dots 128	*/
#define GLCD_VERTICAL_DOTS 				((uint8_t)128)
#define GLCD_GRAPHIC_RAM_DOTS 			((uint16_t)30720)	// GLCD_HORIZONTAL_DOTS * GLCD_VERTICAL_DOTS
/* GLCD Character font (pin selectable)Horizontal dots 8	*/
#define GLCD_CHR_HORIZONTAL_8DOTS 		((uint8_t)8)
#define GLCD_CHR_HORIZONTAL_6DOTS 		((uint8_t)6)
/* GLCD Character font Vertical dots 8	*/
#define GLCD_CHR_VERTICAL_DOTS 			((uint8_t)8)
/* Display format (pin selectable)Columns */
#define GLCD_COLUMNS_8DOTS 				((uint8_t)30)	// 240/8
#define GLCD_COLUMNS_6DOTS 				((uint8_t)40)	// 240/6
/* Display format (pin selectable)CHR Lines	*/
#define GLCD_CHR_LINES 					((uint8_t)16)	// 16

/*****  External display memory : 32 KB Max  *****/
#define GLCD_EXT_MEMORY_AREA			((uint16_t)0x7FFF)
/* EXT Memory Caracter Generátor	*/
#define GLCD_CG_ROM_OFFSET0				((uint16_t)0x0000)
#define GLCD_CG_RAM_OFFSET1				((uint16_t)0x0E00)
#define GLCD_CG_RAM_OFFSET2				((uint16_t)0x0F00)

#define GLCD_CG_RAM_BANK_AREA			((uint16_t)0x07FF)
#define GLCD_CG_RAM_HOME1 				((uint16_t)0x7000)		//0x7000 - 0x77FF
#define GLCD_CG_RAM_HOME2 				((uint16_t)0x7800)		//0x7800 - 0x7FFF


/* EXT Memory GRAPHIC_RAM	*/
#define GLCD_GRAPHIC_RAM_HOME 			((uint16_t)0x2000)
#define GLCD_GRAPHIC_RAM_AREA 			((uint16_t)0x5000) //GLCD_CG_RAM_HOME1 - GLCD_GRAPHIC_RAM_HOME)

#define GLCD_GRAPHIC_RAMPAGE8_AREA 		((uint16_t)0x0F00)		// 3840Byte
#define GLCD_GRAPHIC_RAMPAGE6_AREA 		((uint16_t)0x1400)		// 5120Byte
/* GLCD Character font (pin selectable)Horizontal dots 8 MODE, GRAPHIC_RAMPAGE_HOME 0 - 4.	*/
#define GLCD_GRAPHIC_RAMPAGE8_HOME0		((uint16_t)0x2000)	// 8192
#define GLCD_GRAPHIC_RAMPAGE8_HOME1		((uint16_t)0x2F00)	// 12032
#define GLCD_GRAPHIC_RAMPAGE8_HOME2		((uint16_t)0x3E00)	// 15872
#define GLCD_GRAPHIC_RAMPAGE8_HOME3		((uint16_t)0x4D00)	// 19712
#define GLCD_GRAPHIC_RAMPAGE8_HOME4		((uint16_t)0x5C00)	// 23552	END 0x6B00	(27392). FREE RAM AREA 0X0500 (1280)Byte
/* GLCD Character font (pin selectable)Horizontal dots 6 MODE, GRAPHIC_RAMPAGE_HOME 0 - 3.	*/
#define GLCD_GRAPHIC_RAMPAGE6_HOME0		((uint16_t)0x2000)	// 8192
#define GLCD_GRAPHIC_RAMPAGE6_HOME1		((uint16_t)0x3400)	// 13312	5120=0x2000+240/6*128
#define GLCD_GRAPHIC_RAMPAGE6_HOME2		((uint16_t)0x4800)	// 15872
#define GLCD_GRAPHIC_RAMPAGE6_HOME3		((uint16_t)0x5C00)	// 23552	END 0x7000)	// 28672


/* EXT Memory TEXT_RAM	*/
#define GLCD_TEXT_RAM_HOME 				((uint16_t)0x0000)
#define GLCD_TEXT_RAM_AREA				((uint16_t)0x1FFF) //GLCD_GRAPHIC_RAM_HOME - 1)
/* HORIZONTAL_DOTS / CHR_MODE * CHR_LINES	*/
#define GLCD_TEXT_RAMPAGE6_AREA			((uint16_t)0x280) 	// (240/6*16)= 640
#define GLCD_TEXT_RAMPAGE8_AREA			((uint16_t)0x1E0) 	//(240/8*16)= 480

/* GLCD Character font (pin selectable)Horizontal dots 8 MODE, TEXT_RAMPAGE_HOME 0 - 7	*/
#define GLCD_TEXT_RAMPAGE8_HOME0		((uint16_t)0x0000)	//    0
#define GLCD_TEXT_RAMPAGE8_HOME1		((uint16_t)0x01E0)	//  480
#define GLCD_TEXT_RAMPAGE8_HOME2		((uint16_t)0x03C0)	//  960
#define GLCD_TEXT_RAMPAGE8_HOME3		((uint16_t)0x05A0)	// 1440
#define GLCD_TEXT_RAMPAGE8_HOME4		((uint16_t)0x0780)	// 1920
#define GLCD_TEXT_RAMPAGE8_HOME5		((uint16_t)0x0960)	// 2400
#define GLCD_TEXT_RAMPAGE8_HOME6		((uint16_t)0x0B40)	// 2880
#define GLCD_TEXT_RAMPAGE8_HOME7		((uint16_t)0x0D20)	// 3360		END 0x0F00 (3840). FREE RAM AREA 0x12E0 (4832)Byte
/* GLCD Character font (pin selectable)Horizontal dots 6 MODE, TEXT_RAMPAGE_HOME 0 - 7	*/
#define GLCD_TEXT_RAMPAGE6_HOME0		((uint16_t)0x0000)	//    0
#define GLCD_TEXT_RAMPAGE6_HOME1		((uint16_t)0x0280)	//  640
#define GLCD_TEXT_RAMPAGE6_HOME2		((uint16_t)0x0500)	// 1280
#define GLCD_TEXT_RAMPAGE6_HOME3		((uint16_t)0x0780)	// 1920
#define GLCD_TEXT_RAMPAGE6_HOME4		((uint16_t)0x0A00)	// 2560
#define GLCD_TEXT_RAMPAGE6_HOME5		((uint16_t)0x0C80)	// 3200
#define GLCD_TEXT_RAMPAGE6_HOME6		((uint16_t)0x0F00)	// 3840
#define GLCD_TEXT_RAMPAGE6_HOME7		((uint16_t)0x1180)	// 4480		END 0x1400 (5120). FREE RAM AREA 0x0E80 (3712)Byte

/* LCD screen and bitmap image array constants */
#define GLCD_X_8BYTES				((uint8_t)30)			// 30
#define GLCD_X_6BYTES				((uint8_t)40)			// 40
#define GLCD_Y_BYTES	      		((uint8_t)128)			// 128

#define GLCD_SCRN_LEFT				((uint8_t)0)		// Balra
#define GLCD_SCRN_TOP				((uint8_t)0)		// Felso

#define GLCD_SCRN_RIGHT				((uint8_t)239)		// Jobbra
#define GLCD_SCRN_BOTTOM			((uint8_t)127)		// Lent
//#define SCRN_BOTTOM				((uint8_t)63)

#define GLCDColorBlack 0b1
#define GLCDColorWhite 0b0

#define GLCD_EROR		0x0F				// Felvett hibajelzés
#define GLCD_CMD		((uint8_t)1)				// Comand Send
#define GLCD_DATA		((uint8_t)0)				// Data Send

/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL_BUTTON
  * @{
  */
#define BUTTON1                          1

/**
 * @brief Wakeup push-button
 */
#define USER_BUTTON_PIN                GPIO_Pin_0
#define USER_BUTTON_GPIO_PORT          GPIOA
#define USER_BUTTON_GPIO_CLK           RCC_AHB1Periph_GPIOA
#define USER_BUTTON_EXTI_LINE          EXTI_Line0
#define USER_BUTTON_EXTI_PORT_SOURCE   EXTI_PortSourceGPIOA
#define USER_BUTTON_EXTI_PIN_SOURCE    EXTI_PinSource0
#define USER_BUTTON_EXTI_IRQn          EXTI0_IRQn
/* Private typedef ----------------------------------------------------------- */
typedef enum
{
  BUTTON_USER = 0,
} Button_TypeDef;

typedef enum
{
  BUTTON_MODE_GPIO = 0,
  BUTTON_MODE_EXTI = 1
} ButtonMode_TypeDef;



/** GLCD Controller Port Structure **/
GPIO_InitTypeDef  GPIO_GLCDCStructure;

/** GLCD data Port Structure */
GPIO_InitTypeDef  GPIO_GLCDStructure;

//	: tiny_printf.c
/* External function prototypes (defined in syscalls.c) */
extern int _write(int fd, char *str, int len);

/* Private function prototypes */
void ts_itoa(char **buf, unsigned int d, int base);
int ts_formatstring(char *buf, const char *fmt, va_list va);
int ts_formatlength(const char *fmt, va_list va);



	/* Private function prototypes ------------------------------------------------- */
void STM_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode);
uint32_t STM_PBGetState(Button_TypeDef Button);



	uint8_t GLCD_INIT(void);											//Graphic LCD_T6963C initial, Return EROR Code
	void GLCD_DisplayMode(uint8_t dmode);

	void GLCD_StatusCheck(uint16_t st_checkmask);							// Wait GLCD Ready
	void GLCD_WriteC_D(uint8_t glcd_bytedat, uint8_t c_d, uint16_t check_maszk);	// GLCD Write 1 Byte
	void GLCD_WriteData2(uint16_t glcd_data2, uint8_t glcd_2cmmd);		// Write  glcd_ 2 Data, command
	void GLCD_WriteData1(uint8_t glcd_data1, uint8_t glcd_cmmd);		// Write  glcd_ 1 Data, command
	uint8_t GLCD_ReadData(uint16_t check_maszk);						// GLCD Read data

	void GLCD_TWriteChr(uint8_t ascII, uint8_t set_mode);
	void GLCD_TWriteString(char *String, uint8_t set_mode);
	void GLCD_Clear_TextPage(uint8_t set_page);							// 1 Text Page Upload > data
	void GLCD_Clear_CG(uint16_t cg_ram_home);					// 	1 Character Ram Page Upload > data

	void GLCD_CursorAktiv(uint8_t curaktiv);	// Move cursor indicator switches
	void GLCD_Set_CursorPointer(uint8_t cx, uint8_t cy, uint8_t cur_aktivated);		// Set Cursor Pointer
	void GLCD_CursorIncr(void);				// written character position calculation
	void GLCD_CursorDecr(void);				// delete character position calculation


	void GLCD_DataWriteAndIncDecNon(uint8_t glcd_dataw, uint8_t glcd_do, uint8_t glcd_cmd);	// Data Write and Command Increment/Decrement Address
	void GLCD_TGotoXY(uint8_t textx, uint8_t texty);
	void Text_Changing_Pages(uint8_t pages, uint8_t w_i_o);	// Setup Visible and Write/Read Text Page

	void Graphic_Changing_Pages(uint8_t pages, uint8_t w_i_o);

	void GLCD_SetDataPortOUT();		//  GLCD DATA PORT Configure output no push pull mode
	void GLCD_SetDataPortIN();		//  GLCD DATA PORT Configure  INput push pull mode

	inline void GLCD_SetOffsetRegister(uint16_t glcd_offset);			// Set CgRam Offset Register
	inline void GLCD_SetAddressPointer(uint16_t glcd_addressp);		// Set Address Pointer
	inline void GLCD_SetTextHomeAddress(uint16_t glcd_text_home);		// Set Text Home Address
	inline void GLCD_SetTextArea(uint16_t glcd_tcolumns);				// Set Text RAM area

	inline void GLCD_BitSet(uint16_t glcd_address, uint8_t glcd_bits);
	inline void GLCD_BitReset(uint16_t glcd_address, uint8_t glcd_bitr);

	inline void GLCD_SetGraphicHomeAddress(uint16_t glcd_graphic_home); // Set Graphic Ram Home Address
	inline void GLCD_SetGraphicArea(uint16_t glcd_gcolumns);			// Set Graphic RAM area
	void GLCD_Clear_GraphicPage(uint8_t sample, uint8_t grapich_page);			// 	1 Graphic Ram Page Upload > 0
	void GLCD_Upload_Graphic(uint8_t sample[], uint16_t grapich_ram_home, uint16_t size);

	void GLCD_Graphic_Square(uint8_t upper_leftX,uint8_t upper_leftY,\
							 uint8_t lower_rightX,uint8_t lower_rightY, uint8_t gpage, uint8_t sel);

	inline void Delay100US(uint32_t nCount);	// Delay 1 cycle 100usec ~
	inline void Delay1NS(uint32_t ns);			// Delay 1 cycle 1 nanosec
	inline void Delay1MS(uint32_t ms);			// Delay 1 cycle 1 milisec

	void Led4Rotating(void);
	void Wait_UserKey(void);
	void Erors(int hiba);

#endif /* GLCD_T6963C_H_ */

Frissitve 2012 szept. 6.
A hozzászólást 2 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 6. csütörtök, 17:49-kor.
Avatar
ImTilk
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. február 6. szombat, 7:00

Hozzászólás Szerző: ImTilk »

Üdv mindenkinek :)

Nagyon örülök, hogy más is játszadozik ezzel a kit-el Magyarországon nem csak én :)
Én úgy kerültem kapcsolatba ezzel a kis csoda cuccal, hogy még valamikor az év elején rendeltem az e-bay-en, két ili9325-ös vezérlő ic-vel ellátott touch-os 320*240-es felbontású lcd-t, csináltam hozzá mega32-vel egy tesztpanelt...
Sok-sok szenvedés után bascom-ban sikerült feléleszteni, de hihetetlen lassú volt, mire egy bmp-t kiraktam az lcd-re.
Gondoltam próbáljuk meg c-ben, vettem egy ansi c könyvet antikváriumban, felraktam az akkor legújabb AVRstúdiót, aztán 1-2 hónap tanulás után c-ben is megszólalt a kijelzőm az AVR-el.
Sokkal gyorsabb volt mint bascomban, a lefordított kód is kisebb de még mindig nem volt kielégítő a sebesség...
Mivel az lcd-t lehet hajtani 8 bites busszal is meg 16 bites busszal is, avr-el meg csak 8 bitesen lehet, így elkezdtem keresni egy kontrollert aminek van 16 bites adatbusza így találtam rá erre a stm32f4discovery kitre.
Megrendeltem, csináltam hozzá egy ilyen (http://kepfeltoltes.hu/120820/panel_www ... es.hu_.jpg) hordozópanelt, most ott tartok, hogy bmp-t meg tudok jeleníteni vele memóriakártyáról, usb-n keresztül pendrive-ról (igen van benne usb-host :) ), működik a touch panel, és tudom kalibrálni is, elkezdtem implementálni az st grafikus lib-jét is, ott még vannak problémáim... :)
Nekem is nagyon tetszik ez a mikrovezérlő, hihetetlen képességei vannak, a discovery panel meg teli van alapból érdekes perifériákkal, ennyi pénzért egy olyan kezdő mint én álmodni se tudna jobbat...

Ami konkrét tapasztalatot, segítséget én hozzá tudok ide tenni :

-Ha discovery panelt használsz, akkor nem tudsz hozzátenni plusz külső sram memóriát, mert 100 lábú tok van a panelen és ezen nincs kivezetve az összes FSMC láb, csak a 144-es tokozásún.
Jól rá fáztam rendeltem kintről két 256kb-s gyors sram-ot, hogy legyen buffer az lcd kijelzőnek, elkezdtem tervezni az új hordozópanelt, és akkor jöttem rá, hogy nem fog összejönni...
-Ha külső lcd-t raksz rá, mondjuk olyat mind amilyet én használok, ne a sima 16 bites port valamelyikét használd, hanem az FSMC portot, valószínűleg sokkal-sokkal gyorsabb lesz a megjelenítés, legalábbis ezt olvastam a neten...
Ez a port közvetlenül csatlakozik a belső busz-ra, így DMA-val egyből, a processzor minimális terhelésével lehet tolni rá az adatokat mondjuk az sd kártyáról az lcd-re... (vagy a memóriából az lcd-re, kikerülve a procit)
Igaz ezt még nem próbáltam csak mondok nagyokat, mintha értenék hozzá :D , de külföldi fórumokon írták, úgyhogy most tervezem át ehhez a hordozópanelemet...


Én most egyenlőre a keil uvision lite fordítót használom (32kb-os limit van benne), de nemrég találtam egy teljesen korlátlan és ingyenes IDE-t : http://www.coocox.org/CooCox_CoIDE.htm
Támogatja a mi procinkat is és a programozó-debuggert is ami rajta van a panelen. És elég jó leírás van hozzá az oldalon...
Azt hiszem az Atollic is limites amit Kapu ajánlott, úgyhogy talán ezzel is segítek valakinek...
Még nem próbáltam, de a limit miatt muszáj leszek lassan megismerkedni vele :)

Ugyan leginkább maradok AVR-es, mert az egyszerűbb dolgokra nem érdemes ilyen erőművet használni,de roppant jó érzés egy ilyen procit programozgatni, főleg így kezdőként amikor hosszú napok-hetek szenvedése után végre, elkezd működni valami :)
Meg aztán azt mondják, ha egyszer megtanulsz egy ARM magos procit programozni, akkor mindegyiket tudod, max a mag köré rakott perifériákban vannak különbségek...
Aki pedig c tanulásra adja a fejét, annak melegen ajánlom Robert Arduino tanfolyamát, mert sokat lehet belőle tanulni, a két nyelv hasonlósága miatt. Én is szorgalmasan olvasgatom a tanfolyami leveleket ;)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

ImTilk Üdvözöllek a klubban!

Örülök, hogy már nem vagyok egyedül!
Klasszul megcsináltad az LCD illesztő paneledet!
Majd én is akarok valami hasonlót.

Te már előrébb jársz a fejlesztésben. Nekem még kb. 3 hete van meg a Discoveri, előtte vagy 2 hétig olvasgattam a neten. Keresgéltem milyen támogatottsága van, végül úgy döntöttem belevágok.
Mivel mindig is érdekelt a téma.

Az én LCDmnek csak 2 színe van, zöld és fekete. De kezdő projectnek ez is jónagy feladat lesz.
Kerestem a neten, de nem találtam (T6963C) illesztését ARM-ra.

Persze mindenki, ha már lúd legyen kövér, színes kijelzőt akar.
(Bár mint kiderült nálad is ahhoz még kevés ez a rendszer) De amik már rajta vannak + 3D Gravitációs érzékelő, stereó hang, USB Host!
Mind ujdonság a számomra.

Az AVR-en még jó volt a 2*20 karakter is.

Én is próbálgattam több IDE-t is. Végül maradtam a Atollic TrueSTUDIO® for ARM® Lite-nél.
Kezdőnek ez a legjobb. Minden egyből össze van rakva készen, nem kel felépíteni a rendszert részekből.
Mire kinövöm a 32Kb határt addigra lesz annyi gyakorlat, hogy összerakjak valamit.
Mondjuk, az általad javasol parancssoros CooCox_CoIDE, beilleszteni az Eclipse-be.
Hogy kényelmes grafikus felületen dolgozhassak.

Következő téma, ami érdekel az USB Host mód és a PenDrive!

De maradjunk a mostani feladatnál, mert van még vele munka bőven.
Még csak a program vázat drótozgatom össze.
Bár már a Debugolásnál tartanák!

:lol:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Folytassuk tovább a:
* PQG2412A SERIES (240 * 128 DOTS)
* Graphic LCD_T6963C
*
* glcd_T6963C.h

Itt talán nem veszünk el a sok részletben, azt találjuk, ami most éppen kel nekünk.:
T6963C LCD Graphics Controller Chip
http://www.lcd-module.de/eng/pdf/zubehoer/t6963.pdf

Definiáljuk az LCD Parancsokat a kódjaikkal, hogy később a nevük alapján megadott utasítások és változók érthetőbb kódot eredményezzenek. (Ne vesszünk el a számok világában.)
A fenti táblázatok gépre vitele, glcd_T6963C.h folytatása:

Kód: Egész kijelölése

Ez a lista véletlenül duplán került ide. Az előző a jó!

Talán minden érthető a linkelt pdf és az elnevezések egyezése alapján!
8) :lol:
A hozzászólást 3 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 6. csütörtök, 18:05-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Nagy meglepetésemre első bekapcsolásra beindult a kijelzőm!
(Persze vannak még hibák. De azokat majd később részletezem.)

Most, lecseréltem az előző hsz.-ben közölt glcd_t6963c.h állományt.
A teljes (de még nem végleges!) változatra.

És itt vannak a hozzávaló: glcd_t6963c.c –ben levő rutinok.
8)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Kód: Egész kijelölése

/*
 * glcd_t6963c.c
 *
 * stm32f4_discovery Board to:
 * PQG2412A SERIES (240 * 128 DOTS) * Graphic LCD_T6963C
 *
 * http://www.lcd-module.de/eng/pdf/zubehoer/t6963.pdf
 *
 *  Created on: Aug 26, 2012
 *      Author: kapu48.	kapu48@gmail(dot)com
 */

/* Includes ------------------------------------------------------------------*/
//#include "stm32f4_discovery.h"
#include "stm32f4xx.h"
#include "glcd_t6963c.h"

// #define GLCD_CHR_MODE8

/* GLCD constant ---------------------------------------------------------*/
const uint16_t glcd_dbp_mask = GLCD_DBP_MASK; 			//(uint16_t)(0x00FF << GLCD_DBN)	// Port Data Byte Mask
const uint16_t glcd_dbp_extmask = GLCD_DBP_EXTMASK; 		//(uint16_t)(0xFFFF^GLCD_DBP_MASK)	// Data EXT Byte Mask

const uint16_t glcd_controlp_mask = GLCD_CONTROLP_MASK; 	//(uint16_t)(0x003F << 6)	// Control Mask (GPIO_Pin_6 ->)

/* pixel level bit masks for display */
/* this array is setup to map the order */
/* of bits in a byte to the vertical order */
/* of bits at the LCD controller */
const uint8_t glcd_bytemask_array[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

/* GLCD variables ------------------------------------------------------------ */
	int erorcode = 0;
	int ichr;
	uint8_t glcderor = 0;
	uint16_t glcdaddress = 0;
	uint8_t glcdbits = 0;
	uint8_t glcdmode = 0;
	uint8_t display_mode= 0;		// Tároljuk Az aktuállis display_mode sorszám
	uint16_t glcd_moderegiszter;		// Tároljuk Az aktuállis Mode Regiszter	értékét
	uint16_t glcd_setregiszter;		// Tároljuk Az aktuállis Set  Regiszter	értékét

	uint16_t ui16temp =0;			// uint16 temporary register

/* GLCD Text character generator variables -------------------------------------------------------- */
	uint16_t text_ram_home 			= GLCD_TEXT_RAM_HOME;
	uint16_t text_aktivram_page 	= GLCD_TEXT_RAM_HOME;
	uint16_t text_address_pointer 	= GLCD_TEXT_RAM_HOME;

	uint16_t cgram_home = GLCD_CG_ROM_OFFSET0;

	uint16_t offset_register = 0;			// DATA, 0x00H
	uint16_t address_pointer = 0;			// LOW ADDRES, HIGH ADDRES
	uint16_t visible_textpage 	 = GLCD_TEXT_RAMPAGE8_HOME0;				/* 	selected visible text  page		*/
	uint16_t write_read_textpage = GLCD_TEXT_RAMPAGE8_HOME0;			/* 	selected write |read text page	*/
	uint8_t  txtchr_pointerx = 0;			/*	Text Write/Read character pointer X	*/
	uint16_t txtchr_pointery = 0;			/*	Text Write/Read character pointer Y	*/
	uint8_t  cursor_pointerx = 0;			/*	cursor pointer X	*/
	uint8_t  cursor_pointery = 0;			/*	cursor pointer Y	*/
	uint16_t cursor_pointer_addr = 0;		// X ADDRES, Y ADDRES
	uint8_t  activated_cursor_pointer = 0;	/*	No Cursor = 0, visible cursor = 1	*/
	uint8_t  auto_cur_aktiv = 0;				/*	cursor does not move = 0, cursor moves = 1	*/
	uint8_t  cursor_aktiv = 0;				/* Aktuális cursor állapot */

/* * GLCD Graphic mode variables -------------------------------------------------------- */
	uint16_t graphic_aktivram_page 	= GLCD_GRAPHIC_RAMPAGE8_HOME0;
	uint16_t visible_graphicpage 	= GLCD_GRAPHIC_RAMPAGE8_HOME0;			/* 	selected visible Graphic  page		*/
	uint16_t write_read_graphicpage = GLCD_GRAPHIC_RAMPAGE8_HOME0;		/* 	selected write |read Graphic page	*/
	uint8_t  graphic_pointerx = 0;			/*	Text Write/Read Graphic pointer X	*/
	uint16_t graphic_pointery = 0;			/*	Text Write/Read Graphic pointer Y	*/




#ifdef GLCD_CHR_MODE6			// Setup GLCD CHR columns 6 Dots Mode
	/* the LCD display image memory */
	/* buffer arranged so page memory is sequential in RAM */
	/** GLCD Character font Horizontal dots 6  **/
	const 	uint8_t glcd_chr_mode = 6;				// Character horizontal mode 6 Dots

	uint8_t l_display_array[GLCD_COLUMNS_6DOTS][GLCD_VERTICAL_DOTS];		// 40 * 128 = 5120 Bytes
	const 	uint8_t glcd_columns = GLCD_COLUMNS_6DOTS;				// Horizontal 30 CHR

	uint16_t glcd_text_ram_page_area = GLCD_TEXT_RAMPAGE6_AREA;	// TEXT Page 480 CHR
	uint16_t glcd_text_rampage_home = GLCD_TEXT_RAMPAGE6_HOME0;
	// GLCD Graphic mode variables
	uint16_t glcd_graphic_ram_page_area = GLCD_GRAPHIC_RAMPAGE6_AREA;	// 3840Byte 0xF00
	uint16_t glcd_graphics_page_home = GLCD_GRAPHIC_RAMPAGE6_HOME0;

	// Text columns defined
	uint8_t glcd_mode = GLCD_CHR_HORIZONTAL_6DOTS;			// Display Character format Line/ Columns



#else	// Setup GLCD CHR columns 8 Dots Mode
	/* the LCD display image memory */
	/** GLCD Character font Horizontal dots 8  **/
	const 	uint8_t glcd_chr_mode = 8;				// Character horizontal mode 8 Dots
	// Text columns defined
//	uint8_t glcd_mode = GLCD_CHR_HORIZONTAL_8DOTS;			// Display Character format Line/ Columns

	/* buffer arranged so page memory is sequential in RAM */
	const 	uint8_t glcd_columns = GLCD_COLUMNS_8DOTS;				// Horizontal 30 CHR
	uint8_t l_display_array[GLCD_COLUMNS_8DOTS][GLCD_VERTICAL_DOTS];		// 30 * 128 = 3840 Bytes

	uint16_t glcd_text_ram_page_area = GLCD_TEXT_RAMPAGE8_AREA;	// TEXT Page 480 CHR
	uint16_t glcd_text_rampage_home  = GLCD_TEXT_RAMPAGE8_HOME0;

	// GLCD Graphic mode variables
	uint16_t glcd_graphic_ram_page_area = GLCD_GRAPHIC_RAMPAGE8_AREA;	// 3840Byte 0xF00
	uint16_t glcd_graphics_page_home 	= GLCD_GRAPHIC_RAMPAGE8_HOME0;
	uint16_t graphic_address_pointer 	= GLCD_GRAPHIC_RAMPAGE8_HOME0;
	uint16_t graphic_home_address 		= GLCD_GRAPHIC_RAMPAGE8_HOME0;		//  Low address, High address

#endif

/*..................................................................................................*/
	/******************* GLCD Initial Setup ******************************/
uint8_t GLCD_INIT(void){

	   /* GLCD Control PORT Configure  output push pull mode */
	  	GPIO_GLCDCStructure.GPIO_Pin = glcd_controlp_mask;	//(GLCD_WR | GLCD_RD | GLCD_CE | GLCD_CD | GLCD_RST | GLCD_FS);
	  	GPIO_GLCDCStructure.GPIO_Mode = GPIO_Mode_OUT;
	  	GPIO_GLCDCStructure.GPIO_OType = GPIO_OType_PP;
	  	GPIO_GLCDCStructure.GPIO_Speed = GPIO_Speed_100MHz;
	  	GPIO_GLCDCStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	  	GPIO_Init(GLCD_CONTROL_PORT, &GPIO_GLCDCStructure);


//		glcderor = 0;					// Eror Code
//		cursor_pointer_addr = 0;
//		text_address_pointer = GLCD_TEXT_RAM_HOME;		// 00
			// GLCD Text character generator variables --------------------------------------------------------
		//

//		graphic_address_pointer = GLCD_GRAPHIC_RAM_HOME;			// 8192     0x2000

		/*	 all selected as outputs	*/
		GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_CE | GLCD_WR | GLCD_RD | GLCD_CD | GLCD_RST);		// ChipEnable high

		/*	GLCD ADAT PORT Configure  INput	*/
		GLCD_SetDataPortIN();		//

		/*	out off font select Pin	*/
		if (glcd_chr_mode == 8) {
				GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_FS);	// font select  0 for 8*8
		}else{
				GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_FS);		// font select  1 for 6*8
		}

		Delay1NS(20);								// 20ns
		/* reset the LCD controller chip */
		GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_RST);		// reset low
		Delay1MS(100);								// 100ms
		GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_RST);		// reset high
		Delay1MS(50);								// 50ms

		/* program the controller mode of operation to graphics only mode */
		/*	home address text ram.upperleft corner 0x0000,	*/
//		GLCD_WriteData2(GLCD_TEXT_RAM_HOME, T6963CMD_SET_TEXT_HOME_ADDRESS);			// 0x40 home address text ram.upperleft corner 0x0000, 0
		/*	GLCD OK?	*/

			/*	Set OFFSET_REGISTER 0x0000,	*/
		GLCD_WriteData2(GLCD_CG_ROM_OFFSET0, T6963CMD_SET_OFFSET_REGISTER);			// 0x22 Set OFFSET_REGISTER 0x0000, 2
		if (!glcderor){
			/* set number of text characters on row @8 bits */
			GLCD_WriteData2((glcd_columns), T6963CMD_SET_TEXT_AREA);			// 0x41 Text linewidth graphic (characters per line)
					/* set graphics start */
			GLCD_WriteData2(GLCD_GRAPHIC_RAM_HOME, T6963CMD_SET_GRAPHIC_HOME_ADDRESS);		// 0x42		(0x2000)
						/* set number of bytes in horz raster */
			GLCD_WriteData2(glcd_graphic_ram_page_area, T6963CMD_SET_GRAPHIC_AREA);			// 0x43
							/*	text, graph EXOR mode	*/
//			GLCD_WriteC_D(T6963CMD_INT_EXORmode, GLCD_CMD, STATUSCHECK_MASK3); 				// 0x80 text, graph EXOR mode
//			GLCD_WriteC_D(T6963CMD_INT_ANDmode, GLCD_CMD, STATUSCHECK_MASK3);				// Text
								/*	text, graph, cursor , blink all on	*/
//			GLCD_WriteC_D(T6963CMD_TEXTOnGRAPHICOnBlinkOn, GLCD_CMD, STATUSCHECK_MASK3);		// 0x9F text, graph, cursor , blink all on
//			GLCD_WriteC_D(T6963CMD_TEXTOnGRAPHICOffCursorOff, GLCD_CMD, STATUSCHECK_MASK3);		// Text Be, Graphic Ki,  Cursor off (ki)
			GLCD_WriteC_D(T6963CMD_1_LineCursor, GLCD_CMD, STATUSCHECK_MASK3);				// Cursor Line high 1
			/* setup the AP to 0 */
//			GLCD_WriteData2(text_address_pointer, T6963CMD_SET_ADDRESS_POINTER);			// LOW ADDRES, HIGH ADDRES
			/* CLEAR GLCD RAM!	*/
			GLCD_Clear_GraphicPage(0, 1);
			GLCD_Clear_TextPage(1);
			GLCD_Clear_CG(GLCD_CG_RAM_HOME1);
			GLCD_DisplayMode(1);					//   Text Be, Graphic Ki,  Cursor off (ki)
			GLCD_Set_CursorPointer(cursor_pointerx, cursor_pointery, 0);		// Cursor Off
			GLCD_CursorAktiv(0);			/* 	Nem mozgatja a Cursort	*/
			Text_Changing_Pages(1, 2);		/*	aktiv Text page: 0 visible | Write | Read	*/
		}
	return (glcderor);		/* Return EROR code! (0x0F) or 0	*/
}


/*..................................................................................................*/
/** Wait Status check
 * Read Status - To check the Status of the T6963C controller -
 * possible parameter values
 * GLCD READY MASK			STATUSCHECK_MASK,  WRCHECK_MASK, RDCHECK_MASK
 */
void GLCD_StatusCheck(uint16_t st_checkmask){
	/** Wait Status check
	 * Read Status - To check the Status of the T6963C controller -
	 * 	C/\D take high,
	 * 	/RD take low
	 * 	(/WR should be high)
	 * 	/CE take low
	 * 	After 150ns read the data on D0-7
	 * 	/CE take high
	 *   The T6963C status word format is as follows:
	 */
	GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_CD | GLCD_WR);		// _set_display: command | WR high
	uint16_t status;
	uint16_t checktemp = 0;
	GLCD_SetDataPortIN();			//	Adat Port Bemenet
	Delay100US(10);								// Wait 20ns
	GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_RD | GLCD_CE);		// read low | ChipEnable low
	Delay1NS(20);								// Wait 40ns
	do{
		Delay100US(10);								// Wait 20ns
		status = GPIO_ReadInputData(GLCD_DATA_PORT);		// Read Status
		status &= st_checkmask;
		if (++checktemp > 10) {		// Idö tullépés miatt
			glcderor = GLCD_EROR;				// Hiba jelzés
			Erors(glcderor);
			break;						// GLCD EROR! megszakittás
		}
	} while (status != st_checkmask);
	GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_RD | GLCD_CE);			// Chip Disable high | RD High
}

/*..................................................................................................*/
/**
 * http://www.lcd-module.de/eng/pdf/zubehoer/t6963.pdf
 * MPU Interface Timing (MPU › T6963C)
 *
 * possible parameter values 1:
 * GLCD Write Byte
 * values 2:
 * 0 = Data,/ 1 = Command
 * values 3:
 * GLCD READY check MASZK
 */
void GLCD_WriteC_D(uint8_t glcd_bytedat , uint8_t c_d, uint16_t check_maszk){
	/**
	 * 2.3 Write Command -
	 * 	To Write a Command - The command should be set on D0 - 7 and
	 *	C/\D taken high,
	 *	/WR taken low
	 *	(/RD should be high)
	 *	/CE pulsed low for greater than 80ns
	 *
	 * 2.1 Write data -
	 * 	The data to be written should be set on D0 - 7 and
	 *	C/\D taken low,
	 *	/WR taken low (/RD should be high)
	 *	/CE pulsed low for greater than 80ns
	 */
		GLCD_StatusCheck(check_maszk);		// Varunk GLCD Kesz? jelre
		// GLCD Vezerles
		if (c_d){
			GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_CD);		// ? 1 _set_display: command high
		} else {
			GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_CD);		// ? 0 _Reset_display: data lov
		}

		Delay1NS(10);								// Wait 20ns
		GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_RD);		// read high
		Delay1NS(10);
		GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_CE);	//
//		Delay1NS(10);								// Wait 10ns

		GLCD_SetDataPortOUT();			//  GLCD Adat Port kapcsolunk Kimenetre
		uint16_t data = glcd_bytedat;

		data <<= GLCD_DBN;
		GPIO_ResetBits(GLCD_DATA_PORT,glcd_dbp_mask);
		GPIO_SetBits(GLCD_DATA_PORT,data);			// Ki küldi a Adatot/parancsot
		Delay1NS(30);								// Wait 40ns

		GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_WR);		// Write low	 Beirja GLCD-be
		Delay100US(4);								// Wait 400us
		GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_WR | GLCD_CE);			// Write high | ChipDisable high
		Delay1NS(10);								// Wait 20ns
		GLCD_SetDataPortIN();		// A vegen bemenetre valtunk
		GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_CD);		// ? 0 _Reset_display: data lov
}

/*..................................................................................................*/
/**
 * possible parameter values 1:
 *  X ADDRES, Y ADDRES Bytes
 *  DATA, 0x00H
 *  LOW ADDRES, HIGH ADDRES
 *  Columns, 0x00
 *
 * parameter values 2:
 * glcd_command
 */
void GLCD_WriteData2(uint16_t glcd_data2, uint8_t glcd_2cmmd){
	GLCD_WriteC_D(glcd_data2, GLCD_DATA, STATUSCHECK_MASK3);

	uint16_t datatemp = glcd_data2 >> 8;			// H Byte >> L Byte
	GLCD_WriteC_D(datatemp, GLCD_DATA, STATUSCHECK_MASK3);

	GLCD_WriteC_D(glcd_2cmmd, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................*/
/**
 * possible parameter values 1:
  *  DATA
  *
 *possible parameter values 2:
 * glcd_comand
 */
void GLCD_WriteData1(uint8_t glcd_data1, uint8_t glcd_cmmd){
	GLCD_WriteC_D(glcd_data1, GLCD_DATA, STATUSCHECK_MASK3);

	GLCD_WriteC_D(glcd_cmmd, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................*/
/**
 * possible parameter values
 *  Check the parameters
 *  STATUSCHECK_MASK		data, command - read, write
 *  RDCHECK_MASK			auto read
 *  WRCHECK_MASK			auto write
 *
 */
uint8_t GLCD_ReadData(uint16_t check_mask){
	  /**
	   *  * 2.2 GLCD Read data -
	   * 	C/\D take low,
	   *	/RD take low (/WR should be high)
	   *	/CE take low
	   *	After 150ns read the data on D0-7
	   *	/CE take high
      */
	assert_param(IS_GPIO_ALL_PERIPH(GLCD_DATA_PORT));
	uint8_t databyte = 0;
	uint16_t glcd_bitfield;
	GLCD_StatusCheck(check_mask);
	GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_WR);			// Write high
	GLCD_SetDataPortIN();			//	Adat Port Bemenet
	GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_CD);		// _set_display: command high
	Delay1NS(20);

	GPIO_ResetBits(GLCD_CONTROL_PORT , GLCD_RD | GLCD_CE);		// read low | ChipEnable low

	Delay1NS(50);								// Wait 50ns

	glcd_bitfield = GPIO_ReadInputData(GLCD_DATA_PORT);  //->IDR;

	Delay1MS(20);
	GPIO_SetBits(GLCD_CONTROL_PORT , GLCD_CE | GLCD_RD);			// Chip Disable high | read high

	if (GLCD_DBN) {
			databyte = (glcd_bitfield >> GLCD_DBN);
	}else{
			databyte = glcd_bitfield ;
	}
	return (databyte);
}

/*..................................................................................................*/
/*
 * Write Character Code Text Ram Area.
 * ascII: 			Dates (ASCII)
 * set_mode: 		Auto Address: Set and Non variable, Or Increment, Or Decrement
 */
void GLCD_TWriteChr(uint8_t ascII, uint8_t set_mode){
	uint8_t line = glcd_columns - 1;
	switch (set_mode) {
	   case 1:
		   GLCD_WriteC_D((ascII -32), GLCD_DATA, STATUSCHECK_MASK3);
		   GLCD_WriteC_D(T6963CMD_DataWRITEAndIncrement, GLCD_CMD, STATUSCHECK_MASK3);	// Increment
			if ((++txtchr_pointerx) > line){	/*	Text Write/Read character pointer X, Y	*/
				txtchr_pointerx = 0;
				if (txtchr_pointery < GLCD_CHR_LINES){
					txtchr_pointery++;
				}
			}
			if (activated_cursor_pointer){												// ? Auto move Cursor pointer
				GLCD_CursorIncr();
			}
		   break;
	   case 2:
		   GLCD_WriteC_D((ascII -32), GLCD_DATA, STATUSCHECK_MASK3);
		   GLCD_WriteC_D(T6963CMD_DataWRITEAndDecrement, GLCD_CMD, STATUSCHECK_MASK3);	// Decrement
			if (txtchr_pointerx > 0){	/*	Text Write/Read character pointer X, Y	*/
				txtchr_pointerx--;
			}else{
				txtchr_pointerx = glcd_columns - 1;
				if (txtchr_pointery > 0){
					txtchr_pointery--;
				}
			}
			if (activated_cursor_pointer){													// ? Auto move Cursor pointer
				GLCD_CursorDecr();
			}
		   break;
	   default:
		   GLCD_WriteC_D((ascII -32), GLCD_DATA, STATUSCHECK_MASK3);
		   GLCD_WriteC_D(T6963CMD_DataWRITEAndNonvariable, GLCD_CMD, STATUSCHECK_MASK3); // Nonvariable
	}
}

/*..................................................................................................*/
/*
 * Write String Code Text Ram Area.
 * ascII: 			Dates (ASCII)
 * set_mode: 		Auto Address: Set and Non variable, Or Increment, Or Decrement
 */
void GLCD_TWriteString(char *String, uint8_t set_mode){
	uint8_t is = 0;
	uint8_t tca = 0;
	if (cursor_aktiv == 2){
		tca = cursor_aktiv;
		GLCD_CursorAktiv(1);		// Cursor move Off
	}
	while (String[is]){			// Nem 0
		GLCD_TWriteChr(String[is++], set_mode);
	}
	if (tca){												// ? Auto move Cursor pointer
		GLCD_CursorAktiv(tca);		// Cursor move On
		GLCD_Set_CursorPointer(cursor_pointerx, cursor_pointery, 1);
	}
}

/*..................................................................................................*/
/** LCD Text Goto X, Y
 * Pozicionálás a Text felületen
 * sets memory location to screen location x, y
 * Display location: 1,1 is upper left corner;
 */
void GLCD_TGotoXY(uint8_t textx, uint8_t texty){
	    uint16_t location, home;
	    uint8_t line = glcd_columns;
	    if (textx > line) textx = line;
	    textx--;				// X = 0 < 1
	    texty--;
	    home = write_read_textpage;	// Az aktuális Text lap cime

	    location = home + (((uint16_t)texty) * line) + textx;			// Cim számítás

	    GLCD_WriteData2(location, T6963CMD_SET_ADDRESS_POINTER);
		if (activated_cursor_pointer){				// ? Kel cursor_pointer
			cursor_pointerx = textx;
			cursor_pointery = texty;
			GLCD_Set_CursorPointer(textx, texty, 1);
		}
}

/*..................................................................................................*/
/**
 * Set Cursor Pointer
 * possible parameter values 1:
 * CURSOR_POINTER				 X ADDRES, Y ADDRES
 * Display location: 0,0 is upper left corner;
 * cursor aktivated = 1, cursor Off = 0
 */
void GLCD_Set_CursorPointer(uint8_t cx, uint8_t cy, uint8_t cur_aktivated){

	cursor_pointerx = cx;
	cursor_pointery = cy;
	cursor_pointer_addr = (cy << 8) + cx;			// X ADDRES, Y ADDRES
	if (cur_aktivated){
		GLCD_WriteData2(cursor_pointer_addr, T6963CMD_SET_CURSOR_POINTER);
		if (!activated_cursor_pointer){
			GLCD_WriteC_D(T6963CMD_TEXTOnGRAPHICOffBlinkOn, GLCD_CMD, STATUSCHECK_MASK3);		// Set Text Cursor Blink On
			activated_cursor_pointer = 1;
		}
	}else{		//	Inaktive Text Cursor
		if (activated_cursor_pointer){
			GLCD_WriteC_D(T6963CMD_TEXTOnGRAPHICOffCursorOff, GLCD_CMD, STATUSCHECK_MASK3);		// Text Be, Graphic Ki,  Cursor off (ki)
			activated_cursor_pointer = 0;
		}
	}
}

/*..................................................................................................*/
/**
 * Move cursor indicator switches
 * No cursor indicator: 					 curaktiv = 0,
 * Cursor On, Blink On, auto_cursor_move Off. curaktiv = 1
 * Cursor On, Blink On, auto_cursor_move On.  curaktiv = 2
 *
 */
void GLCD_CursorAktiv(uint8_t curaktiv){
	cursor_aktiv = curaktiv;
	switch (curaktiv) {
	   case 0:
		   activated_cursor_pointer = 0;
		   glcd_moderegiszter &= 0b11111100;	// Reset Text Cursor Blink Off
		   auto_cur_aktiv = 0;					//  auto_cursor_move Off.
		   break;
	   case 1:
		   activated_cursor_pointer = 1;
		   glcd_moderegiszter |= 0b00000011;	// Set Text Cursor On, Blink On
		   auto_cur_aktiv = 0;					//  auto_cursor_move Off.
		   break;
	   case 2:
		   activated_cursor_pointer = 1;
		   glcd_moderegiszter |= 0b00000011;	// Set Text Cursor On, Blink On
		   auto_cur_aktiv = 1;					//  auto_cursor_move On.
	}
	GLCD_WriteC_D(glcd_moderegiszter, GLCD_CMD, STATUSCHECK_MASK3);		// Write Text Cursor Blink
}


/*..................................................................................................*/
/**	written character position calculation
 * Cursor Pointer and CHR Pointer Increment >>
 */
void GLCD_CursorIncr(void){
	 uint8_t line = glcd_columns - 1;
	if ((++cursor_pointerx) > line){	/*	cursor pointer X, Y	*/
		cursor_pointerx =0;
		if (cursor_pointery < GLCD_CHR_LINES){
			cursor_pointery++;
		}
	}
	cursor_pointer_addr = (cursor_pointery << 8) + cursor_pointerx;			// X ADDRES, Y ADDRES

	if (auto_cur_aktiv){
		GLCD_WriteData2(cursor_pointer_addr, T6963CMD_SET_CURSOR_POINTER);
	}
}

/*..................................................................................................*/
/**	delete character position calculation
 * Cursor Pointer and CHR Pointer Decrement <<
 */
void GLCD_CursorDecr(void){
	if (cursor_pointerx > 0){	/*	cursor pointer X, Y	*/
		cursor_pointery--;
	}else{
		cursor_pointerx = glcd_columns - 1;
		if (cursor_pointery > 0){
			cursor_pointery--;
		}
	}
	cursor_pointer_addr = (cursor_pointerx << 8) + cursor_pointery;			// X ADDRES, Y ADDRES

	if (auto_cur_aktiv){
		GLCD_WriteData2(cursor_pointer_addr, T6963CMD_SET_CURSOR_POINTER);
	}
}

/*..................................................................................................*/
/*
 * 	1 Text Page Upload > data
 */
void GLCD_Clear_TextPage(uint8_t set_page){
	int i;
	uint16_t address;
	switch (set_page) {
	   case 0:
		   address = text_aktivram_page;
		   break;
	   case 1:
		   address = GLCD_TEXT_RAMPAGE8_HOME0;
		   break;
	   case 2:
		   address = GLCD_TEXT_RAMPAGE8_HOME1;
		   break;
	   case 3:
		   address = GLCD_TEXT_RAMPAGE8_HOME2;
		   break;
	   case 4:
		   address = GLCD_TEXT_RAMPAGE8_HOME3;
		   break;
	   case 5:
		   address = GLCD_TEXT_RAMPAGE8_HOME4;
		   break;
	   case 6:
		   address = GLCD_TEXT_RAMPAGE8_HOME5;
		   break;
	   case 7:
		   address = GLCD_TEXT_RAMPAGE8_HOME6;
		   break;
	   case 8:
		   address = GLCD_TEXT_RAMPAGE8_HOME7;
		   break;
	   default:
		   address = text_aktivram_page;
	}
	GLCD_WriteData2(address, T6963CMD_SET_ADDRESS_POINTER);

	GLCD_WriteC_D(T6963CMD_SETDataAutoWRITE, GLCD_CMD, STATUSCHECK_MASK3);
	for(i = 0; i < glcd_text_ram_page_area; i++){
		GLCD_WriteC_D(0x00, GLCD_DATA, WRCHECK_MASK8);
	}
	GLCD_WriteC_D(T6963CMD_AUTORESET, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................*/
/*
 *  	1 Character Ram Page Upload > data
 */
void GLCD_Clear_CG(uint16_t cg_ram_home){
	int i;
	GLCD_WriteData2(cg_ram_home, T6963CMD_SET_ADDRESS_POINTER);

	GLCD_WriteC_D(T6963CMD_SETDataAutoWRITE, GLCD_CMD, STATUSCHECK_MASK3);
	for(i = 0; i < 256 * 8; i++){
		GLCD_WriteC_D(0, GLCD_DATA, WRCHECK_MASK8);
	}
	GLCD_WriteC_D(T6963CMD_AUTORESET, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................*/
/**
 * Data Write and Cmmd Inc/Dec Address
 * possible parameter values 1:
 * Write data
 * values 2:
 * data block size
 * values 3:
 *  Data Write and Non variable /  Data Write and add Increment /  Data Write and add Decrement
 */
void GLCD_DataWriteAndIncDecNon(uint8_t glcd_dataw, uint8_t glcd_do, uint8_t glcd_cmd){
	do{
		GLCD_WriteC_D(glcd_dataw, GLCD_DATA, STATUSCHECK_MASK3);

		GLCD_WriteC_D(glcd_cmd, GLCD_CMD, STATUSCHECK_MASK3);

	}while(glcd_do--);
}

/*..................................................................................................*/
/**
 * Text Lap Váltás
 * @param  visible Aktiv Page =0, Page number of = 1 - 8
 *  @param i_o :  visible = 0, write and read = 1, Write and read and visible = 2
 */
void Text_Changing_Pages(uint8_t pages, uint8_t w_i_o){

#ifdef GLCD_CHR_MODE6		// Setup GLCD CHR columns 6 Dots Mode
	switch (pages) {		/* select text page mode 6 dots 	*/
	   case 0:
		   text_aktivram_page = text_aktivram_page;;
		   break;
	   case 1:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME0;
		   break;
	   case 2:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME1;
		   break;
	   case 3:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME2;
		   break;
	   case 4:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME3;
		   break;
	   case 5:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME4;
		   break;
	   case 6:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME5;
		   break;
	   case 7:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME6;
		   break;
	   case 8:
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME7;
		   break;
	   default:		/* 0	*/
		   text_aktivram_page = GLCD_TEXT_RAMPAGE6_HOME0;
	}
#else
	if (pages < 10){
		switch (pages) {		/* select text page mode 8 dots	*/
//	   		case 0:
//		   		text_aktivram_page = text_aktivram_page;;
//		   		break;
			case 1:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME0;
				break;
			case 2:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME1;
				break;
			case 3:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME2;
				break;
			case 4:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME3;
				break;
			case 5:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME4;
				break;
			case 6:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME5;
				break;
			case 7:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME6;
				break;
			case 8:
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME7;
				break;
			default:		/* 0	*/
				text_aktivram_page = GLCD_TEXT_RAMPAGE8_HOME0;
		}
#endif
		if (activated_cursor_pointer){
			cursor_pointerx = 0;
			cursor_pointery = 0;
			GLCD_Set_CursorPointer(cursor_pointerx, cursor_pointery, 1);
			cursor_pointer_addr = 0;
		}
		switch (w_i_o) {		/* select text page mode visible, Write | Read	*/

			case 1:		/*	 Write | Read	*/
				write_read_textpage = text_aktivram_page;
				GLCD_SetAddressPointer(write_read_textpage);
				break;
			case 2:		/*	visible | Write | Read	*/
				visible_textpage = text_aktivram_page;
				write_read_textpage = text_aktivram_page;
				GLCD_SetTextHomeAddress(visible_textpage);			//  home address text ram.
				GLCD_SetAddressPointer(write_read_textpage);
				break;
			default:		/* 0 visible	*/
				visible_textpage = text_aktivram_page;
				GLCD_SetTextHomeAddress(visible_textpage);			//  home address text ram.
		}
	}else{			/*	Scrol 1 lines	*/
		switch (pages) {
	 	 	 case 10:									// 1 lines down (fel)
	 	 		 text_aktivram_page -= glcd_columns;
	 	 		 break;
	 	 	 case 11:									// 1 lines increase (le)
	 	 		 text_aktivram_page += glcd_columns;
	 	 		 break;
		}
//		switch (w_i_o) {		/* select text page mode visible, Write | Read	*/
//			case 1:		/*	 Write | Read	*/
//				write_read_textpage = text_aktivram_page;
//				GLCD_SetAddressPointer(write_read_textpage);
//				break;
//			default:		/*  visible	*/
				visible_textpage = text_aktivram_page;
				GLCD_SetTextHomeAddress(visible_textpage);			//  visible home address text ram.
//		}
	}

}


/*..................................................................................................*/
/**
 *  Select Display Mode
 * 0	= Display Off (Ki)
 *
 * Internal CG ROM mode
 * 1	= Text On  (Be), Graphic Off (Ki), Cursor Off (Ki)
 * 2	= Text On  (Be), Graphic Off (Ki), Cursor On  (Be), Blink On  (Be)
 * 3	= Text On  (Be), Graphic Off (Ki), Cursor On  (Be), Blink Off (Ki)
 * 4	= Text On  (Be), Graphic On  (Be), Cursor On, (Be), Blink Off (Ki)
 * 5	= Text On  (Be), Graphic On  (Be), Cursor Off (Ki)
 * 6	= Text On  (Be), Graphic On  (Be), Cursor On, (Be), Blink Off (Ki)
 * 7	= Text Off (Ki), Graphic On  (Be), Cursor Off (Ki)
 * 8	= Text On  (Be), Graphic On  (Be), Cursor On, (Be), Blink On  (Be)
 *
 * SET External CG RAM mode
 * 11 - 18 -"-
 */
void GLCD_DisplayMode(uint8_t dmode){
// Globális változók
	display_mode = dmode;		// Tároljuk Az aktuállis display_mode sorszámot
//  glcd_moderegiszter			// Tároljuk Az aktuállis Mode Regiszter	értékét
//  glcd_setregiszter			// Tároljuk Az aktuállis Set  Regiszter	értékét
	switch (dmode) {
		case 0:			//	Display Off (Ki)
			glcd_moderegiszter = T6963CMD_DISPLAY_OFF;					// 10010000  Display Off (Ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			break;

	/* MODE SET INTERNAL CG ROM mode	*/
		case 1:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffCursorOff;	// 10010100  Text On (Be), Graphic Off (Ki),  Cursor off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 0;								// Cursor no moves  (ki)
			break;
		case 2:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffBlinkOn;		// 10010111  Text On (Be), Graphic Off (Ki), Cursor Blink On (Be)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
		case 3:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffBlinkOff;		// 10010110  Text On (Be), Graphic Off (Ki), Cursor On (be), Cur blink off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
	/* Cursor on (be), blink off (ki)  b1001XX10	*/
		case 4:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text On (Be), Graphic On (Be), Cursor on, Blink Off
			glcd_setregiszter = T6963CMD_INT_TEXT_Attributemode; 		// 10000100 Tex Attribute mode
			activated_cursor_pointer = 1;								// Cursor moves
			break;
		case 5:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnCursorOff;		// 10011100  Text On (Be), Graphic On (Be), Cursor Off (ki)
			glcd_setregiszter = T6963CMD_INT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 6:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text On (Be), Graphic On (Be), Cursor On, Blink Off
			glcd_setregiszter = T6963CMD_INT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
	/* Cursor on, blink on		b1001XX11	*/
			break;
		case 7:
			glcd_moderegiszter = T6963CMD_TEXTOffGRAPHICOnCursorOff;	// 10011000  Text Off (Ki), Graphic On (Be), Cursor Off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 8:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOn;		// 10011111  Text On (Be), Graphic On (Be), Cursor On, Blink On (Be)
			glcd_setregiszter = T6963CMD_INT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
	/* MODE SET EXTERNAL CG RAM mode	*/
		case 11:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffCursorOff;	// 10010100  Text Be, Graphic Ki,  Cursor off (ki)
			glcd_setregiszter = T6963CMD_EXT_ORmode;					// 10001000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 12:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnCursorOff;		// 10011100  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_TEXT_Attributemode;		// 10001100 Tex Attribute mode blink
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 13:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffBlinkOff;		// 10010110  Text Be, Graphic Ki Cursor on (be), blink off (ki)
			glcd_setregiszter = T6963CMD_EXT_ORmode;					// 10001000  Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
	/* Cursor on (be), blink off (ki)  b1001XX10	*/
		case 14:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_TEXT_Attributemode; 		//  10001100 Tex Attribute mode
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 15:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnCursorOff;		// 10011100  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_EXORmode;					// 10001001 Graphic EXOR Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 16:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text Be, Graphic Be, Cursor On
			glcd_setregiszter = T6963CMD_EXT_EXORmode;					// 10001001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
	/* Cursor on, blink on		b1001XX11	*/
			break;
		case 17:
			glcd_moderegiszter = T6963CMD_TEXTOffGRAPHICOnCursorOff;	// 10011000  Text Ki, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_ORmode;					// 10001000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 18:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOn;		// 10011110  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
		default:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffCursorOff;	// 10010100  Text Be, Graphic Ki,  Cursor off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
	}
	GLCD_WriteC_D(glcd_moderegiszter, GLCD_CMD, STATUSCHECK_MASK3);		// Write Display Mode Regiszter
	GLCD_WriteC_D(glcd_setregiszter, GLCD_CMD, STATUSCHECK_MASK3);		// Write Mode Set Regiszter
}


/*..................................................................................................*/
/**
 * Graphic Lap Váltás
 * @param  visible Aktiv Page =0, Page number of = 1 - 8
 *  @param i_o :  visible = 0, write and read = 1, Write and read and visible = 2
 * @param  number of 1 - 5 Mode 8,  number of 1 - 4 Mode 6
 */
void Graphic_Changing_Pages(uint8_t pages, uint8_t w_i_o){

#ifdef GLCD_CHR_MODE6		// Setup GLCD CHR columns 6 Dots Mode
	switch (pages) {		/* select GRAPHIC page mode 6 dots 	*/
	   case 2:
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE6_HOME1;
		   break;
	   case 3:
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE6_HOME2;
		   break;
	   case 4:
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE6_HOME3;
		   break;
	   default:		/* 0	*/
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE6_HOME0;
	}
#else
	switch (pages) {		/* select GRAPHIC page mode 8 dots	*/
	   case 2:
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE8_HOME1;
		   break;
	   case 3:
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE8_HOME2;
		   break;
	   case 4:
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE8_HOME3;
		   break;
	   case 5:
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE8_HOME4;
		   break;
	   default:		/* 1	*/
		   graphic_aktivram_page = GLCD_GRAPHIC_RAMPAGE8_HOME0;
	}
#endif
	switch (w_i_o) {		/* select text page mode visible, Write | Read	*/

		case 1:		/*	 Write | Read	*/
			write_read_graphicpage = graphic_aktivram_page;
			GLCD_SetAddressPointer(write_read_graphicpage);
			break;
		case 2:		/*	visible | Write | Read	*/
			visible_graphicpage = graphic_aktivram_page;
			write_read_graphicpage = graphic_aktivram_page;
			GLCD_SetGraphicHomeAddress(visible_graphicpage);			//  home address text ram.
			GLCD_SetAddressPointer(write_read_graphicpage);
			break;
		default:		/* 0 visible	*/
			visible_graphicpage = graphic_aktivram_page;
			GLCD_SetGraphicHomeAddress(visible_textpage);			//  home address text ram.
	}
}

/*..................................................................................................*/
/*
 * 		1 Graphic Ram Page Upload > 0
 */
void GLCD_Clear_GraphicPage(uint8_t sample, uint8_t grapich_page){
	int ig;
	Graphic_Changing_Pages(grapich_page, 1);

	GLCD_WriteC_D(T6963CMD_SETDataAutoWRITE, GLCD_CMD, STATUSCHECK_MASK3);
	for(ig = 0; ig < glcd_graphic_ram_page_area; ig++){
		GLCD_WriteC_D(sample, GLCD_DATA, WRCHECK_MASK8);
	}
	GLCD_WriteC_D(T6963CMD_AUTORESET, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................*/
/**
 * Graphic Ram Upload
 * by the sources array
 * destination grapich_ram_home
 * size Bytes
 */
void GLCD_Upload_Graphic(uint8_t sample[], uint16_t grapich_ram_home, uint16_t size){
	uint16_t tsize;
	GLCD_WriteData2(grapich_ram_home, T6963CMD_SET_ADDRESS_POINTER);

	GLCD_WriteC_D(T6963CMD_SETDataAutoWRITE, GLCD_CMD, STATUSCHECK_MASK3);
	for(tsize = 0; tsize < size; tsize++){

		GLCD_WriteC_D(sample[tsize], GLCD_DATA, WRCHECK_MASK8);

	}
	GLCD_WriteC_D(T6963CMD_AUTORESET, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................  l_display_array[x][y]
 *  																											X
 *	Graphic square Upload	(X Byte Boundary!  X Byte határra!)						upper left X,Y	-------------------------
 * 																									|			|			|
 * by the sources/destination array	: l_display_array[x][y]											| sel=0,10	|			|
 * destination/sources grapich_page upper left  X, Y (bal felső),									|			|			|
 * destination/sources grapich_page lower right X, Y (jobb alsó)									|	--------|-------	|
 * 																								Y	|	|		|		|	|
 * 	gpaga: destination/sources Grapich page Number													|------------		|	|
 * 																									|	|	sel = 1,11	|	|
 *	selector:																						|	|				|	|
 *	sel = 0,10 Start sources array[0][0], sel = 1,11 Start sources array[upper_leftX][upper_leftY]	|	----------------	|
 *	sel < 10 : WRITE Display			  sel > 9 : READ Display   									-------------------------
 *																									            	lower right X, Y   */
void GLCD_Graphic_Square(uint8_t upper_leftX, uint8_t upper_leftY,\
						 uint8_t lower_rightX, uint8_t lower_rightY, uint8_t gpage, uint8_t sel){
	// control value?
	if ((upper_leftX < lower_rightX) & (lower_rightX < glcd_columns) & (upper_leftY < lower_rightY)){
		uint16_t paddres;
		uint8_t h;
		uint8_t v;

#ifdef GLCD_CHR_MODE6		// Setup GLCD CHR columns 6 Dots Mode
		switch (gpage) {		/* select GRAPHIC page mode CHR 6 dots 	*/
			case 2:
				paddres = GLCD_GRAPHIC_RAMPAGE6_HOME1;
				break;
			case 3:
				paddres = GLCD_GRAPHIC_RAMPAGE6_HOME2;
				break;
			case 4:
				paddres = GLCD_GRAPHIC_RAMPAGE6_HOME3;
				break;
			default:		/* 0	*/
				paddres = GLCD_GRAPHIC_RAMPAGE6_HOME0;
		}
#else
		switch (gpage) {		/* select GRAPHIC page mode CHR 8 dots	*/
			case 2:
				paddres = GLCD_GRAPHIC_RAMPAGE8_HOME1;
				break;
			case 3:
				paddres = GLCD_GRAPHIC_RAMPAGE8_HOME2;
				break;
			case 4:
				paddres = GLCD_GRAPHIC_RAMPAGE8_HOME3;
				break;
			case 5:
				paddres = GLCD_GRAPHIC_RAMPAGE8_HOME4;
				break;
			default:		/* 0	*/
				paddres = GLCD_GRAPHIC_RAMPAGE8_HOME0;
		}
#endif
		uint16_t i;
		uint8_t j;
		paddres += (upper_leftY * glcd_columns) + upper_leftX;						// 	 Start point
		switch (sel){
			case 0:				//	Start lower_rightX-Y = 0
			case 10:
				h = lower_rightX - upper_leftX;		// Horizontal Bytes
				v = lower_rightY - upper_leftY;		// Vertical Lines

				for (i = 0; i < v; i++){													// Y Lines
					GLCD_WriteData2(paddres, T6963CMD_SET_ADDRESS_POINTER);
					if (sel < 10){															// WRITE
						GLCD_WriteC_D(T6963CMD_SETDataAutoWRITE, GLCD_CMD, STATUSCHECK_MASK3);
					}else{																	// READ
						GLCD_WriteC_D(T6963CMD_SETDataAutoREAD, GLCD_CMD, STATUSCHECK_MASK3);
					}
					for(j = 0; j < h; j++){													// X Bytes
						if (sel < 10){														// WRITE
							GLCD_WriteC_D(l_display_array[j][i], GLCD_DATA, WRCHECK_MASK8);
						}else{																// READ
							l_display_array[j][i] = GLCD_ReadData(RDCHECK_MASK4);
						}
					}
					GLCD_WriteC_D(T6963CMD_AUTORESET, GLCD_CMD, STATUSCHECK_MASK3);
					paddres += glcd_columns;
				}
				break;
			case 1:					//	Start lower_rightX-Y
			case 11:
				for (i = upper_leftY; i < lower_rightY; i++){								// Y Lines
					GLCD_WriteData2(paddres, T6963CMD_SET_ADDRESS_POINTER);
					if (sel < 10){															// WRITE
						GLCD_WriteC_D(T6963CMD_SETDataAutoWRITE, GLCD_CMD, STATUSCHECK_MASK3);
					}else{																	// READ
						GLCD_WriteC_D(T6963CMD_SETDataAutoREAD, GLCD_CMD, STATUSCHECK_MASK3);
					}
					for(j = upper_leftX; j < lower_rightX; j++){							// X Bytes
						if (sel < 10){														// WRITE
							GLCD_WriteC_D(l_display_array[j][i], GLCD_DATA, WRCHECK_MASK8);
						}else{																// READ
							l_display_array[j][i] = GLCD_ReadData(RDCHECK_MASK4);
						}
					}
					GLCD_WriteC_D(T6963CMD_AUTORESET, GLCD_CMD, STATUSCHECK_MASK3);
					paddres += glcd_columns;
				}
		}
	}
}

/*..................................................................................................*/
/*
 *   GLCD DATA PORT Configure output no push pull mode
 *   @param
 */
void GLCD_SetDataPortOUT(){
 	GPIO_GLCDStructure.GPIO_Pin = glcd_dbp_mask; //  (GLCD_DB0 | GLCD_DB1| GLCD_DB2| GLCD_DB3| GLCD_DB4 | GLCD_DB5| GLCD_DB6| GLCD_DB7);
	GPIO_GLCDStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_GLCDStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_GLCDStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_GLCDStructure.GPIO_Speed = GPIO_Speed_100MHz;

	GPIO_Init(GLCD_DATA_PORT, &GPIO_GLCDStructure);	// No Set GPIO_Speed
}

/*..................................................................................................*/
/*
 *    GLCD DATA PORT Configure  INput push pull mode
*/
void GLCD_SetDataPortIN(){
    GPIO_GLCDStructure.GPIO_Pin = glcd_dbp_mask; //  (GLCD_DB0 | GLCD_DB1| GLCD_DB2| GLCD_DB3| GLCD_DB4 | GLCD_DB5| GLCD_DB6| GLCD_DB7);
    GPIO_GLCDStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_GLCDStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_GLCDStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_GLCDStructure.GPIO_Speed = GPIO_Speed_100MHz;

	GPIO_Init(GLCD_DATA_PORT, &GPIO_GLCDStructure);	// No Set GPIO_Speed
}

/*..................................................................................................*/
/**
 * Set CgRam Offset Register
 * possible parameter values 1: CG RAM OFFSET	// DATA Byte, 0x00H Byte
 */
inline void GLCD_SetOffsetRegister(uint16_t glcd_offset){
	GLCD_WriteData2(glcd_offset, T6963CMD_SET_OFFSET_REGISTER);
}

/*..................................................................................................*/
/**
 * Set Address Pointer
 * possible parameter values 1:
 *  GLCD RAM/ROM ADDRESS	 Low address, High address
 */
inline void GLCD_SetAddressPointer(uint16_t glcd_addressp){
	GLCD_WriteData2(glcd_addressp, T6963CMD_SET_ADDRESS_POINTER);
}

/*..................................................................................................*/
/**
 * Set Text RAM beginning
 * possible parameter values 1: Low address, High address
 */
inline void GLCD_SetTextHomeAddress(uint16_t glcd_text_home){
	GLCD_WriteData2(glcd_text_home, T6963CMD_SET_TEXT_HOME_ADDRESS);
}

/*..................................................................................................*/
/**
 *  Set Text RAM area
 * possible parameter values 1: Columns, 00H
 */
inline void GLCD_SetTextArea(uint16_t glcd_tcolumns){
	GLCD_WriteData2(glcd_tcolumns, T6963CMD_SET_TEXT_AREA);
}

/*..................................................................................................*/
/**
 *  Set Graphic RAM beginning
 * @param  possible parameter values 1: Low address, High address
 */
inline void GLCD_SetGraphicHomeAddress(uint16_t glcd_graphic_home){
	GLCD_WriteData2(glcd_graphic_home, T6963CMD_SET_GRAPHIC_HOME_ADDRESS);
}

/*..................................................................................................*/
/**
 *  Set Graphic RAM area
 * @param  possible parameter values 1:  Columns, 00H
 */
inline void GLCD_SetGraphicArea(uint16_t glcd_gcolumns){
	GLCD_WriteData2(glcd_gcolumns, T6963CMD_SET_GRAPHIC_AREA);
}

/*..................................................................................................*/
/*
 * Bit Set
 * @param  Graphic RAM address
 * @param  bits number
 */
inline void GLCD_BitSet(uint16_t glcd_address, uint8_t glcd_bits){
	GLCD_SetAddressPointer(glcd_address);
	GLCD_WriteC_D(T6963CMD_Bit_Set & glcd_bits, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................*/
/*
 * Bit Reset
 * @param  Graphic RAM address
 * @param  bits number
 */
inline void GLCD_BitReset(uint16_t glcd_address, uint8_t glcd_bitr){
	GLCD_SetAddressPointer(glcd_address);
	GLCD_WriteC_D(T6963CMD_BIT_RESET & glcd_bitr, GLCD_CMD, STATUSCHECK_MASK3);
}

/*..................................................................................................*/
/**	1 cycles~: second/11.000.000 = 91 microsecond
  * @brief  Delay Function.
  * @param  n Count: specifies the Delay time length.
  * @retval None
  */
inline void Delay100US(uint32_t nCount)
{
  while(nCount--){
  }
}

/*..................................................................................................*/
/*
 * Delay nanoseconds
 *  @param  ns the Delay time nanosecond
 */
inline void Delay1NS(uint32_t ns)
{
	uint32_t i;
    while(ns--){
    	for(i=0;i<12;i++){}
    }
}

/*..................................................................................................*/
/*
 * Delay miliseconds
 *  @param  ns the Delay time milisecond
 */
inline void Delay1MS(uint32_t ms)
{
	uint32_t i;
    while(ms--){
    	for(i=0;i<13000;i++){}
    }
}

/*..................................................................................................*/
void Erors(int hiba){
	uint8_t if8;
	switch(hiba){
	 	 case (GLCD_EROR) :			// 0x0F GLCD EROR > 10 * 4 LED Blink
//	 		printf("LCD EROR!!!");
	 		for (if8 = 0; if8 < 10; if8++){
	 			GPIO_SetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
	 			Delay1MS(100);
	 			GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
	 			Delay1MS(100);
	 		}
	 		break;

	 	 default :					//  EROR > 10 * 1 LED Blink
		 		for (if8 = 0; if8 < 10; if8++){
		 			GPIO_SetBits(GPIOD, GPIO_Pin_12);
		 			Delay1MS(100);
		 			GPIO_ResetBits(GPIOD, GPIO_Pin_12);
		 			Delay1MS(100);
		 		}
	}
}

/*..................................................................................................*/
/*	END GLCD_T6963C.c	*/

1 Text sor ki írás már részben működik!
(Majd jön a hibakeresés!)
:)

Frisítve 2012 Szept. 6.
A hozzászólást 3 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 6. csütörtök, 17:51-kor.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

És az első Text sor ki író main.c

Kód: Egész kijelölése

/**
  ******************************************************************************
  * @file    IO_Toggle > T6963C Text test!/ main.c
  *
  * @author  MCD Application Team
  * @version V1.0.1
  * @date    15-May-2012
  * @brief   Main program body
  * *      Author: kapu48.	kapu48@gmail(dot)com
  ******************************************************************************
 */

/* Includes ------------------------------------------------------------------*/
// #include "stm32f4_discovery.h"
 #include "stm32f4xx.h"

#include "glcd_t6963c.h"

/** @addtogroup STM32F4_Discovery_Peripheral_Examples
  * @{
  */

/** @addtogroup IO_Toggle
  * @{
  */ 

/* Private typedef -----------------------------------------------------------*/
GPIO_InitTypeDef   GPIO_InitStructure;

/* Private define ------------------------------------------------------------*/

#define USE_FULL_ASSERT		/* EROR! STOP!	*/



#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t file, uint8_t line);
#endif  // END USE_FULL_ASSERT


/* Private variables ---------------------------------------------------------*/
const uint16_t leds4 = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

GPIO_TypeDef*  BUTTON_PORT[BUTTON1]		 	= {USER_BUTTON_GPIO_PORT };
const uint16_t BUTTON_PIN[BUTTON1] 			= {USER_BUTTON_PIN };
const uint32_t BUTTON_CLK[BUTTON1] 			= {USER_BUTTON_GPIO_CLK };
const uint16_t BUTTON_EXTI_LINE[BUTTON1] 	= {USER_BUTTON_EXTI_LINE };
const uint8_t  BUTTON_PORT_SOURCE[BUTTON1] 	= {USER_BUTTON_EXTI_PORT_SOURCE};
const uint8_t  BUTTON_PIN_SOURCE[BUTTON1] 	= {USER_BUTTON_EXTI_PIN_SOURCE };
const uint8_t  BUTTON_IRQn[BUTTON1] 		= {USER_BUTTON_EXTI_IRQn };


/* Private function prototypes -----------------------------------------------*/



/*..................................................................................................*/
/**  * @brief  Main program  */
int main(void){

	/* Private variables ---------------------------------------------------------*/


	uint8_t eror_code = 0;
//	uint16_t address_pointer = 0;
//	__IO uint8_t UserButtonPressed = 0x00;

	/* Key Button configuration */
	  STM_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);

  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f4xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
        system_stm32f4xx.c file
     */

  /* GPIOD Periphery clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);	// LED And GLCD Control
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);	// USB Power and Red LED
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);	// GLCD Data


  /* Configure PD12, PD13, PD14 and PD15 in output push pull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /*	Starter Grafikus LCD T6963C	*/
  eror_code = GLCD_INIT();

  eror_code = GLCD_INIT();
  if (eror_code){
	  Erors(eror_code);
	  assert_failed(68, eror_code);		/* EROR! STOP!	*/
  }

  uint8_t ichr;
//  uint8_t jchr;

  while (1){


//	  GLCD_Clear_Graphic(0xFF, GLCD_GRAPHIC_RAMPAGE8_HOME0);
	  for (ichr = 1; ichr < 6; ichr++){
		  GLCD_Clear_GraphicPage(0x00, ichr);
	  }
	  for (ichr = 1; ichr < 9; ichr++){
		  GLCD_Clear_TextPage(ichr);
	  }
	  GLCD_DisplayMode(8);			// 8	= Text On  (Be), Graphic On  (Be), Cursor On, (Be), Blink On  (Be)
	  GLCD_CursorAktiv(2);			//  Text, cursor move, and visible On

	  GLCD_TGotoXY(1, 1);
//	  GLCD_CurAktiv(1);		//  auto_curso_move, not visible Off.
	  for (ichr = 1; ichr < 9; ichr++){
		  Text_Changing_Pages(ichr, 2);
		  GLCD_TGotoXY(1, ichr);
		  GLCD_TWriteString("TEXT LCD String test!: ", 1);
		  GLCD_TWriteChr(ichr + 48, 1);
		  Wait_UserKey();
	  }
	  for (ichr = 1; ichr < 17; ichr++){
		  Text_Changing_Pages(11, 0);
		  Wait_UserKey();
	  }
	  for (ichr = 1; ichr < 17; ichr++){
		  Text_Changing_Pages(10, 0);
		  Wait_UserKey();
	  }

	  for (ichr = 1; ichr < 6; ichr++){
		  Graphic_Changing_Pages(ichr, 0);
		  GLCD_TWriteString("GRAPH LCD String test!: ", 1);
		  GLCD_TWriteChr(ichr + 48, 1);
		  Wait_UserKey();
		  GLCD_Clear_GraphicPage(0xFF, ichr);
		  Wait_UserKey();
//		  GLCD_TWriteChr(ichr, 1);
	  }



	  GLCD_CursorAktiv(2);		//  auto_curso_move, visible On.
	  GLCD_TWriteChr(63, 1);


	  GLCD_TWriteString("LCD String test!", 1);


//	  for (ichr = 0; ichr < 9; ichr++){
//		  GLCD_DisplayMode(ichr);
//	  }


//	  GLCD_Clear_TextPage(1);
	  //GLCD_Clear_TextPage(2);

//	  GLCD_CurAktiv(2);			//  Text, cursor move, and visible On
	  GLCD_TGotoXY(1, 4);
	  GLCD_TWriteString("4", 1);
 	  GLCD_TWriteChr('5', 1);
 	  Delay1MS(500);


//	  GLCD_CurAktiv(1);			//  Text, cursor move,  visible Off
//	  for (jchr = 0; jchr < 4; jchr++){
//	  for (ichr = 33; ichr < 62; ichr++){
//			  GLCD_TWriteChr(ichr, 1);
//		  }

//		  for (ichr = (0x7F + 32); ichr > (0x7F + 2) ; ichr--){
//			  GLCD_TWriteChr(ichr, 1);
//		  }
//	  }

//	  GLCD_CurAktiv(2);


	  GLCD_Clear_TextPage(2);

	  Text_Changing_Pages(2, 2);		/*	Text Page 2 = visible | Write | Read	*/
	  GLCD_TWriteString("P4", 1);
	  GLCD_TGotoXY(4, 4);
	  GLCD_TWriteString("LCD String test!", 1);


	  GLCD_TWriteChr(33, 1);

	  GLCD_TWriteChr('2', 1);
	  Delay1MS(500);

	  Text_Changing_Pages(1, 2);		/*	Text Page 2 = visible | Write | Read	*/

	  Led4Rotating();
  }
}	/*********************			END MAIN!			**************************/

/*..................................................................................................*/
/**
  * @brief  Configures Button GPIO and EXTI Line.
  * @param  Button: Specifies the Button to be configured.
  *   This parameter should be: BUTTON_USER
  * @param  Button_Mode: Specifies Button mode.
  *   This parameter can be one of following parameters:
  *     @arg BUTTON_MODE_GPIO: Button will be used as simple IO
  *     @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt
  *                            generation capability
  * @retval None
  */
void STM_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the BUTTON Clock */
  RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  /* Configure Button pin as input */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];
  GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);

  if (Button_Mode == BUTTON_MODE_EXTI)
  {
    /* Connect Button EXTI Line to Button GPIO Pin */
    SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);

    /* Configure Button EXTI line */
    EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button];
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    /* Enable and set Button EXTI Interrupt to the lowest priority */
    NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button];
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);
  }
}

/*..................................................................................................*/
/**
  * @brief  Returns the selected Button state.
  * @param  Button: Specifies the Button to be checked.
  *   This parameter should be: BUTTON_USER
  * @retval The Button GPIO pin value.
  */
uint32_t STM_PBGetState(Button_TypeDef Button)
{
  return GPIO_ReadInputDataBit(BUTTON_PORT[Button], BUTTON_PIN[Button]);
}

/*..................................................................................................*/
/*
 * Wait gombnyomásra | felengedésre
 */
void Wait_UserKey(void){
	/* Loop while Key button is maintained pressed */
	while(STM_PBGetState(BUTTON_USER) == RESET){
	}
	Delay1NS(50);		//	Wait button Prel! 50 nanosec
	/* Wait until Key button is pressed */
	while(STM_PBGetState(BUTTON_USER) != RESET){
	}
}

/*..................................................................................................*/
void Led4Rotating(void){
	  do{
		  /*	round LEDS	*/
		  /* PD12 to be toggled */
		  GPIO_SetBits(GPIOD, GPIO_Pin_12);
		  /* Insert delay milisec*/
		  Delay1MS(200);
		  /* PD13 to be toggled */
		  GPIO_SetBits(GPIOD, GPIO_Pin_13);
		  /* Insert delay */
		  Delay1MS(200);
		  /* PD14 to be toggled */
		  GPIO_SetBits(GPIOD, GPIO_Pin_14);
		  /* Insert delay */
		  Delay1MS(200);
		  /* PD15 to be toggled */
		  GPIO_SetBits(GPIOD, GPIO_Pin_15);
		  /* Insert delay */
		  Delay1MS(200);
		  GPIO_ResetBits(GPIOD, leds4);	// GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15
		  /* Insert delay */
		  Delay1MS(200);
	  }while(!STM_PBGetState(BUTTON_USER));
}

/*..................................................................................................*/
#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t file, uint8_t line)
{
  /* User can add his own implementation to report the file name and line number,*/
//     printf("Wrong parameters value: file %s on line %d\r\n", file, line);

  /* Infinite loop */
  while (1)
  {		/*	Toggle LEDS!	*/
		GPIO_ToggleBits(GPIOD, leds4);
	    Delay1MS(400);
  }
}
#endif  // END USE_FULL_ASSERT

/*..................................................................................................*/
/**
  * @}
  */


/**
  * @}
  */ 

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/



Első benyomásra kegyetlen gyors! Az AVR-ekhez képest
:lol:

Frissítve 2012 Szept. 6
:wink:
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 6. csütörtök, 18:02-kor.
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

Hozzászólás Szerző: macsek »

kapu48 írta:Első benyomásra kegyetlen gyors! Az AVR-ekhez képest
:lol:
Persze, h az. Arra való, h nagy adatmennyiséget elfogadható idő alatt kezeljen.
Az AVR meg nem arra :)
Az én fejemben az ARM az mikroprocesszor, az AVR pedig mikrokontroller.

kapu48 írta:

Kód: Egész kijelölése

  GLCD_Clear_Text(' '-32);
Mi ez a furcsaság? Miért kell a 32-ből levonni 32-t?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Furcsaság!

A Kijelző Karakter generátor területén 0x0000 címen kezdődnek a karakter pont mátrix adatok.

Viszont ASCII kóddal is lehet rájuk hivatkozni.
Ezért van a -32 címmódosítás.

De ezt majd később elrejtsük a belső rutinokban.

:)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Most a Discoverin levő egyetlen nyomógombunkat vesszük használatba.
A rutinba már benne van a megszakítás kérés engedélyezése is, de még nem használjuk.

Kód: Egész kijelölése

/*****************************	*.h 	********************************/

/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL_BUTTON
  * @{
  */
#define BUTTONn                          1

/**
 * @brief Wakeup push-button
 */
#define USER_BUTTON_PIN                GPIO_Pin_0
#define USER_BUTTON_GPIO_PORT          GPIOA
#define USER_BUTTON_GPIO_CLK           RCC_AHB1Periph_GPIOA
#define USER_BUTTON_EXTI_LINE          EXTI_Line0
#define USER_BUTTON_EXTI_PORT_SOURCE   EXTI_PortSourceGPIOA
#define USER_BUTTON_EXTI_PIN_SOURCE    EXTI_PinSource0
#define USER_BUTTON_EXTI_IRQn          EXTI0_IRQn
/* Private typedef ----------------------------------------------------------- */
typedef enum
{
  BUTTON_USER = 0,
} Button_TypeDef;

typedef enum
{
  BUTTON_MODE_GPIO = 0,		// kezelés Álapot beolvasása
  BUTTON_MODE_EXTI = 1		// Megszakítás kéréssel.
} ButtonMode_TypeDef;




	/* Private function prototypes ------------------------------------------------- */
void STM_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode);
uint32_t STM_PBGetState(Button_TypeDef Button);

Kód: Egész kijelölése

/*****************************	*.c 	********************************/
GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {USER_BUTTON_GPIO_PORT };

const uint16_t BUTTON_PIN[BUTTONn] = {USER_BUTTON_PIN };

const uint32_t BUTTON_CLK[BUTTONn] = {USER_BUTTON_GPIO_CLK };

const uint16_t BUTTON_EXTI_LINE[BUTTONn] = {USER_BUTTON_EXTI_LINE };

const uint8_t BUTTON_PORT_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PORT_SOURCE};

const uint8_t BUTTON_PIN_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PIN_SOURCE };

const uint8_t BUTTON_IRQn[BUTTONn] = {USER_BUTTON_EXTI_IRQn };

NVIC_InitTypeDef   NVIC_InitStructure;

/**
  * @brief  Configures Button GPIO and EXTI Line.
  * @param  Button: Specifies the Button to be configured.
  *   This parameter should be: BUTTON_USER
  * @param  Button_Mode: Specifies Button mode.
  *   This parameter can be one of following parameters:
  *     @arg BUTTON_MODE_GPIO: Button will be used as simple IO
  *     @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt
  *                            generation capability
  * @retval None
  */
void STM_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the BUTTON Clock */
  RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  /* Configure Button pin as input */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];
  GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);

  if (Button_Mode == BUTTON_MODE_EXTI)
  {
    /* Connect Button EXTI Line to Button GPIO Pin */
    SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);

    /* Configure Button EXTI line */
    EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button];
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    /* Enable and set Button EXTI Interrupt to the lowest priority */
    NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button];
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);
  }
}

/**
  * @brief  Returns the selected Button state.
  * @param  Button: Specifies the Button to be checked.
  *   This parameter should be: BUTTON_USER
  * @retval The Button GPIO pin value.
  */
uint32_t STM_PBGetState(Button_TypeDef Button)
{
  return GPIO_ReadInputDataBit(BUTTON_PORT[Button], BUTTON_PIN[Button]);
}

// A gombunk beolvasott értéke
__IO uint8_t UserButtonPressed = 0x00;


/*--------------------------------------------------*/
void main(void){
		/* Key Button configuration */
	  STM_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);

// **** A gomb használat

	/* Read Key button	*/
UserButtonPressed = STM_PBGetState(BUTTON_USER);

/* Loop while Key button is maintained pressed */
while(STM_PBGetState(BUTTON_USER) == RESET)
{
}
/* Wait until Key button is pressed */
 	while(STM_PBGetState(BUTTON_USER) != RESET){
}
// ****

}
Kicsit bonyolultnak tűnik! De csak 1* kel jól megcsinálni.
8)

Kód: Egész kijelölése

void Wait_UserKey(void);

/*
 * Wait gombnyomásra | felengedésre
 */
void Wait_UserKey(void){
	/* Loop while Key button is maintained pressed */
	while(STM_PBGetState(BUTTON_USER) == RESET){
	}
	Delay1NS(50);		//	Wait button Prel! 50 nanosec
	/* Wait until Key button is pressed */
	while(STM_PBGetState(BUTTON_USER) != RESET){
	}
}
:wink:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Úgy nézki egyedül maradok a Discovery projektembe!? (Igaz a neve is Felfedező!)

A nyomógombos kitérő után, megint az LCD-vel foglalkozok!

Most a kijelzés módok beállításának megkönnyítésére készült 1 rutin.

Text és Grafikus kijelző + a Cursor, ki-be kapcsolgatására szolgál.

A legtöbb változó Globális mert más rutinok is használják.
(Sajnos még nem tudok jobb módszert erre!)

Kód: Egész kijelölése

#include "stm32f4xx.h"
#include "glcd_t6963c.h"

uint8_t display_mode= 0;		// Tároljuk Az aktuállis display_mode sorszám
uint16_t glcd_moderegiszter;		// Tároljuk Az aktuállis Mode Regiszter	értékét
uint16_t glcd_setregiszter;		// Tároljuk Az aktuállis Set  Regiszter	értékét
void GLCD_DisplayMode(uint8_t dmode);

/*..................................................................................................*/
/**
 *  Select Display Mode
 * 0	= Display Off (Ki)
 *
 * Internal CG ROM mode
 * 1	= Text On  (Be), Graphic Off (Ki), Cursor Off (Ki)
 * 2	= Text On  (Be), Graphic Off (Ki), Cursor On  (Be), Blink On  (Be)
 * 3	= Text On  (Be), Graphic Off (Ki), Cursor On  (Be), Blink Off (Ki)
 * 4	= Text On  (Be), Graphic On  (Be), Cursor On, (Be), Blink Off (Ki)
 * 5	= Text On  (Be), Graphic On  (Be), Cursor Off (Ki)
 * 6	= Text On  (Be), Graphic On  (Be), Cursor On, (Be), Blink Off (Ki)
 * 7	= Text Off (Ki), Graphic On  (Be), Cursor Off (Ki)
 * 8	= Text On  (Be), Graphic On  (Be), Cursor On, (Be), Blink On  (Be)
 *
 * SET External CG RAM mode
 * 11 - 18 -"-
 */
void GLCD_DisplayMode(uint8_t dmode){
// Globális változók
	display_mode = dmode;		// Tároljuk Az aktuállis display_mode sorszámot
//  glcd_moderegiszter			// Tároljuk Az aktuállis Mode Regiszter	értékét
//  glcd_setregiszter			// Tároljuk Az aktuállis Set  Regiszter	értékét
	switch (dmode) {
		case 0:			//	Display Off (Ki)
			glcd_moderegiszter = T6963CMD_DISPLAY_OFF;					// 10010000  Display Off (Ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			break;

	/* MODE SET INTERNAL CG ROM mode	*/
		case 1:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffCursorOff;	// 10010100  Text On (Be), Graphic Off (Ki),  Cursor off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 0;								// Cursor no moves  (ki)
			break;
		case 2:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffBlinkOn;		// 10010111  Text On (Be), Graphic Off (Ki), Cursor Blink On (Be)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
		case 3:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffBlinkOff;		// 10010110  Text On (Be), Graphic Off (Ki), Cursor On (be), Cur blink off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
	/* Cursor on (be), blink off (ki)  b1001XX10	*/
		case 4:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text On (Be), Graphic On (Be), Cursor on, Blink Off
			glcd_setregiszter = T6963CMD_INT_TEXT_Attributemode; 		// 10000100 Tex Attribute mode
			activated_cursor_pointer = 1;								// Cursor moves
			break;
		case 5:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnCursorOff;		// 10011100  Text On (Be), Graphic On (Be), Cursor Off (ki)
			glcd_setregiszter = T6963CMD_INT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 6:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text On (Be), Graphic On (Be), Cursor On, Blink Off
			glcd_setregiszter = T6963CMD_INT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
	/* Cursor on, blink on		b1001XX11	*/
			break;
		case 7:
			glcd_moderegiszter = T6963CMD_TEXTOffGRAPHICOnCursorOff;	// 10011000  Text Off (Ki), Graphic On (Be), Cursor Off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 8:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOn;		// 10011111  Text On (Be), Graphic On (Be), Cursor On, Blink On (Be)
			glcd_setregiszter = T6963CMD_INT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
	/* MODE SET EXTERNAL CG RAM mode	*/
		case 11:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffCursorOff;	// 10010100  Text Be, Graphic Ki,  Cursor off (ki)
			glcd_setregiszter = T6963CMD_EXT_ORmode;					// 10001000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 12:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnCursorOff;		// 10011100  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_TEXT_Attributemode;		// 10001100 Tex Attribute mode blink
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 13:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffBlinkOff;		// 10010110  Text Be, Graphic Ki Cursor on (be), blink off (ki)
			glcd_setregiszter = T6963CMD_EXT_ORmode;					// 10001000  Text
			activated_cursor_pointer = 1;								// Cursor moves
			break;
	/* Cursor on (be), blink off (ki)  b1001XX10	*/
		case 14:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_TEXT_Attributemode; 		//  10001100 Tex Attribute mode
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 15:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnCursorOff;		// 10011100  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_EXORmode;					// 10001001 Graphic EXOR Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 16:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOff;		// 10011110  Text Be, Graphic Be, Cursor On
			glcd_setregiszter = T6963CMD_EXT_EXORmode;					// 10001001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
	/* Cursor on, blink on		b1001XX11	*/
			break;
		case 17:
			glcd_moderegiszter = T6963CMD_TEXTOffGRAPHICOnCursorOff;	// 10011000  Text Ki, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_ORmode;					// 10001000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
			break;
		case 18:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOnBlinkOn;		// 10011110  Text Be, Graphic Be
			glcd_setregiszter = T6963CMD_EXT_EXORmode;					// 10000001 Graphic EXOR Text
			activated_cursor_pointer = 1;								// Cursor moves
		default:
			glcd_moderegiszter = T6963CMD_TEXTOnGRAPHICOffCursorOff;	// 10010100  Text Be, Graphic Ki,  Cursor off (ki)
			glcd_setregiszter = T6963CMD_INT_ORmode;					// 10000000  Text
			activated_cursor_pointer = 0;								// Cursor no moves
	}
	GLCD_WriteC_D(glcd_moderegiszter, GLCD_CMD, STATUSCHECK_MASK3);		// Write Display Mode Regiszter
	GLCD_WriteC_D(glcd_setregiszter, GLCD_CMD, STATUSCHECK_MASK3);		// Write Mode Set Regiszter
}
Elég bő a választék!

Case 11: töl van az /* MODE SET EXTERNAL CG RAM mode */
De még nem tudok feltölteni bele külső karaktereket! (Jó lessz később.)

Következő feladat String pozicionálás és ki irás, Corsor mozgatással.


8)
Válasz küldése