打印
[菜农助学交流]

第五批小彬的M0学习之路5---按键控制LED灯

[复制链接]
2431|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjsyjbb|  楼主 | 2011-12-16 22:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zjsyjbb 于 2011-12-19 22:07 编辑

在GPIO流水灯的基础上,今天又学习了下如何操作M0的按键,并利用按键对LED灯进行控制.总体上来说跟操作LED的差不多,主要是对端口要进行设置,如何处理按键.在这次学习中充分利用到了51的支持点,比如说如何处理按键的去抖,按键标志位的设定,从这里看出,51的知识点是可以通用的.区别在于操作上先进了,哈哈.
下面贴出我的主程序.
 
/*------------------------------------------------------------------------- */
/* 实现目标:使用按键对助学班上的四个LED灯进行点亮,熄灭操作     */
/* 作者:小彬                */
/*  时间:2011年12月16日              */

#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
/*延时子程序----------------------------------------------------------------*/
/*延时时间:k mS(在12M的晶振频率下)--------------------------------------------*/
void delay_ms(uint32_t k)
{
    uint32_t i,j;
for(i=k;i>0;i--)
    for(j=2395;j>0;j--);
}
/*---------------------------------------------------------------------------*/
/* 主程序                                                                    */
/*---------------------------------------------------------------------------*/   
int main (void)
{
uint8_t flag = 0;    //标志位的设置
uint8_t count = 0;  //计数标志的设置
/*系统时钟设置*/
UNLOCKREG();
    SYSCLK->WRCON.XTL12M_EN = 1;
delay_ms(100);   //此处要注意,延时一段时间等待外部晶振就绪,上次没注意.
LOCKREG();

/*对M0端口的设置*/
DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);  //四个LED设置为输出
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,14,E_IO_INPUT );     //按键端口设置为输入
    DrvGPIO_Open(E_GPB,15,E_IO_INPUT );

while(1)
{
   if (DrvGPIO_GetBit(E_GPB,14) == 0)     // 当检测到有按键按下时,即KEY2按下,可对照原理图
   delay_ms(50);         //类似于51的按键操作,软件延时实现去抖功能
   if (DrvGPIO_GetBit(E_GPB,14) == 0)   //确认按键KEY2确实被按下了
    flag = 1;         //标志位设定为1,进行后续操作
   if(flag)
   {
   if (DrvGPIO_GetBit(E_GPB,14) == 1)  //等待按键释放
   {
    flag = 0;        //标志位恢复
    count++;        //计数值增加
   }
   }
   if(count>=9) count =1;     //计数量超出则恢复
   switch(count)
   {
    case 1: DrvGPIO_ClrBit(E_GPA,2); break;  //操作对应的四个LED
    case 2: DrvGPIO_SetBit(E_GPA,2); break;
    case 3: DrvGPIO_ClrBit(E_GPA,3); break;
    case 4: DrvGPIO_SetBit(E_GPA,3); break;
    case 5: DrvGPIO_ClrBit(E_GPA,4); break;
  case 6: DrvGPIO_SetBit(E_GPA,4); break;
  case 7: DrvGPIO_ClrBit(E_GPA,5); break;
  case 8: DrvGPIO_SetBit(E_GPA,5); break;
     default:break;
   }
}
}           //注意多预留几行空白行,可消除警告

个人小结:这次学习中,有几个小问题要注意.
1.时钟配置时要注意延时一段时间等待时钟就绪.
2.最后程序写完时要预留出1段空白行,否则会有警告,这个比较新鲜,编写51时没有这样的警告.
最后附上程序压缩包

按键控制LED灯.rar (719.06 KB)

相关帖子

沙发
zjsyjbb|  楼主 | 2011-12-16 22:03 | 只看该作者
又是一天过去了,明天考英语六级那..呼呼..兄弟们要加油.:)

使用特权

评论回复
板凳
consif| | 2011-12-16 22:50 | 只看该作者
呵呵,跑得真快,不过最后为什么要留几行空白?

使用特权

评论回复
地板
weshiluwei6| | 2011-12-18 14:04 | 只看该作者
在来学习学习啊

使用特权

评论回复
5
weshiluwei6| | 2011-12-18 14:05 | 只看该作者
只要一行把  为什么要几行啊

使用特权

评论回复
6
zjsyjbb|  楼主 | 2011-12-19 22:07 | 只看该作者
5# weshiluwei6
恩.确实只要一行,俺改正.不知道帖子能不能编辑下.

使用特权

评论回复
7
zjsyjbb|  楼主 | 2011-12-19 22:08 | 只看该作者
3# consif
只要一段空白行就够了,我改过来了,不好意思啊..

使用特权

评论回复
8
lixupengarm| | 2011-12-30 23:40 | 只看该作者
mark

使用特权

评论回复
9
athud| | 2011-12-31 08:40 | 只看该作者
不错.支持一下.

使用特权

评论回复
10
zcj62220824| | 2011-12-31 11:17 | 只看该作者
不错

使用特权

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

本版积分规则

个人签名:一步一个脚印,踏踏实实练好技术..

80

主题

646

帖子

2

粉丝