Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 17:03:32

Eddy_Em, не поленился, специально для тебя нашёл. Ничто не предвещало memcpy и memset в этом месте.


А избавиться от них, как ни странно, помогает volatile
Код:
for (volatile uint32_t *pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst ++= *pSrc++) ;

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 17:32:34

VladislavS, у меня все без memcpy инициализируется.
А вообще, сама memcpy чаще всего в макрос builtin разворачивается, это ж не printf какой-нибудь уродский!

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 17:48:33

VladislavS, у меня все без memcpy инициализируется.
Я тоже так думал, пока на досуге не заглянул. Самое прикольное, что добавление тут двух volatile уменьшает код на 32 байта (memcpy и memset не линкуются в код). С другой стороны, если потом в коде их использовать, то это будет практически бесплатно.

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 18:52:07

VladislavS, это
Код:
pDst != _edata;
условие справедливо если массив _edata идет строго за _sdata.
А на деле не так, мне компилятор поместил _edata в середину между _sidata и _sdata, хотя объявил _sidata _sdata _edata. Это как понять? Бросим монетку на удачу?

Но тем более, если в структуре задать, то там все четко.
Ну а тесты говорят сами за себя
Код:
for      251us    34байт    
memcpy    284us   18байт
Время измерено на какой-то частоте в протеусе, не важно, вообще не смотрел, что там в протеусе выставлено. Компилятор avr-gcc.

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 19:01:16

Dimon456, когда вы говорите, у меня складывается впечатление, что вы бредите. Цитата из линкерскрипта.
Код:
   .data :
   {
      . = ALIGN(4);
      _sdata = .;

      PROVIDE(__data_start__ = _sdata);
      *(.data)
      *(.data*)
      . = ALIGN(4);
      _edata = .;

      PROVIDE(__data_end__ = _edata);
   } > SRAM AT >FLASH

   _sidata = LOADADDR(.data);
Где вы тут массивы увидели?

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 19:20:41

VladislavS писал(а):Где вы тут массивы увидели?
Тут, нет, а на вашем рисунке, да.
Код:
extern uint32_t _sidata[], _sdata[], _edata[];
Отсюда можно сделать вывод, что это массивы.

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 19:34:44

Вы где программированию учились? _sidata, _sdata, _edata создаёт линкер. Это просто адреса - ни разу не массивы. Как я их трактую в программе он вообще не знает. А уж расположить в памяти иначе как написано в линкерскрипте не имеет ни возможности, ни права. Его дело тупо подставить число (адрес).

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 20:10:23

VladislavS писал(а):_sidata, _sdata, _edata создаёт линкер.
Да же если и так, все равно, конструкция хлипкая, можно легко ошибиться, и нужно по 10 раз все проверять.
А из моего теста видно, memcpy меньше занимает, но и процентов на 12 дольше выполняется, если из-за этих 12 процентов городить цикл for, не ужели это так важно?

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 20:33:38

Да же если и так, все равно, конструкция хлипкая, можно легко ошибиться
Во-первых, объясните мне как можно ошибиться в двух указателях?
Во-вторых, эта конструкция в разных вариациях используется во всех стартап-файлах и никто ещё не ошибся даже на асме.
и нужно по 10 раз все проверять.
Иногда нужно проверять даже NOP.

А из моего теста видно,
Цена его применительно к ARM примерно как у теста на беременность.

memcpy меньше занимает,
memcpy занимает больше и линкуется в комплекте с memset. Единственное, если в программе они где-то ещё используются, то разница сходит на нет.

но и процентов на 12 дольше выполняется,
Цикл выполняется более чем в 4 раза быстрее. memcpy побайтово копирует. Как видно из линкерскрипта, данные выровнены по 32 бита, поэтому цикл копирует по 4 байта за раз. Плюс нет лишних переходов.

если из-за этих 12 процентов городить цикл for,
Вы всё поставили с ног на голову. Во всех поставляемых в CMSIS стартапах, виденных мной, используются циклы для копирования. Что вы предлагаете?

