打印
[新手园地]

傻瓜菜鸟第5帖——按键小程序

[复制链接]
3350|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 weshiluwei6 于 2011-4-25 15:33 编辑

本人是新手,只能发些比较简单的程序。高手勿拍。
此程序实现:按KEY,一次一个灯亮。2次2个等亮。3次3个灯亮。4次4个灯亮。5次一个灯,周而复始
以前玩过 51, 经常写按键程序只加个去抖延时或者有时候不加都无所谓,松手检测更是没加过;
今天编了M0的按键,开始什么都没加,可是程序问题很大,后来加了消抖,稍微好点,但是还是不稳定,最后加了松手检测才算成功。
请问:这个按键和单片机有关么?感觉差距挺大的。

 

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
uint32_t signal;
void delay_loop(void)
{
uint32_t i,j;
for(i=500;i>0;i--)
    for(j=110;j>0;j--);
   
}

/***************************************************************************:**************
** 文件名称:NUC120_HOT_UART.c
** 文件说明:NUC120助学板按键小程序
** 创建日期:2011-04-025
** 修改日期:
** 现     象:按KEY,一次一个灯亮。2次2个等亮。3次3个灯亮。4次4个灯亮。
              5次一个灯,周而复始
              (新手练习入门程序)
** 备    注:
***********************************************************:****::************************/
int main (void)
{
/* SYSCLK =>12Mhz*/
UNLOCKREG();
    SYSCLK->WRCON.XTL12M_EN = 1;
LOCKREG();
/*set GPI0 output*/
DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);
   
DrvGPIO_Open(E_GPB,15,E_IO_INPUT);            //按键设置为输入
while(1)
{
     if((DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 0))
  {
   delay_loop();
   if((DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 0))
   {
    DrvGPIO_ClrBit(E_GPA,2);
    DrvGPIO_SetBit(E_GPA,3);
    DrvGPIO_SetBit(E_GPA,4);
    DrvGPIO_SetBit(E_GPA,5);
    signal  =  1;
   }
   while(DrvGPIO_GetBit(E_GPB,15) == 0);
     }
   if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 1))
  {
    delay_loop();
    if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 1))
    {  DrvGPIO_ClrBit(E_GPA,2);
    DrvGPIO_ClrBit(E_GPA,3);
    DrvGPIO_SetBit(E_GPA,4);
    DrvGPIO_SetBit(E_GPA,5);
    signal  =  2;
    }
    while(DrvGPIO_GetBit(E_GPB,15) == 0);
  }
   if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 2))
  {
    delay_loop();
    if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 2))
    {
       DrvGPIO_ClrBit(E_GPA,2);
    DrvGPIO_ClrBit(E_GPA,3);
    DrvGPIO_ClrBit(E_GPA,4);
    DrvGPIO_SetBit(E_GPA,5);
    signal =  3;
    }
    while(DrvGPIO_GetBit(E_GPB,15) == 0);
  }
   if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 3))
  {
    delay_loop();
    if( (DrvGPIO_GetBit(E_GPB,15) == 0)  && (signal == 3))
    {
    DrvGPIO_ClrBit(E_GPA,2);
       DrvGPIO_ClrBit(E_GPA,3);
    DrvGPIO_ClrBit(E_GPA,4);
    DrvGPIO_ClrBit(E_GPA,5);
    signal =  0;
     }
    while(DrvGPIO_GetBit(E_GPB,15) == 0);
  }
}
}


相关帖子

沙发
hotpower| | 2011-4-25 17:30 | 只看该作者
好,继续努力!

使用特权

评论回复
板凳
weshiluwei6|  楼主 | 2011-4-25 20:49 | 只看该作者
2# hotpower

大叔  MCU旁边的那些孔 可以接排阵 接外接电路的吧   请问下 是按照什么顺序排列的呢

使用特权

评论回复
地板
dong_abc| | 2011-4-25 23:37 | 只看该作者
本帖最后由 dong_abc 于 2011-4-25 23:41 编辑

