物联网通信技术实验报告2:按键中断控制LED闪烁
实验2 按键中断控制LED闪烁
实验目的
1. 掌握CC2530 的中断设置方法;
2. 掌握中断函数程序的编写方法。
实验设备
- CC2530实验节点
- SmartRF04EB仿真器
- PC机
实验原理
- ZigBee节点的上的KEY按键位于节点右下方,如图所示。
KEY接CC2530的P0_7引脚。
- 端口0的中断处理函数格式如下:
#pragma vector=P0INT_VECTOR
__interrupt void P0_ISR(void){
…
…
…
}
实验内容
- 编程实现用按键KEY控制LED灯闪烁。
#include "ioCC2530.h"
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P1_4
#define LED4 P0_1
#define KEY P0_7
//延时子函数
void Delay(uint n)
{
// uint tt;
for(int i=n;i>0;i--)
for(int i=n;i>0;i--);
}
void led_init(void)
{
//设置成通用IO口
P1SEL &=~0X13;
//P1SEL &=~0X02;
//设置P1_0,P1_1,P1_4输出
P1DIR |=0X13;
// P0DIR |=0X02;
//关闭LED1
LED1=1;
//关闭LED2
LED2=1;
//关闭LED3
LED3=1;
//关闭LED4
// LED4=0;
}
void key_init(void)
{
//设置成通用IO口
P0SEL &=~0X80;
//设置P0_7为输入模式
P0DIR &=~0X80;
//P0_7上拉模式
P0INP &=~0X80;
//P0_7,下降沿触发
// PICTL |=0x01;
}
void key_interrupt_init(void)
{
//开总中断
EA=1;
//P0中断标志清零
P0IFG &=0x00;
//端口0中断使能
IEN1 |=0x20;
//开端口0的第8位的(P0_7)中断使能
P0IEN |=0X80;
}
//key不用中断控制LED
uchar key_flag=0;
void key_proc(void)
{
if(KEY == 0 && key_flag == 0)
{
LED1 =0;
key_flag=1;
}
else if(KEY == 0 && key_flag==1)
{
LED1 =0;
key_flag=0;
}
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG>0)
{
LED1 = !LED1;
LED2 = !LED2;
P0IFG = 0;
P0IF = 0;
}
}
int main(void)
{
//LED初始化
led_init();
//IO及外部中断初始化
key_init();
key_interrupt_init();
//等待中断
Delay(100);
while(1)
{
//key_proc();
}
}
上述代码实现了两种方式按键控制LED灯亮灭亮灭的功能,第一种方式是中断方式,第二种就是相当于轮询的方式,在while循环中不断地看按键KEY是否按下,如果按下则执行相应的功能,否则跳过.
运行代码,并且烧录到板子中,现象如图所示
实验结果以及分析:
1.首先通过原理图,判断按键是哪个引脚,所以是P0_7
- 1然后开始编程,查看编程手册
- 2有以下步骤
- 首先将LED的引脚以及KEY的引脚设置成通用的I/O口
- 然后将LED的引脚设置成输出模式,将KEY引脚设置成输入模式,同时将KEY这个模式设置成上拉模式(输入模式的两种选择,作用就是当引脚时浮空的状态,该引脚默认的状态,如果上拉就是高电平,如果下拉就是低电平)
- LED:初始化LED灯为全灭,KEY:1.将P0的中断标志位清零,2.开总中断,3.开端口0的中断,4.开端口0的第八位(P0_7)的中断
- 编写中断服务函数如果按键按下,那么此时的端口零的中断状态标志位就会置1,在中断函数中判断,该标志位是否为1,或者>0,然后编写功能函
- 关于以上步骤可参考书面的代码,皆是模块化编程
实验心得:
本次实验时使用按键中断控制LED闪烁,主要学习到的模块就是定时中断,通过此次实验队寄存器操作变得更加熟练,理解也更加深刻。
作者:羣℡