Скажите пожалуйста ,насколько легитимно использовать для обнуления структуры строку My_Touch_t my_touch = { 0 };
в 12 строке key.c ? если учесть , что она сперва обьявляется в main.c строка 48.
Код работает нормально, компилятор не ругается, по дампу все обнуляется , но возможно так делать не желательно , а правильнее использовать строки типа 13-17?
На явный запрет такого использования ссылок не нашел.
Спасибо.
key.h
......
.....
enum what{
no_m,
up_m,
down_m,
enter_m,
add_m,
cancel_m,
};
typedef volatile struct {
uint8_t nn;
uint8_t kod;
uint8_t pages;
uint8_t stat;
uint8_t buff_alf;
uint8_t type_draw;
uint16_t XX;
uint16_t YY;
uint16_t XXOLD;
uint16_t YYOLD;
} My_Touch_t;
.......
.......
key.c
#include "keys.h"
#include "s_var.h"
char alf[] = { "1234567890QWERTYUIOPASDFGHJKL*ZXCVBNM.-= " };
void key4select(void) { // функция опроса тач кнопок
NVIC_EnableIRQ(EXTI4_IRQn); // включить опрос тача
My_Touch_t my_touch = { 0 }; // очистить структуру ( в майне ее уже обьявлял)
my_touch.buff_alf = 0; // или.... так?
my_touch.stat = 0;
my_touch.nn = 0;
my_touch.kod = no_m;
my_touch.type_draw = 0;
while (my_touch.stat < 10) //цикл опроса тача пока не нажат энтер
{
if ((my_touch.stat == 1) || (my_touch.stat == 3))
select4();
}
}
void select4(void) {
if ((TouchCount911 > 0) && (my_touch.stat == 1))
{
my_touch.XXOLD = 20;
my_touch.YYOLD = 20;
my_touch.stat = 2;
if ((my_touch.XX > 621) && (my_touch.XX < 695) && (my_touch.YY > 120)
&& (my_touch.YY < 150))
{
my_touch.kod = up_m;
} else if ((my_touch.XX > 621) && (my_touch.XX < 695)
&& (my_touch.YY > 180) && (my_touch.YY < 220))
{
my_touch.kod = down_m;
} else if ((my_touch.XX > 621) && (my_touch.XX < 695)
&& (my_touch.YY > 250) && (my_touch.YY < 280))
{
my_touch.kod = enter_m;
} else if ((my_touch.XX > 621) && (my_touch.XX < 695)
&& (my_touch.YY > 320) && (my_touch.YY < 350))
{
my_touch.kod = add_m;
} else
my_touch.stat = 1;
if (my_touch.stat == 2)
LCD_Draw_Round_Rect(600, 44 + (my_touch.kod * 66), 85, 35, 5, 5,
BLUE); //0xffdf);
NVIC_EnableIRQ(EXTI4_IRQn);
}
if ((TouchCount911 == 0) && (my_touch.stat == 3))
{
LCD_Draw_Round_Rect(600, 44 + (my_touch.kod * 66), 85, 35, 5, 5,
NOTBLUEKEY);
if ((my_touch.kod == up_m) && (my_touch.nn > 0))
my_touch.nn--;
if ((my_touch.kod == down_m) && (my_touch.nn < 7))
my_touch.nn++;
my_touch.stat = 4;
NVIC_EnableIRQ(EXTI4_IRQn);
}
}
main.c
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "fatfs.h"
#include "i2c.h"
#include "sdio.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "fsmc.h"
#include "s_var.h"
#include "fonts.h"
#include "stdio.h"
#include "w25qxx.h"
#include "24LC02.h"
#include "GT911.h"
#include "IMAGE.h"
#include "spi_7796.h"
#include "SSD1963.h"
#include "SSD1963_LL.h"
#include "keys.h"
#include "menu.h"
#include "PICTURESSD.h"
GT911Touch_TypeDef GT911Touch[5];
........
........
int main(void)
{
.......
......
......
LCD_Init();
LCD_DrawFullScreen(BLACK);
HAL_Delay(50);
GT911_Init();
W25qxx_Init();
SD_init();
__HAL_TIM_CLEAR_FLAG(&htim7, TIM_SR_UIF);
HAL_TIM_Base_Start_IT(&htim7);
NVIC_DisableIRQ(EXTI4_IRQn);
My_Touch_t my_touch={0};
my_time.my_sec = 0;
my_time.my_min = 0;
my_time.my_msec = 0;
my_touch.stat=12;
size_eep=READ_EE(EEP_SIZE);
while (1)
{
..............................
if ( keyboard) key4select(); // если нужно вводить цифры буквы вызываем подпрограмму работы с тачем
.............................
}
}
void EXTI4_IRQHandler(void) //реакция на нажатие пальцем тача
{
// gt911
TouchCount911 = GT911_ReadTouch(>911Touch[0]);
EXTI->PR |= TOUCH_IRQ_Pin;
NVIC_ClearPendingIRQ(EXTI4_IRQn);
char a[50]={0};
sprintf(a, "%d",GT911Touch[0].XCoordinate);
LCD_PrintString24(265, 10, RED, BLACK, a);
sprintf(a, "%d",GT911Touch[0].YCoordinate);
LCD_PrintString24(400, 10, RED, BLACK,a);
my_touch.XX = GT911Touch[0].XCoordinate;
my_touch.YY = GT911Touch[0].YCoordinate;
if ((my_touch.stat == 5) && (TouchCount911 > 0))
{
//my_touch.XX = GT911Touch[0].XCoordinate;
//my_touch.YY = GT911Touch[0].YCoordinate;
my_touch.stat = 6;
NVIC_DisableIRQ(EXTI4_IRQn);
} else
if ((my_touch.stat == 7) && (TouchCount911 == 0))
{
my_touch.stat = 8;
NVIC_DisableIRQ(EXTI4_IRQn);
} else
if ((my_touch.stat == 0) && (TouchCount911 > 0))
{
my_touch.stat = 1;
NVIC_DisableIRQ(EXTI4_IRQn);
} else if ((my_touch.stat == 2) && (TouchCount911 == 0))
{
my_touch.stat = 3;
NVIC_DisableIRQ(EXTI4_IRQn);
}
}
спасибо …
p/s и попутно вопрос …
подпрограмма select4() вызывается всегда только с одного места программы .
ее можно было даже не выделять в подпрограмму ,а использовать прямо в коде …
Но когда оформлена отдельно очень удобно разбираться в коде …
Но возможно такие подпрограммы желательно оформлять как inline ?