我正在使用 STM32F103C4、2 个按钮和一个 7seg 显示器制作一个简单的向上/向下计数器,代码是用 Keil uVision 编写的,从中将 hex 文件加载到 Proteus 中。Counter Up 部分完美运行,但 Counter Down 部分只是没有注册任何输入。我尝试切换引脚并得出结论 B0 引脚正在工作,但由于某种原因 B1 引脚不工作。我已经到处搜索了,问了很多,但我找不到解决方案。这是否与特殊端口 B 的重置值有关?
下面是我的代码和 proteus 方案的 ss。
#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 错误。