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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

ARM STM32F4DISCOVERY board

HozzászólásSzerző: kapu48 » 2012. augusztus 15. szerda, 11:04

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 18. szombat, 18:16

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 18. szombat, 18:18

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 20. hétfő, 7:43

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 20. hétfő, 7:46

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
Tartózkodási hely: Velence

HozzászólásSzerző: ImTilk » 2012. augusztus 20. hétfő, 11:29

Ü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.kepfeltoltes.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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 21. kedd, 6:35

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 21. kedd, 8:02

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 29. szerda, 9:45

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 29. szerda, 9:52

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 29. szerda, 10:10

É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
Tartózkodási hely: Bp

HozzászólásSzerző: macsek » 2012. augusztus 29. szerda, 11:37

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. augusztus 29. szerda, 11:56

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. szeptember 1. szombat, 13:05

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: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. szeptember 4. kedd, 17:37

Ú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)


Vissza: “Minden, ami ARM”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég