Тебя трудно понять, пятый символ первой строки и второй, либо пять символов первой строки и второй?
Резет нажми и удержи или паузу в отладчике, мерцают эти показания или нет?
Тот код что ты выкладывал только с одно строкой, второй строки не было, так что новый код в студию.
Пятый символ первой и втрой строки.Не пять.При настройки первой переменной.А второй и третей и четвёртой нормально.Мне кажется это связано с 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 сектор символа мерцает.Как сверху так и снизу.