折腾了这么久,感觉对我来说真的是一步一个坑,可能和我也不是专业做单片机开发有关,以前接触单片机真的很少,只用过keil5开发STC15的程序,说实话真相把它扔零件箱里吃灰了。之前灯能亮起来了,这次来做个按键采集吧。记录紧接上文,来了。
7、采集个按键
 板载2个按键,BOOTMODE和REST,BOOTMODE竟然就是PA0,此处浪费3小时。翻了好多文档,都没有说明BOOTMODE按键就是PA0,我也真是服了。差点我就以为BOOTMODE不能当IO来用,但是文档上又写的IO,就是不写IO几,也许厂家的工程师认为我这种小白不太适合做单片机的开发啊,哈哈。
代码很简单,tls_gpio_read就行了,也是SDK里面找。
u8 k;
......
k=tls_gpio_read(WM_IO_PA_00);
 printf("\n input=%d \n",k);
 delay(500000);
说实话,这个SDK真的帮开发者做了很多工作,各种IO的定义都一个函数实现,也不用看寄存器手册了,就是封装的命名规则还得适应一段时间,另外,这种封装的SDK就算完全掌握了也就是针对这一类的单片机,换个其它厂商的单片机,还得重新学习了。
做完按键采集,又仔细对比了W800和W801,毕竟800只有801的1/4大小,IO也少,但是价格却一样,咨询了厂家就是10k的量,这两个价格也是一样的,我也是服了。

既然能按键了,那么就来个中断吧,也不能在循环里一直判断按键啊,而且这样子反应和延迟都又问题,只是能识别能按了而已。
那就来中断了,还是那句话,得看SDK,和STC的开发完全不一样啦,又是几个小时的文档阅读,得出以下几行关键点,直接把代码和关键点全上了,写的麻烦,累了,要睡觉。
 8、按键产生个中断
 关键点
 static void demo_gpio_isr_callback(void *context)//中断调用函数
 {
     u16 ret;
     ret = tls_get_gpio_irq_status(WM_IO_PA_00);//取得状态,为什么返回是1才能执行呢?    
     if (ret){
 xxxxxxxxxxxx干点啥?xxxxxxxxxxx
         tls_clr_gpio_irq_status(WM_IO_PA_00);        //清除中断
     }
 }
void UserMain(void)
 {
      tls_gpio_cfg(WM_IO_PA_00, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);//配置管脚
     tls_gpio_isr_register(WM_IO_PA_00, demo_gpio_isr_callback, NULL);//注册中断
     tls_gpio_irq_enable(WM_IO_PA_00, WM_GPIO_IRQ_TRIG_RISING_EDGE);//启用的意思吗?
 }
全部代码:
#include "wm_include.h"
 int t;
static void demo_gpio_isr_callback(void *context)//中断调用函数
 {
     u16 ret;
    ret = tls_get_gpio_irq_status(WM_IO_PA_00);//取得状态,为什么返回是1才能执行呢?    
     if (ret){
         t=t*0.8;
         if (t<5000){t=3000000;};
         printf("\n It's a break %d delay time change to=%d \n",ret,t);
         tls_clr_gpio_irq_status(WM_IO_PA_00);        //清除中断
     }
 }
void UserMain(void)
 {
 //#if DEMO_CONSOLE
 //    CreateDemoTask();
 //#endif
 //用户自己的task
    printf("\n user task \n");    
     
     u8 i,pp,k;    
     i=0,t=3000000;pp=0x01;
     
     //初始IO
     tls_gpio_cfg(WM_IO_PB_00,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
     tls_gpio_cfg(WM_IO_PB_01,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
     tls_gpio_cfg(WM_IO_PB_02,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
    tls_gpio_cfg(WM_IO_PA_00, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);//配置管脚
     tls_gpio_isr_register(WM_IO_PA_00, demo_gpio_isr_callback, NULL);//注册中断
     tls_gpio_irq_enable(WM_IO_PA_00, WM_GPIO_IRQ_TRIG_RISING_EDGE);//启用的意思吗?
     
     while (1)
     {
         i++;
         printf("\n TEST%d \n",i);//可以输出到控制台烧录工具就能看到,很好很开心
         
         if (pp>0x04){pp=0x01;}
         tls_gpio_write(WM_IO_PB_00,pp&0x01^pp);//写入IO
         tls_gpio_write(WM_IO_PB_01,pp&0x02^pp);
         tls_gpio_write(WM_IO_PB_02,pp&0x04^pp);
         
         printf("\n delay time=%d \n",t);
         if (i>32760){i=0;};
         pp=pp<<1;
         delay(t);             //这个秒怎么算的?还没搞明白
     }
 }










