主函数的语句直接跳过,麻烦帮忙看下程序是哪里出错了
时间:10-02
整理:3721RD
点击:
#include "stm32f10x_map.h"
void Key_Init(void);
void Key_Proc(void);
char flag = 1;
int main(void)
{
Key_Init();
while(1)
{
Key_Proc();
if(flag) GPIOC->ODR &= 0xffff;
if(!flag) GPIOC->ODR &= 0x0000;
}
}
void Key_Init(void)
{
RCC->APB2ENR |= 8;
RCC->APB2ENR |= 0x0010;
GPIOC->CRH &= 0xffffff00;
GPIOC->CRH |= 0x00000033;
GPIOC->CRL &= 0x00ffffff;
GPIOC->CRL |= 0x33000000;
GPIOC->ODR = 0xffff;
}
void Key_Proc(void)
{
short key = GPIOB->IDR;
if(key & 0x8000)
{
flag = !flag;
}
}
按键只是上电第一次管用,再按就不管用了,调试的时候主函数里的两个if语句貌似直接就跳过去了。
谁知道这是哪里的问题
void Key_Init(void);
void Key_Proc(void);
char flag = 1;
int main(void)
{
Key_Init();
while(1)
{
Key_Proc();
if(flag) GPIOC->ODR &= 0xffff;
if(!flag) GPIOC->ODR &= 0x0000;
}
}
void Key_Init(void)
{
RCC->APB2ENR |= 8;
RCC->APB2ENR |= 0x0010;
GPIOC->CRH &= 0xffffff00;
GPIOC->CRH |= 0x00000033;
GPIOC->CRL &= 0x00ffffff;
GPIOC->CRL |= 0x33000000;
GPIOC->ODR = 0xffff;
}
void Key_Proc(void)
{
short key = GPIOB->IDR;
if(key & 0x8000)
{
flag = !flag;
}
}
按键只是上电第一次管用,再按就不管用了,调试的时候主函数里的两个if语句貌似直接就跳过去了。
谁知道这是哪里的问题
STM32不用库函数?你将flag设置为char类型是不对的,程序运行后,flag和!flag都是非零。将flag设置为bit看看。
if(flag) GPIOC->ODR &= 0xffff;
if(!flag) GPIOC->ODR &= 0x0000;
改成
if(flag)
GPIOC->ODR &= 0xffff;
if(!flag)
GPIOC->ODR &= 0x0000;
主函数最好加延时。否则IO的变化肉眼是看不出来的
你这个程序问题真多:
没有等待按键释放的程序语句,所以如果你的其他地方编写正确,也会以非常快的频率切换输出,因为一旦你的按键按下,Key_Proc都会一直不停的将flag取反;
你描述的问题是因为
if(flag) GPIOC->ODR &= 0xffff;
if(!flag) GPIOC->ODR &= 0x0000;
这两句产生,第一个if语句没有任何用处,如果你使用的编译器优化好一些的话,甚至这一句都不会产生代码,因为任何32位数与0xFFFF做与运算还是得任何32位数;
你在Key_Init中将输出初始化为0xFFFF,所以,一旦有按键按下,就仅有第二个if语句将输出设成0;
所以你的感觉就是只有第一次按键有效,使得输出变低;
字符类型可以作为逻辑变量使用是对的,其逻辑值取决于该变量是否为0;
if语句可以将逻辑判断和执行语句写在一行上,但是如果将判断和执行分行写,读起来会更明了一些;
多谢指点。
多谢指点。
多谢指点。