ARM STM32F4DISCOVERY board
ARM STM32F4DISCOVERY board
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.
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.
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.
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.
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
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
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
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_ */
A hozzászólást 2 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 6. csütörtök, 17:49-kor.
Üdv mindenkinek
Nagyon örülök, hogy más is játszadozik ezzel a kit-el Magyarországon nem csak én
Én úgy kerültem kapcsolatba ezzel a kis csoda cuccal, hogy még valamikor az év elején rendeltem az e-bay-en, két ili9325-ös vezérlő ic-vel ellátott touch-os 320*240-es felbontású lcd-t, csináltam hozzá mega32-vel egy tesztpanelt...
Sok-sok szenvedés után bascom-ban sikerült feléleszteni, de hihetetlen lassú volt, mire egy bmp-t kiraktam az lcd-re.
Gondoltam próbáljuk meg c-ben, vettem egy ansi c könyvet antikváriumban, felraktam az akkor legújabb AVRstúdiót, aztán 1-2 hónap tanulás után c-ben is megszólalt a kijelzőm az AVR-el.
Sokkal gyorsabb volt mint bascomban, a lefordított kód is kisebb de még mindig nem volt kielégítő a sebesség...
Mivel az lcd-t lehet hajtani 8 bites busszal is meg 16 bites busszal is, avr-el meg csak 8 bitesen lehet, így elkezdtem keresni egy kontrollert aminek van 16 bites adatbusza így találtam rá erre a stm32f4discovery kitre.
Megrendeltem, csináltam hozzá egy ilyen (http://kepfeltoltes.hu/120820/panel_www ... es.hu_.jpg) hordozópanelt, most ott tartok, hogy bmp-t meg tudok jeleníteni vele memóriakártyáról, usb-n keresztül pendrive-ról (igen van benne usb-host ), működik a touch panel, és tudom kalibrálni is, elkezdtem implementálni az st grafikus lib-jét is, ott még vannak problémáim...
Nekem is nagyon tetszik ez a mikrovezérlő, hihetetlen képességei vannak, a discovery panel meg teli van alapból érdekes perifériákkal, ennyi pénzért egy olyan kezdő mint én álmodni se tudna jobbat...
Ami konkrét tapasztalatot, segítséget én hozzá tudok ide tenni :
-Ha discovery panelt használsz, akkor nem tudsz hozzátenni plusz külső sram memóriát, mert 100 lábú tok van a panelen és ezen nincs kivezetve az összes FSMC láb, csak a 144-es tokozásún.
Jól rá fáztam rendeltem kintről két 256kb-s gyors sram-ot, hogy legyen buffer az lcd kijelzőnek, elkezdtem tervezni az új hordozópanelt, és akkor jöttem rá, hogy nem fog összejönni...
-Ha külső lcd-t raksz rá, mondjuk olyat mind amilyet én használok, ne a sima 16 bites port valamelyikét használd, hanem az FSMC portot, valószínűleg sokkal-sokkal gyorsabb lesz a megjelenítés, legalábbis ezt olvastam a neten...
Ez a port közvetlenül csatlakozik a belső busz-ra, így DMA-val egyből, a processzor minimális terhelésével lehet tolni rá az adatokat mondjuk az sd kártyáról az lcd-re... (vagy a memóriából az lcd-re, kikerülve a procit)
Igaz ezt még nem próbáltam csak mondok nagyokat, mintha értenék hozzá , 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
Nagyon örülök, hogy más is játszadozik ezzel a kit-el Magyarországon nem csak én
Én úgy kerültem kapcsolatba ezzel a kis csoda cuccal, hogy még valamikor az év elején rendeltem az e-bay-en, két ili9325-ös vezérlő ic-vel ellátott touch-os 320*240-es felbontású lcd-t, csináltam hozzá mega32-vel egy tesztpanelt...
Sok-sok szenvedés után bascom-ban sikerült feléleszteni, de hihetetlen lassú volt, mire egy bmp-t kiraktam az lcd-re.
Gondoltam próbáljuk meg c-ben, vettem egy ansi c könyvet antikváriumban, felraktam az akkor legújabb AVRstúdiót, aztán 1-2 hónap tanulás után c-ben is megszólalt a kijelzőm az AVR-el.
Sokkal gyorsabb volt mint bascomban, a lefordított kód is kisebb de még mindig nem volt kielégítő a sebesség...
Mivel az lcd-t lehet hajtani 8 bites busszal is meg 16 bites busszal is, avr-el meg csak 8 bitesen lehet, így elkezdtem keresni egy kontrollert aminek van 16 bites adatbusza így találtam rá erre a stm32f4discovery kitre.
Megrendeltem, csináltam hozzá egy ilyen (http://kepfeltoltes.hu/120820/panel_www ... es.hu_.jpg) hordozópanelt, most ott tartok, hogy bmp-t meg tudok jeleníteni vele memóriakártyáról, usb-n keresztül pendrive-ról (igen van benne usb-host ), működik a touch panel, és tudom kalibrálni is, elkezdtem implementálni az st grafikus lib-jét is, ott még vannak problémáim...
Nekem is nagyon tetszik ez a mikrovezérlő, hihetetlen képességei vannak, a discovery panel meg teli van alapból érdekes perifériákkal, ennyi pénzért egy olyan kezdő mint én álmodni se tudna jobbat...
Ami konkrét tapasztalatot, segítséget én hozzá tudok ide tenni :
-Ha discovery panelt használsz, akkor nem tudsz hozzátenni plusz külső sram memóriát, mert 100 lábú tok van a panelen és ezen nincs kivezetve az összes FSMC láb, csak a 144-es tokozásún.
Jól rá fáztam rendeltem kintről két 256kb-s gyors sram-ot, hogy legyen buffer az lcd kijelzőnek, elkezdtem tervezni az új hordozópanelt, és akkor jöttem rá, hogy nem fog összejönni...
-Ha külső lcd-t raksz rá, mondjuk olyat mind amilyet én használok, ne a sima 16 bites port valamelyikét használd, hanem az FSMC portot, valószínűleg sokkal-sokkal gyorsabb lesz a megjelenítés, legalábbis ezt olvastam a neten...
Ez a port közvetlenül csatlakozik a belső busz-ra, így DMA-val egyből, a processzor minimális terhelésével lehet tolni rá az adatokat mondjuk az sd kártyáról az lcd-re... (vagy a memóriából az lcd-re, kikerülve a procit)
Igaz ezt még nem próbáltam csak mondok nagyokat, mintha értenék hozzá , 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
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!
Ö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!
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:
Talán minden érthető a linkelt pdf és az elnevezések egyezése alapján!
* 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ó!
A hozzászólást 3 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 6. csütörtök, 18:05-kor.
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 */
(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.
És az első Text sor ki író main.c
Első benyomásra kegyetlen gyors! Az AVR-ekhez képest
Frissítve 2012 Szept. 6
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****/
Frissítve 2012 Szept. 6
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. szeptember 6. csütörtök, 18:02-kor.
Persze, h az. Arra való, h nagy adatmennyiséget elfogadható idő alatt kezeljen.kapu48 írta:Első benyomásra kegyetlen gyors! Az AVR-ekhez képest
Az AVR meg nem arra
Az én fejemben az ARM az mikroprocesszor, az AVR pedig mikrokontroller.
Mi ez a furcsaság? Miért kell a 32-ből levonni 32-t?kapu48 írta:Kód: Egész kijelölése
GLCD_Clear_Text(' '-32);
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.
Kicsit bonyolultnak tűnik! De csak 1* kel jól megcsinálni.
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){
}
// ****
}
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){
}
}
Ú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!)
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.
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
}
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.