не ужели это так важно?
Код стартапа пишется один раз и используется во всех проектах. Потратить 15 минут на то чтобы посмотреть как он работает и оптимизировать стоит того. В любом случае, вы уже больше времени потратили, чтобы оспорить это на форуме.

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 20:59:20

Вот, стандартный стартап

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 21:14:04

Я тоже так думал

Что значит "думал"? Ты ж сам пишешь себе все. Да, что-то откуда-то берется, но обдумывается и выливается в то, что тебе нужно.
У меня вот в скрипте для линкера всегда есть дополнительная секция для эмуляции EEPROM во флеше. Замучился искать, как автоматизировать выравнивание для разных МК (там ведь у некоторых STM32 по 2кБ секция), но в итоге все получилось.

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 21:17:06

Вот, стандартный стартап

Во-первых, интересно, кто его cтандартным сделал?
Во-вторых, там точно такой же цикл с двумя указателями. Кто-то просто не смог его записать одним лаконичным выражением.
В-третьих, перед инициализацией сегментов данных необходимо вызвать SystemInit(). В ней может находиться код включения этих самых сегментов памяти. Да даже просто переход на более высокую тактовую частоту, включение кэша и предвыборки флэша сильно ускорит выполнение этого кода.

Если уж хотите стандартные стартапы посмотреть, хотя бы в официальных репозиториях поройтесь. Что-то тип https://github.com/ARM-software/CMSIS_5 Ну уж ни как не выкидыши каких-то левых ide.
Последний раз редактировалось VladislavS Вт янв 25, 2022 21:30:49, всего редактировалось 3 раз(а).

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 21:18:47

необходимо вызвать SystemInit()

А какое убогое китайское рукожопие сказало, что нужно функцию инициализации так называть?
Мне такое не нравится, и я все как назвал, так и назвал. И не собираюсь потакать этим кривожопым быдлокодерам от ST!

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 21:26:48

Что значит "думал"? Ты ж сам пишешь себе все. Да, что-то откуда-то берется, но обдумывается и выливается в то, что тебе нужно.
А потом приходит компилятор, видит паттерн копирования и молча заменяет его на вызов memcpy. И ничегошеньки тебе об этом не говорит. Видел мой скриншот? Я же не поленился, специально тебе его делал. Зачем тут Димон так подставился, я вообще хз.

Добавлено after 5 minutes 24 seconds:
А какое убогое китайское рукожопие сказало, что нужно функцию инициализации так называть?
Ну ты полегче на поворотах. Стандартизация это благо. Вот я написал SystemInit() и ты сразу понял о чём речь. Что в этом плохого, кроме твоего "А Баба Яга против!" ?

Мне такое не нравится, и я все как назвал, так и назвал. И не собираюсь потакать этим кривожопым быдлокодерам от ST!
Кто-то тебя заставляет? Можешь/хочешь всё переписать? Флаг в руки - барабан на шею и в перёд с песней :))) И ST тут вообще никаким боком. CMSIS это ARM.

Re: CUbeide 1.8 глючит.

Вт янв 25, 2022 22:42:20

Я наладил проекты некоторые.У меня единственная проблема .Что при инкременте и декременте.В перавом меню. lcd выдаёт непонятное.Если я настраиваю от нуля до 1023.Всё нормально.А если в -- и потом ++ .То цифры появляются лишние разряды.?

Re: CUbeide 1.8 глючит.

Ср янв 26, 2022 06:46:24

Приведите ПРИМЕР лишних разрядов. Что пишет на экране?
Погодные условия не позволяют использовать чтение мыслей на расстоянии.

