目录
1.前期预备知识 1.1 新大陆Zigbee模块按键电路图1.2 CC2530相关寄存器1.3 CC2530中断走向图1.4 使用C语言为51单片机编写中断程序1.5 *函数指针2. 程序代码THE END由上图可知,Zigbee模块的SW1按钮连接在P1.2端口上,当SW1导通,P1.2电平从3.3V被拉低接地。所以P1.2输入模式为下拉输入.
如上图所示,如果P1端口发生中断,需要传入51内核中,流程如下图所示.
所以,我们对中断进行初始化的一个流程也和上图一样,一层一层的将中断使能开关打开。
使用C语言为51单片机编写中断程序,有一个特殊的函数声明形式。如以下代码所示:
#pragma vector = 中断向量地址 __interrupt void P01_ISR(void) { /*Do something*/ }其中中断向量地址,可以在ioCC2530.h头文件中找到,可以直接使用宏定义字符替换。
/* -------------------------------------------------------------------------- * Interrupt Vectors * -------------------------------------------------------------------------- */ #define RFERR_VECTOR VECT( 0, 0x03 ) /* RF TX FIFO下溢和RX FIFO溢出*/ #define ADC_VECTOR VECT( 1, 0x0B ) /* ADC转换结束*/ #define URX0_VECTOR VECT( 2, 0x13 ) /* USART0 RX完成*/ #define URX1_VECTOR VECT( 3, 0x1B ) /* USART1 RX完成*/ #define ENC_VECTOR VECT( 4, 0x23 ) /* AES加密/解密完成*/ #define ST_VECTOR VECT( 5, 0x2B ) /* 睡眠定时器比较*/ #define P2INT_VECTOR VECT( 6, 0x33 ) /* 端口2输入*/ #define UTX0_VECTOR VECT( 7, 0x3B ) /* USART0 TX完成*/ #define DMA_VECTOR VECT( 8, 0x43 ) /* DMA传输完成*/ #define T1_VECTOR VECT( 9, 0x4B ) /* 定时器1(16位)捕捉/比较/溢出 */ #define T2_VECTOR VECT( 10, 0x53 ) /* 定时器2(MAC定时器)*/ #define T3_VECTOR VECT( 11, 0x5B ) /* 定时器3(8位)捕捉/比较/溢出*/ #define T4_VECTOR VECT( 12, 0x63 ) /* 定时器4(8位)捕捉/比较/溢出*/ #define P0INT_VECTOR VECT( 13, 0x6B ) /* 端口0输入*/ #define UTX1_VECTOR VECT( 14, 0x73 ) /* USART1 TX完成*/ #define P1INT_VECTOR VECT( 15, 0x7B ) /* 端口1输入*/ #define RF_VECTOR VECT( 16, 0x83 ) /* 射频通用中断*/ #define WDT_VECTOR VECT( 17, 0x8B ) /* 定时器模式下看门狗溢出*/本节为选择学习内容,是笔者在学习按键中断时,思考的一个问题。想实现高级语言中事件机制,在高级语言中事件主要是靠方法指针和观察者设计模式一并完成。方法指针就是一个指向方法的指针。而C语言中的指针一样可以指向一个函数。如:
例1,简单的事件实现,函数指针。 #include <ioCC2530.h> typedef unsigned int uint; /************************/ void (*timer_ow)(); // 定义一个返回值为void参数为空的函数指针 int (*timer_ow1)(); // 定义一个返回值为int参数为void的函数指针 int (*timer_ow2)(int); // 定义一个返回值为int参数为int的函数指针 /************************/ void timer_Overflow(void) { /*Do something*/ } int timer_Overflow1(void) { /*Do something*/ } int timer_Overflow2(int z) { /*Do something*/ } void main(void) { // 将函数timer_Overflow赋值给函数指针timer_ow timer_ow = timer_Overflow; // 调用函数指针 (*timer_ow)(); timer_ow1 = timer_Overflow1; int result = (*timer_ow1)(); timer_ow2 = timer_Overflow2; result = (*timer_ow2)(result); }代码并没有特别困难的地方,根据前面的预备知识和流程图基本可以看得懂。
转载于:https://www.cnblogs.com/InCerry/p/9397851.html