m0_71661142 2024-10-16 23:14 采纳率: 40%
浏览 8
已结题

stm32锁存器控制数码管,按键无响应

用的keil5编程,protues仿真
不清楚是代码还是仿真的问题,设置PA4读取按键输入,检测到按键按下控制PB0输出低电平使锁存器锁存,现在在仿真里按下按键后无反应

img

#include <stm32f10x_conf.h>

const uint8 seg_code[]={0xf9,0xa4,0xb0,0x99,0x88,0x83,0xc6,0xa1};
#define  KEY    PAin(4)
#define brit PBout(0)
#define KEY1_PRESS         1
void smg(void){
    GPIO_InitTypeDef GPIOC_is;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    GPIOC_is.GPIO_Pin=GPIO_Pin_All;
    GPIOC_is.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIOC_is.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOC,&GPIOC_is);
}
void scq(void){
    GPIO_InitTypeDef GPIOB_is;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIOB_is.GPIO_Pin=GPIO_Pin_0;
    GPIOB_is.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIOB_is.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIOB_is);
}
void key(void){
    GPIO_InitTypeDef GPIOA_is;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIOA_is.GPIO_Pin=GPIO_Pin_4;
    GPIOA_is.GPIO_Mode=GPIO_Mode_IPU;
    GPIOA_is.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIOA_is);
}
void GPIOSetValue(GPIO_TypeDef* GPIOx,uint16_t bitPosi, uint8_t bitVal)   
{
    if(bitVal)
    {
        GPIO_SetBits( GPIOx,  bitPosi);
    }
    else
    {
        GPIO_ResetBits(GPIOx, bitPosi);
    }
}    
void GPIOSetMutiValue(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_Position ,uint16_t PortVal)
{
    GPIO_SetBits(GPIOx, GPIO_Pin_Position & PortVal);
    GPIO_ResetBits(GPIOx, GPIO_Pin_Position &(~PortVal));     
}
void ys(uint32_t t)
{
  uint8 i;
  while (t--)
    {
        for (i=0; i<200; i++) ;
    }

}
uint8 Key_Scan(uint8 mode){
    static u8 button;
    if(mode==1){
        button=1;
    }
    if(button==1&&KEY==0){
        ys(10);
        if(KEY==0){
        return KEY1_PRESS;}
    }else{
        return 0;
    }
}
void yunxing(void){
    int i;u8 bn=0;
    for(i=0;i<8;i++){
                GPIOSetMutiValue(GPIOC,0xff,seg_code[i]);
                ys(2500);
            }
    bn=Key_Scan(1);
    if(bn!=0){
        brit=!brit;
    }else{
        bn=0;
        brit=!brit;
    }
}
int main(void){
    key();
    smg();
    scq();
    //EXTIX_Init();
    while(1){
            
            yunxing();

    }
}
如果代码有误希望能具体指出,顺求如何设置正常的仿真按键
按键响应的问题解决了,是protues的bug,修好了
现在就是代码还不能如预期工作,烦请帮忙指正 修改
  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-16 23:15
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的代码和电路图来看,有几个可能的问题导致按键无响应。以下是一些建议和解决方案:

    1. 配置按键引脚为输入: 在key()函数中,你配置了PA4为输入带内部上拉(GPIO_Mode_IPU)。这是正确的做法。但是为了确保按键读取正确,还需要配置该引脚为中断模式(如果需要的话),并在中断服务程序中处理按键事件。
    2. 消抖问题: 在Key_Scan()函数中,你使用了简单的延时消抖方法。这种方法在某些情况下可能工作,但并非最佳实践。更好的方法是使用硬件消抖或软件中断结合定时器进行消抖。
    3. 仿真问题: 在仿真环境中,按键的模拟可能不太直观。你可能需要在仿真软件的某个地方设置虚拟按键的输入,以模拟真实环境中的按键按下和释放。不同的仿真软件有不同的方法来模拟这些输入,你可能需要查阅你使用的仿真软件的文档来了解如何设置虚拟按键输入。
    4. 代码逻辑问题: 在yunxing()函数中,你首先执行了一个循环来点亮数码管的各个段,然后检查按键是否被按下。如果按键被按下,则切换锁存器的输出状态。但在你当前的代码中,这个逻辑会导致一旦按下按键,循环就不再继续执行(因为函数在按下按键后直接退出)。你可能需要在按键扫描和数码管显示之间添加一些逻辑处理。
    5. RCC时钟配置问题: 确保你的RCC时钟配置正确,以便为GPIO和相关的外设提供正确的时钟源。这是STM32开发中常见的问题之一。
    6. 检查锁存器的驱动能力: 确保锁存器(如74LS373)能够正确驱动数码管和其他外设。此外,还需要确保所有连接正确并且供电电压适当。

    为了解决按键无响应的问题,建议你首先检查仿真软件的设置来确保虚拟按键输入能够正确模拟真实按键。此外,考虑使用调试工具来逐步调试你的代码,查看变量的值和行为是否符合预期。希望这些建议能帮助你解决问题!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月25日
  • 已采纳回答 10月17日
  • 修改了问题 10月17日
  • 创建了问题 10月16日