С другой стороны, подозреваю [в который раз] либо перевод отрицательного числа в положительное (потерю признака знаковой переменной в операциях с переменными), промахи с разрядностью числа, кривую конвертацию числа в текст, или же (самое простое) не затёртое на экране знакоместо.
Скажем так:
Value: 99
Value: 100
Value: 101
Value: 100
Value: 990 <- Не стёрт 0 от числа "100", но "99" использует только два символа и не чистит третий.
Value: 980 <-

Re: CUbeide 1.8 глючит.

Ср янв 26, 2022 09:21:51

VladislavS писал(а):там точно такой же цикл с двумя указателями. Кто-то просто не смог его записать одним лаконичным выражением.
Я туды не заглядывал, без надобности.
И что изменится от перестановки, разве что volatile объявить.
Ты да же тут пытаешься байт выжить и лишнюю микросекунду.
VladislavS писал(а):перед инициализацией сегментов данных необходимо вызвать SystemInit(). В ней может находиться ...
Полезное замечание, на будущее учтем.
VladislavS писал(а):не выкидыши каких-то левых ide
У тебя ide какое-то эксклюзивное, не подскажешь где скачать?

ivan dimir, судя по твоему прошлому коду
Код:
      case 4:
        sprintf(nastroyki.buf6, "d=%2d ", danie.d);
        LCD_SetPos(0, 0);
        LCD_String(nastroyki.buf6);
        break;
для отображения числа 1023, d=%2d, двоечки маловато будет, d=%4d, а если к примеру, число 99 то результат будет выравнен по правому краю, а недостающие два символа будут заполнены пробелами.
Если указать d=%-4d, то результат будет выравнен по левому краю, а недостающие два символа будут заполнены пробелами.
Если указать d=%04d, то результат будет выравнен по правому краю, а недостающие два символа будут заполнены нулями.
Если указать d=%-04d, то результат будет выравнен по левому краю, а недостающие два символа будут заполнены нулями.

Re: CUbeide 1.8 глючит.

Ср янв 26, 2022 18:51:38

VladislavS писал(а):там точно такой же цикл с двумя указателями. Кто-то просто не смог его записать одним лаконичным выражением.
Я туды не заглядывал, без надобности.
И что изменится от перестановки, разве что volatile объявить.
Ты да же тут пытаешься байт выжить и лишнюю микросекунду.
VladislavS писал(а):перед инициализацией сегментов данных необходимо вызвать SystemInit(). В ней может находиться ...
Полезное замечание, на будущее учтем.
VladislavS писал(а):не выкидыши каких-то левых ide
У тебя ide какое-то эксклюзивное, не подскажешь где скачать?

ivan dimir, судя по твоему прошлому коду
Код:
      case 4:
        sprintf(nastroyki.buf6, "d=%2d ", danie.d);
        LCD_SetPos(0, 0);
        LCD_String(nastroyki.buf6);
        break;
для отображения числа 1023, d=%2d, двоечки маловато будет, d=%4d, а если к примеру, число 99 то результат будет выравнен по правому краю, а недостающие два символа будут заполнены пробелами.
Если указать d=%-4d, то результат будет выравнен по левому краю, а недостающие два символа будут заполнены пробелами.
Если указать d=%04d, то результат будет выравнен по правому краю, а недостающие два символа будут заполнены нулями.
Если указать d=%-04d, то результат будет выравнен по левому краю, а недостающие два символа будут заполнены нулями.

Вот вхожу в настройки первой переменной .И есть проблемы 5 символа 1 строки и второй.Какое то мерцание.Перехожу в настройки второй переменной.Третей и так далее .Всё в норме.В AVR такого не было.Пришлось сместить первую переменную в право на 3 симолных сектора.И как то по другому считает?

Re: CUbeide 1.8 глючит.

Ср янв 26, 2022 19:23:41

Тебя трудно понять, пятый символ первой строки и второй, либо пять символов первой строки и второй?
Резет нажми и удержи или паузу в отладчике, мерцают эти показания или нет?
Тот код что ты выкладывал только с одно строкой, второй строки не было, так что новый код в студию.

Re: CUbeide 1.8 глючит.