我也来一个
key.c 
#include "key.h"
#define key_input   DrvGPIO_GetBit(E_GPB, 14)    // 按键输入口
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
void Key_Init(void)
{
DrvGPIO_Open(E_GPB, 14, E_IO_INPUT);
}
char Key_Scan(void)  
{
static unsigned char key_state = 0, key_time = 0;
unsigned char key_press, key_return = 0;
key_press = key_input;                    // 读按键I/O电平
switch (key_state)
{
  case key_state_0:                        // 按键初始态
   if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态
   break;
  case key_state_1:                        // 按键确认态
   if (!key_press)
      {
       key_state = key_state_2;               // 按键仍按下,状态转换到计时1
        key_time = 0;                        // 清另按键时间计数器
      }
   else
     key_state = key_state_0;               // 按键已抬起,转换到按键初始态
   break;
  case key_state_2:
   if (key_press)
      {
        key_state = key_state_0;               // 按键已释放,转换到按键初始态
        key_return = 1;                       // 输出"1"
   }
   else if (++key_time >= 50)              // 按键时间计数
   {
    key_state = key_state_3;               // 按下时间>1s,状态转换到计时2
    key_time = 0;                        // 清按键计数器
    key_return = 2;                       // 输出"2"
   }
   break;
  case key_state_3:
   if (key_press)
       key_state = key_state_0;              // 按键已释放,转换到按键初始态
   else
   {
    if (++key_time >= 25)                  // 按键时间计数
    {
     key_time = 0;                       // 按下时间>0.5s,清按键计数器
     key_return = 2;                      // 输出"2"
    }
   }
   break;
}
    return key_return;
}
/*-----------------------------------------------
按键处理,调试用
------------------------------------------------*/
void Key_Proc(void)
{
  switch (Key_Scan())
  {
   case 1:
    outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 2));
    break;

   case 2:
      outpw((uint32_t)&GPIOA->DOUT, inpw((uint32_t)&GPIOA->IN) ^ (1 << 3));
    break;

   default:
    break;
  }
}


key.h
#include "main.h"
#ifndef __NUC1xxKey_H__
#define __NUC1xxKey_H__
void Key_Init(void);
char Key_Scan(void);
void Key_Proc(void);
#endif //__NUC1xxKey_H__

使用特权

评论回复
5
dong_abc| | 2011-4-25 23:55 | 只看该作者
2# hotpower  

大叔  MCU旁边的那些孔 可以接排阵 接外接电路的吧   请问下 是按照什么顺序排列的呢
weshiluwei6 发表于 2011-4-25 20:49

看一下走线就是啦~~~

使用特权

评论回复
6
Swallow_0322| | 2011-4-26 08:50 | 只看该作者
顶下,好久没好好学习了...

使用特权

评论回复
7
hotpower| | 2011-4-26 17:06 | 只看该作者
看电路图

使用特权

评论回复
8
weshiluwei6|  楼主 | 2011-4-27 19:02 | 只看该作者
5# dong_abc

谢谢 您编的真不错 学习了

使用特权

评论回复
9
weshiluwei6|  楼主 | 2011-4-27 19:02 | 只看该作者
7# hotpower
OK 谢谢大叔

使用特权

评论回复
10
baisen| | 2011-5-8 15:29 | 只看该作者
请问stdio.h这个头文件能在哪里找到?我安装的KEIL里面没有,求解惑

使用特权

评论回复
11
weshiluwei6|  楼主 | 2011-5-8 18:43 | 只看该作者
10# baisen

装了就有啊 怎么会没有呢

使用特权

评论回复
12
lixupengarm| | 2011-5-23 17:49 | 只看该作者
mark!!

使用特权

评论回复
13
uniquehope| | 2011-7-1 16:48 | 只看该作者
看官方资料中,求学习~~:hug:

使用特权

评论回复
14
moreand| | 2011-7-9 10:43 | 只看该作者
不错,学习了 正在研究按键

使用特权

评论回复
15
xd54622| | 2011-7-16 20:18 | 只看该作者
同楼上,嘿嘿

使用特权

评论回复
16
uniquehope| | 2011-8-4 20:11 | 只看该作者
:hug:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:250水王,种菜浇水,要输就输给理想,要败就败给高手。不可浮躁

7

主题

1124

帖子

1

粉丝