stm32编程问题,状态机,求大神指导,初学者,主要是switch语句后面的变量取值不明白
状态机的程序中,如果用到switch语句,那后面的变量没有赋初值,我们应该转向哪一个case语句啊,程序见下方,由于程序太长,我就把大概意思写上了。。。。。typedef...
状态机的程序中,如果用到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:
{ 展开
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:
{ 展开
3个回答
展开全部
你要知道哪个数据先要知道:KeyPortStatus = GPIO_ReadInputData(KEYPORT) & 0x000f;这行
我不知道你的定义我就暂时以PB口为你读取KEY的口吧,看这状态肯定是上拉然后低4位是按键,所以将口除低4位外全部清零(&0x000f)就是保留低4位二进制就是1111。
然后switch(KeyScanState) 这其实就是将第4位判断哪个具体位为0,说明哪个按下。
然后在把2进制的值用10进制表示当然你这个是已经被重新定义过的了:
KeyScanState_0,1,2.。。。这些,所以你要先看看他是定义的几才行。没有按键为0时应该是0x0f。。以此类推
我不知道你的定义我就暂时以PB口为你读取KEY的口吧,看这状态肯定是上拉然后低4位是按键,所以将口除低4位外全部清零(&0x000f)就是保留低4位二进制就是1111。
然后switch(KeyScanState) 这其实就是将第4位判断哪个具体位为0,说明哪个按下。
然后在把2进制的值用10进制表示当然你这个是已经被重新定义过的了:
KeyScanState_0,1,2.。。。这些,所以你要先看看他是定义的几才行。没有按键为0时应该是0x0f。。以此类推
展开全部
你说的地方就是读到按键后进行按键操作啊.
if(SysTick_GetFlagStatus(SysTick_FLAG_COUNT) == SET)看是不是到了20MS.这个是去抖动的.
KeyPortStatus = GPIO_ReadInputData(KEYPORT) & 0x000f;这个是从GPIO里读按键值的,估计是看是否有按键按下吧.或者是读ADC值转换成健值.KEYPORT未见定义,不知道你的代码能否编译过.
switch(KeyScanState) 这里进行按键选择啊.在这之前应该会有KeyScanState的符值.你的代码一段一段的,要么是不全,要么是错的.
逻辑非常简单.刚学C两个月就能看懂.不打击你.
if(SysTick_GetFlagStatus(SysTick_FLAG_COUNT) == SET)看是不是到了20MS.这个是去抖动的.
KeyPortStatus = GPIO_ReadInputData(KEYPORT) & 0x000f;这个是从GPIO里读按键值的,估计是看是否有按键按下吧.或者是读ADC值转换成健值.KEYPORT未见定义,不知道你的代码能否编译过.
switch(KeyScanState) 这里进行按键选择啊.在这之前应该会有KeyScanState的符值.你的代码一段一段的,要么是不全,要么是错的.
逻辑非常简单.刚学C两个月就能看懂.不打击你.
追问
大哥,要是有KeyScanState的符值,你认为我还会出来问吗,我不告诉你这是大致程序了吗,全打下来写不下来,你看清了再来打击我吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
完整的流程:
http://www.amobbs.com/thread-5544745-1-1.html里面是你程序的出处!
int main(void)
{
1.初始化各个模块
while(1)
{
2.扫描按键;
3.给扫描到的按键赋值(包括长按键、短按键、KEY0、KEY1等)即状态;
4.根据不同的键值进行不同的业务(switch case);
}
}
很完美的状态机,我也是初学,特来膜拜的。
http://www.amobbs.com/thread-5544745-1-1.html里面是你程序的出处!
int main(void)
{
1.初始化各个模块
while(1)
{
2.扫描按键;
3.给扫描到的按键赋值(包括长按键、短按键、KEY0、KEY1等)即状态;
4.根据不同的键值进行不同的业务(switch case);
}
}
很完美的状态机,我也是初学,特来膜拜的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询