Ср янв 26, 2022 21:20:39

Тебя трудно понять, пятый символ первой строки и второй, либо пять символов первой строки и второй?
Резет нажми и удержи или паузу в отладчике, мерцают эти показания или нет?
Тот код что ты выкладывал только с одно строкой, второй строки не было, так что новый код в студию.

Пятый символ первой и втрой строки.Не пять.При настройки первой переменной.А второй и третей и четвёртой нормально.Мне кажется это связано с I2C.Так как lcd 16x02 находится на этой шине..Ну я обошёл этот сектор символьный.При насторйке видно.А когда запускаю Часы DS3231 нормально.? Что это за баг .Програмный или апаратный?.И как его лучше решить.Микросхема stm32f411cu

Добавлено after 19 minutes 40 seconds:
[code][/code]
/*
* main.c
*
* Created on: Apr 4, 2021
* Author: Admin
*/

#include"main.h"
#include <stdio.h>
#define SYSCLOCK 100000000U
#define PLL_M 12
#define PLL_N 96

#define PLL_P 2
__IO uint32_t tmpreg;
__IO uint32_t SysTick_CNT = 0;

unsigned char menu_btn;
unsigned char menu_lcd;
char buf[100];
char buf1[50];
char buf2[50];
char buf3[50];
char buf4[50];
char buf5[50];
char buf6[50];
char buf7[50];
char buf8[50] ="Bobr_stm32";
volatile unsigned char flag=0;
volatile unsigned char flag1;
volatile unsigned int pauza=0;
volatile unsigned int pauza1=0;
volatile unsigned char a1;
volatile unsigned char a2;
volatile unsigned char b1;
volatile unsigned char b2;
volatile unsigned char c1;
volatile unsigned char c2;
volatile unsigned char d1;
volatile unsigned char d2;
uint16_t a;
volatile unsigned int b;
volatile unsigned int c;
volatile unsigned int d;
unsigned int result_a;
unsigned int result_b;
unsigned int result_c;
unsigned int result_d;

void NMI_Handler(void)
{
if((RCC->CIR & RCC_CIR_CSSF) != 0) // HSE fail
{
RCC->CIR |= RCC_CIR_CSSC; // Clear CSSF flag

}
}
void SysTick_Handler(void)
{
if(SysTick_CNT > 0) SysTick_CNT--;
}
void TIM1_UP_TIM10_IRQHandler(void)
{
if(TIM1->SR & TIM_SR_UIF)
{
TIM1->SR &= ~ TIM_SR_UIF;

}
}

void TIM2_IRQHandler (void)
{
if(TIM2->SR & TIM_SR_UIF)
{
TIM2->SR &= ~ TIM_SR_UIF;
//IWDG->KR = 0xAAAA;
pauza++;
if(pauza>40)
{
//IWDG->KR = 0xAAAA;
GPIOC-> BSRR |=GPIO_BSRR_BS13;

}
if(pauza>80)
{
GPIOC->BSRR|=GPIO_BSRR_BR13;
pauza=0;
}

}
}
void TIM3_IRQHandler (void)
{
if(TIM3->SR & TIM_SR_UIF)
{
TIM3->SR &= ~ TIM_SR_UIF;
pauza1++;
}
}
void init_systimer(void)
{
MODIFY_REG(SysTick->LOAD,SysTick_LOAD_RELOAD_Msk,SYSCLOCK / 1000 - 1);

CLEAR_BIT(SysTick->VAL, SysTick_VAL_CURRENT_Msk);
SET_BIT(SysTick->CTRL, SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);

}

void delay(__IO uint32_t tck)
{
while(tck)
{
tck--;
}
}
//----------
void delay_ms(uint32_t ms)
{
MODIFY_REG(SysTick->VAL,SysTick_VAL_CURRENT_Msk,SYSCLOCK / 1000 - 1);
SysTick_CNT = ms;
while(SysTick_CNT) {}
}
void DelayMicro(__IO uint32_t micros)
{
micros *=(SystemCoreClock / 1000000) / 9;
while (micros--);
}



