stm32编程问题,状态机,求大神指导,初学者,主要是switch语句后面的变量取值不明白

状态机的程序中,如果用到switch语句,那后面的变量没有赋初值,我们应该转向哪一个case语句啊,程序见下方,由于程序太长,我就把大概意思写上了。。。。。
typedef enum
{
KeyScanState_0 = 0x00,
KeyScanState_1 = 0x01,
KeyScanState_2 = 0x02,
}KeyScanState_Typedef;
int main(void)
{
vu16 KeyPortStatus = 0;
/* 定义按键扫描状态枚举变量 */
KeyScanState_Typedef KeyScanState;

while(1)
{
/* 查询20ms到? */
if(SysTick_GetFlagStatus(SysTick_FLAG_COUNT) == SET)
{
/* 读取IO电平 */
KeyPortStatus = GPIO_ReadInputData(KEYPORT) & 0x000f;
/* 进入状态机流程 */
switch(KeyScanState) ·········就是这里不明白啊啊啊 啊 啊
{
case KeyScanState_0:
case KeyScanState_1:
case KeyScanState_2:
{

你要知道哪个数据先要知道:KeyPortStatus = GPIO_ReadInputData(KEYPORT) & 0x000f;这行

我不知道你的定义我就暂时以PB口为你读取KEY的口吧,看这状态肯定是上拉然后低4位是按键,所以将口除低4位外全部清零(&0x000f)就是保留低4位二进制就是1111。
然后switch(KeyScanState) 这其实就是将第4位判断哪个具体位为0,说明哪个按下。

然后在把2进制的值用10进制表示当然你这个是已经被重新定义过的了:
KeyScanState_0,1,2.。。。这些,所以你要先看看他是定义的几才行。没有按键为0时应该是0x0f。。以此类推
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-13
你说的地方就是读到按键后进行按键操作啊.

if(SysTick_GetFlagStatus(SysTick_FLAG_COUNT) == SET)看是不是到了20MS.这个是去抖动的.

KeyPortStatus = GPIO_ReadInputData(KEYPORT) & 0x000f;这个是从GPIO里读按键值的,估计是看是否有按键按下吧.或者是读ADC值转换成健值.KEYPORT未见定义,不知道你的代码能否编译过.
switch(KeyScanState) 这里进行按键选择啊.在这之前应该会有KeyScanState的符值.你的代码一段一段的,要么是不全,要么是错的.

逻辑非常简单.刚学C两个月就能看懂.不打击你.追问

大哥,要是有KeyScanState的符值,你认为我还会出来问吗,我不告诉你这是大致程序了吗,全打下来写不下来,你看清了再来打击我吧

第2个回答  推荐于2016-06-06
完整的流程:

http://www.amobbs.com/thread-5544745-1-1.html里面是你程序的出处!
int main(void)
{
1.初始化各个模块
while(1)
{
2.扫描按键;
3.给扫描到的按键赋值(包括长按键、短按键、KEY0、KEY1等)即状态;
4.根据不同的键值进行不同的业务(switch case);

}
}

很完美的状态机,我也是初学,特来膜拜的。本回答被提问者采纳
相似回答