单片机STM8S103F3。 子程序在main 里不运行。 编译可以通过

//三个子程序在main 里同时调用,其中一个不运行。单独调用这个子程序功能就可以正常运行。

void JIDIQI_KEY(void) //有问题程序

//完整程序
//实现的功能。1.电机正反转2.继电器通过按键吸合一定时间后断开。

#include "stm8s.h"
#define     JGQ_ON()       GPIO_WriteLow(GPIOD , GPIO_PIN_3)
#define     JGQ_OFF()      GPIO_WriteHigh(GPIOD , GPIO_PIN_3)
void KEY1_Init()
 {
  GPIO_Init(GPIOD , GPIO_PIN_2 , GPIO_MODE_IN_PU_NO_IT);       //为带上拉输入
  GPIO_Init(GPIOC , GPIO_PIN_7 , GPIO_MODE_IN_PU_NO_IT);       //为带上拉输入
  GPIO_Init(GPIOC , GPIO_PIN_6 , GPIO_MODE_IN_PU_NO_IT);       //为带上拉输入
 }
void InitLED()
 {
  GPIO_Init(GPIOD , GPIO_PIN_3 , GPIO_MODE_OUT_PP_LOW_FAST);  //高速(10MHz)推挽低电平输出
  GPIO_Init(GPIOC , GPIO_PIN_5 , GPIO_MODE_OUT_PP_LOW_FAST);  //高速(10MHz)推挽低电平输出
  GPIO_Init(GPIOC , GPIO_PIN_4 , GPIO_MODE_OUT_PP_LOW_FAST);  //高速(10MHz)推挽低电平输出
 }
/*********************************************************************************
*   函 数 名: Tim4_Init
*   功能说明: 初始化通用定时器4
*   形    参:无
*   返 回 值: 无
*********************************************************************************/
void TIM4_Init()
{
  TIM4_TimeBaseInit(TIM4_PRESCALER_128 ,  //计数器时钟=主时钟16MHz / 128 = 125KHz
                    125    );            //设定定时器产生1毫秒重装载时的计数值,255是最大值
  TIM4_ARRPreloadConfig(ENABLE);        //允许自动仲裁
}
/*******************************************************************************
**函数名称:void TIM4Delayms(unsigned int ms)
**功能描述:定时器4参进行精确延时,最小为1毫秒,最大65535
**入口参数:unsigned int ms     1=< ms <= 65535 
**输出:无
*******************************************************************************/
void TIM4Delayms(unsigned int ms)
{     
  TIM4_Cmd(ENABLE);        //启动定时器4开始计数
    while(ms--)
    {
      while( TIM4_GetFlagStatus(TIM4_FLAG_UPDATE) == RESET); //等待计数是否达到1毫秒
      TIM4_ClearFlag(TIM4_FLAG_UPDATE);  //计数完成1毫秒,清除相应的标志
    }
    TIM4_Cmd(DISABLE);       //延时全部结束,关闭定时器2
}
void Delay(u16 ms)
{
  u16 x ,y;  
  for(x = ms ; x > 0; x--)
    for(y = 16000 ; y > 0; y--);
}
void JIDIQI_KEY(void)
{
  if(GPIO_ReadInputPin(GPIOD , GPIO_PIN_2) == RESET)
     {
       TIM4Delayms(5);//延时1秒  //延时消抖
       while(GPIO_ReadInputPin(GPIOD , GPIO_PIN_2) == RESET);  //等待松手
       TIM4Delayms(5);//延时1秒  //再次延时消抖
       JGQ_ON(); //继电器动作
       TIM4Delayms(500);//延时1秒  //继电器吸合精确延时
       JGQ_OFF();//继电器动作      
     }
}
void DIANJI1_KEY1(void)
{
  if(GPIO_ReadInputPin(GPIOC , GPIO_PIN_6) == RESET)
     {
       Delay(5);   //延时消抖
       while(GPIO_ReadInputPin(GPIOC , GPIO_PIN_6) == RESET);  //等待松手
       Delay(5);   //再次延时消抖
       GPIO_WriteLow(GPIOC, GPIO_PIN_5); //低电平正转
       GPIO_WriteHigh(GPIOC, GPIO_PIN_4);//高电平正转
      }   
 }
void DIANJI2_KEY2(void)
{  
  if(GPIO_ReadInputPin(GPIOC , GPIO_PIN_7) == RESET)
     {
        Delay(5);   //延时消抖
        while(GPIO_ReadInputPin(GPIOC , GPIO_PIN_7) == RESET);  //等待松手
        Delay(5);   //再次延时消抖
        GPIO_WriteHigh(GPIOC, GPIO_PIN_5); //高电平反转
        GPIO_WriteLow(GPIOC, GPIO_PIN_4);  //低电平反转      
      }
}
/*********************************************************************************************************
*   函 数 名: main
*   功能说明: c程序入口
*   形    参:无
*   返 回 值: 错误代码(无需处理)
**********************************************************************************************************/
void main()
{
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //配置内部高速振荡器(HSI)的分频器--1分频
    KEY1_Init();    //调用初始化按键输入引脚
    InitLED();    //调用初始化输出引脚
    TIM4_Init();//调用TIM4初始化程序
  while(1)
  {             
    JIDIQI_KEY();      //调用继电器
    DIANJI1_KEY1();  //调用电机正传
    DIANJI2_KEY2();//调用电机反传 
   }          
}
/*断言函数:它的作用是在编程的过程中为程序提供参数检查*/
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file,u32 line)
{
  while(1)
  {
  }
}
#endif

img


img

进来学习一下

void DIANJI1_KEY1(void)
{
** if(GPIO_ReadInputPin(GPIOC , GPIO_PIN_6) == RESET)**
{
Delay(5); //延时消抖
while(GPIO_ReadInputPin(GPIOC , GPIO_PIN_6) == RESET); //等待松手
Delay(5); //再次延时消抖
GPIO_WriteLow(GPIOC, GPIO_PIN_5); //低电平正转
GPIO_WriteHigh(GPIOC, GPIO_PIN_4);//高电平正转
}
}
你这的等待松手错了吧?和上面的判断一样的呀!你这个跟本不会等待直接就会执行后面的了

启动文件.s文件呢

有无报错提示,一般这种就是连接相关出问题了