void RCC_init(void)
{
FLASH->ACR |= FLASH_ACR_PRFTEN ;
//FLASH->ACR &=~ (FLASH_ACR_LATENCY_2WS) ;
FLASH->ACR |= FLASH_ACR_LATENCY_3WS ;

//PWR->CR|= PWR_CR_VOS;
RCC->CR|=RCC_CR_HSEON; // Enable HSE
while (!(RCC->CR & RCC_CR_HSERDY));


RCC->CR|=RCC_CR_CSSON;

RCC->PLLCFGR |=RCC_PLLCFGR_PLLSRC_HSE ;
RCC->PLLCFGR |= PLL_M>>RCC_PLLCFGR_PLLM_Pos |PLL_N << RCC_PLLCFGR_PLLN_Pos|PLL_P>>RCC_PLLCFGR_PLLP_Pos |RCC_PLLCFGR_PLLSRC_HSE;


RCC->CFGR |= RCC_CFGR_HPRE_DIV1;// ��������� ���� AHB
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;// ��������� ���� APB1

RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;

RCC->CR |= RCC_CR_PLLON; // enable PLL
while(!(RCC->CR & RCC_CR_PLLRDY))
{

}

RCC->CFGR |= RCC_CFGR_SW_PLL; // select source SYSCLK = PLL
while(!(RCC->CFGR& RCC_CFGR_SWS_PLL))

{

}



}
void init_IWDGtimer(void)
{
RCC->CSR|= RCC_CSR_LSION;



IWDG->KR = 0x5555; // Access to registers
IWDG->PR&= ~(IWDG_PR_PR_0 | IWDG_PR_PR_1 | IWDG_PR_PR_2); // 4096
IWDG->RLR = 2000;//0x7FF;
while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))){} // wait while bist of PVU and RVU will be set.
IWDG->KR = 0xCCCC; // Start count down;
}
void init_AHB1(void)
{
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOBEN;
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN;

RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN;
// RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN;
}
void GPIO_init(void)
{
GPIOC->MODER &=~ GPIO_MODER_MODER13_1;
GPIOC->MODER |= GPIO_MODER_MODER13_0;

GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_1; //���1
GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_0;
GPIOC->PUPDR |=GPIO_PUPDR_PUPDR13_1;
GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR13_0;

GPIOB->MODER &=~ GPIO_MODER_MODER4;

GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR4_1;
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR4_0;

GPIOB->MODER &=~ GPIO_MODER_MODER5;

GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR5_1;
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR5_0;

GPIOB->MODER &=~ GPIO_MODER_MODER8;
// GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR8_1;
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR8_0;

GPIOB->MODER &=~ GPIO_MODER_MODER9;
// GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;
GPIOB->PUPDR &=~GPIO_PUPDR_PUPDR9_1;
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR9_0;

}
void timer1_init(void)
{
RCC-> APB2ENR |=RCC_APB2ENR_TIM1EN;

TIM1->PSC = 2400-1; // ����������� �������� ��� ������ ����� 1000 ��� � �������
TIM1->ARR = 100 ;
TIM1->RCR=3;

TIM1->DIER |= TIM_DIER_UIE;
TIM1->EGR |= TIM_EGR_UG ;

TIM1->CR1|= TIM_CR1_CEN;
NVIC_EnableIRQ (TIM1_UP_TIM10_IRQn);
}
void timer_2_init(void)
{

RCC->APB1ENR |=RCC_APB1ENR_TIM2EN;

TIM2->PSC =3500-1; // ����������� �������� ��� ������ ����� 1000 ��� � �������
TIM2->ARR =100-1; //65535

TIM2->EGR|= TIM_EGR_UG;
TIM2->DIER |= TIM_DIER_UIE;
TIM2->CR1|= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM2_IRQn);
}
void timer_3_init(void)
{

RCC->APB1ENR |=RCC_APB1ENR_TIM3EN;

TIM3->PSC =3500-1 ; // ����������� �������� ��� ������ ����� 1000 ��� � �������
TIM3->ARR =100-1 ; //65535

TIM3->EGR|= TIM_EGR_UG;
TIM3->DIER |= TIM_DIER_UIE;
TIM3->CR1|= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM3_IRQn);
}
int main(void)
{

RCC_init();
init_systimer();
init_AHB1();
GPIO_init();
timer1_init();
timer_2_init();
timer_3_init();

I2C1_Init();


LCD_ini();
LCD_Clear();

while(1)
{
if((GPIOB->IDR&GPIO_IDR_IDR_5)==0)
{
delay_ms(20);
flag=1;
// LCD_Clear();
}

if(flag==1&&GPIOB->IDR&GPIO_IDR_IDR_5)
{
flag=0;
menu_lcd++;
menu_btn++;

}
switch(menu_btn)
{
case 0:



break;
case 1:

if((GPIOB->IDR&GPIO_IDR_IDR_4)==0)
{


if(pauza1>20)
{
pauza1=0;
if (a==4095)
{
a=0;
}
a++;
}

}

if((GPIOB->IDR&GPIO_IDR_IDR_8)==0)
{
//__disable_irq ();
if(pauza1>20)
{
pauza1=0;

if (a==0)
{
a=4095;
}
a--;
}
}

break;
case 2:
if((GPIOB->IDR&GPIO_IDR_IDR_4)==0)
{
if(pauza1>20)
{

pauza1=0;
if (b==4095)
{
b=0;
}
b++;
}
}
//__enable_irq ();
if((GPIOB->IDR&GPIO_IDR_IDR_8)==0)
{
if(pauza1>20)
{

pauza1=0;
if (b==0)
{
b=4095;
}
b--;
}
}


break;
case 3:

if((GPIOB->IDR&GPIO_IDR_IDR_4)==0)
{
if(pauza1>20)
{

pauza1=0;
if (c==4095)
{
c=0;
}
c++;
}
}
// __enable_irq ();
if((GPIOB->IDR&GPIO_IDR_IDR_8)==0)
{
if(pauza1>20)
{
pauza1=0;
if(c==0)
{
c=4095;
}
c--;
}
}

break;
case 4:

if((GPIOB->IDR&GPIO_IDR_IDR_4)==0)
{
if(pauza1>20)
{

pauza1=0;
if ( d==4095)
{
d=0;
}
d++;
}
}

if((GPIOB->IDR&GPIO_IDR_IDR_8)==0)
{
if(pauza1>20)
{

pauza1=0;

if (d==0)
{
d=4095;
}
d--;
}
}

break;
case 5:

menu_btn=0;
break;
}


switch(menu_lcd)
{
case 0:

// LCD_Clear();
LCD_SetPos(0,1);

LCD_String(buf8);
// delay_ms(20);
break;
case 1:
//LCD_Clear();

sprintf(buf," a= %4d",a);

LCD_SetPos(0,0);

LCD_String(buf);
// delay_ms(5);
break;
case 2:
//LCD_Clear();
sprintf(buf2,"b=%2d ",b);
LCD_SetPos(0,0);
LCD_String(buf2);
// delay_ms(10);
break;
case 3:
// LCD_Clear();
sprintf(buf4,"c=%2d ",c);
LCD_SetPos(0,0);
LCD_String(buf4);
//delay_ms(10);
break;
case 4:
// LCD_Clear();

sprintf(buf6,"d=%2d ",d);
LCD_SetPos(0,0);
LCD_String(buf6);
// delay_ms(10);
break;
case 5:

menu_lcd=0;
break;
}




}
}
переменная а у меня смещена вправо .Потому что 5 сектор символа мерцает.Как сверху так и снизу.
Ответить