说明:此源码转至欧老师所写的小蜜蜂笔记,本人对代码加了一些注解,同时做了一些小的修改。
任务要求
选用一个Zigbee节点盒(蓝色),新建IAR工程文件,实现板上LED灯的控制,考核选手Zigbee单片机基础知识的掌握,要求如下:
1、程序开始运行,LED1、LED2灯亮。
2、按键SW1单击,LED1灭、LED2亮。
3、按键SW1双击,LED1亮、LED2灭。
4、按键SW1三连击、LED1、LED2进入互相切换亮、灭状态,亮灭间隔为1秒,
5、能重复实现以上步骤。
参考源码
#include <ioCC2530.h> //引用cc2530头文件 #define LED1 (P1_0) //宏定义LED1 #define LED2 (P1_1) //宏定义LED2 #define SW1 (P1_2) //宏定义SW1 typedef unsigned char uchar; //自定义uchar数据类型 typedef unsigned int uint ; //自定义uint数据类型 uchar count_t = 0 ; //按键生命周期统计(超过0.5秒就判断) uchar k_num = 0; //按键连击统计 uchar count_s =0 ;//累计1秒统计 uchar F_LED = 0; //LED灯切换标志 /*=======普通延时函数delay()约0.54毫秒默认为16MHZ RC振荡的话=======*/ void delay(uint time) { uint i; uchar j; for (i=0; i<time; i++) { for (j=0; j<240; j++) { asm("NOP"); //asm用来在c代码中嵌入汇编语言操作 asm("NOP"); //汇编命令nop是空操作,消耗一个指令周期 asm("NOP"); } } } /*=======端口初始化函数initPort()============*/ void initPort(void) { /*========LED灯引脚初始化======*/ P1SEL &= ~0x03; //P1_0、P1_1为通用I/O端口 P1DIR |= 0x03; //P1_0、P1_1为输出端口 P1 |= 0x03; //同时点亮LED1 LED2灯 /*=====SW1引脚初始化========*/ P1SEL &= ~0x04; //P1_2引脚为通用I/O端口 P1DIR &= ~0x04; //P1_2引脚为输入端口 P1INP &= ~0x04; //P1_2引脚设为上拉或下拉 P2INP &= ~0x40; //设置端口1所有的引为上拉 } /*========定时器1初始化函数initTimer1()===========*/ void initTimer1(void) { T1CTL = 0x0e; //T1定时器采取128分频,模模式 T1CC0L = 0xd4; //采用16Mhz系统时钟定时为0.1秒,低字节 T1CC0H = 0x30; //采用16Mhz系统时钟定时为0.1秒,高字节 T1CCTL0 |= 0x04; //开启通道0的输出比较模式 T1IE = 1;// 开启T1定时器中断 EA = 1; //开启总中断 } /*======定时器1的中断服务函数service_Timer1()======*/ #pragma vector = T1_VECTOR __interrupt void server_Timer1() { T1STAT &= ~0x20; //清除定时器1的中断标志位 if(k_num !=0 && SW1 !=0) { count_t++; //计算机按键生命周期 /*====对这句话我个人理解为定时器每0.1秒产生一次中断。 这时检查SW1按键状态和统计SW1键按下的次数,如果SW1为0,说明SW1 按键正处于被按下的状态,这时不统计它的生命周期,如果生命周期达 到了0.5秒,就开始判断,换句话说,就是松开SW1键0.5秒内没有再按下 去的话,单片机就认为你不会再按下去了, 我要判断,你按了几次, 然后根据SW1按下的次数按照题的要求去处理相应的操作。====== */ } if(F_LED ==1) { count_s++; if(count_s >=10) { count_s =0; LED1 = ~LED1; LED2 = ~LED2; } } } /*===========按键扫描处理函数scanKeys()============*/ void scanKeys() { if (SW1 == 0 ) { delay(100); //去抖处理 if( SW1 ==1) { while(!SW1);//等待按键松开 count_t = 0; k_num++; /*====注意:最好在0.5秒这内执行第二次按键操作,否则就要 执行下面的判断操作了============*/ } } if(count_t > 5) //按键生命周期结束(松开按键0.5秒到了,开始判断) { switch(k_num) { case 1: //按键单击 F_LED = 0; LED1 = 0; LED2 = 1; break; case 2: //按键双击 F_LED = 0; LED1 = 1; LED2 = 0; break; case 3: //招键三击 F_LED =1; LED1 = 0; LED2 = 1; break; } k_num = 0 ;//每处理完一次按键,状态清零 count_t =0;//计时清零 } } /*========主函数========*/ void main() { initPort(); initTimer1(); while(1) { scanKeys(); } }
【赛题详解】2020年物联网山东省赛任务三题1-亮灯系统(附完整源码)
原文:https://www.cnblogs.com/xrp1974/p/12002849.html