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
进来学习一下
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文件呢
有无报错提示,一般这种就是连接相关出问题了