Я делаю простой счетчик вверх / вниз, используя STM32F103C4, 2 кнопки и 7-сегментный дисплей, и код написан в Keil uVision, откуда шестнадцатеричный файл загружается в Proteus. Часть Counter Up работает отлично, но часть Counter Down просто не регистрирует никаких входных данных. Я попытался переключить контакты и пришел к выводу, что контакт B0 работает, но по какой-то причине контакт B1 не работает. Я искал все и спросил много, но я не могу найти решение. Связано ли это со специальным значением сброса порта B?
Ниже приведен мой код и сс схемы протей.
#include "stm32f10x.h" // Device header
int dispBroj[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
int j = 0;
void reset()
{
for(int i = 0; i < 7; i++)
{
GPIOA->ODR &=~ (1<<i);
}
}
void cifre(int broj)
{
GPIOA->ODR |= dispBroj[broj];
}
int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
GPIOA->CRL |=GPIO_CRL_MODE;
GPIOA->CRL &=~GPIO_CRL_CNF;
GPIOB->CRL|=((1<<7)|(1<<3));
GPIOB->CRL &=~((1<<2)|(1<<1)|(1<<0)|(1<<4)|(1<<5)|(1<<6));
GPIOB->CRH|=((1<<7)|(1<<3));
GPIOB->CRH &=~((1<<2)|(1<<1)|(1<<0)|(1<<4)|(1<<5)|(1<<6));
while(1){
cifre(j%10);
if(GPIOB->IDR & GPIO_IDR_IDR0){
reset();
j++;
cifre(j%10);
while(GPIOB->IDR & GPIO_IDR_IDR0){
if(!GPIOB->IDR & GPIO_IDR_IDR0)
break;
}
}
if(GPIOB->IDR & GPIO_IDR_IDR1){
reset();
j--;
cifre(j%10);
while(GPIOB->IDR & GPIO_IDR_IDR1){
if(!GPIOB->IDR & GPIO_IDR_IDR1)
break;
}
}
}
}
Я подозреваю, что я объявил GPIO неправильным.