第二集:IO中断
用到如下函数:
- // 声明函数
- void set_io_mode(io_mode mode, ...); // 批量设置IO的模式
- // 详细解释:mode为IO的模式,后面为可变参数的io_name参数,需要注意的是,输入完后需要添加Pin_End作为结束符
- // 例如set_io_mode(pu_mode,Pin00,Pin21,Pin32,Pin_End);就是将P00,P21,P32这3个IO设置为上拉输入模式
复制代码
- // 外部使用函数,第一个参数为ioint_mode枚举类型,第二个参数及其后面为io_name枚举类型
- // 这是一个变长函数,举一个例子:
- // set_ioint_mode(en_int,Pin00,Pin01,Pin02,Pin20,Pin_End);
- // 这样是将Pin00,Pin01,Pin02,Pin20的IO中断模式都使能,最后必须为Pin_End
- void set_ioint_mode(ioint_mode mode, ...);
复制代码
- // 这是一个获取中断标志位的函数,参数为io_name枚举类型,返回值为char类型
- // 返回值只会出现0和1,0表示没有中断,1表示有中断,查询一次后自动清除
- char get_ioint_state (io_name pin);
复制代码
- // 设置串口模式,默认配置为115200波特率,8位数据位,1位停止位.
- // 变长参数,可变参数为波特率、超时中断数据位,串口切换引脚,最后需要使用Uart_End结束。
- // 举个例子:set_uart_mode(Uart1, "9600bps", Uart1_P36_7, Uart_End);
- // 这个的意思是设置串口1为9600波特率,8位数据位,1位停止位,并切换引脚为P36和P37上,超时中断为64byte
- // 超时中断的作用是对数据自动分包,64byte就是没数据64个字节(根据波特率),就会自动中断,然后进行数据分包。
- // 再举个例子:set_uart_mode(Uart1, "32byte", "115200bps", Uart_End);
- // 这个的意思是设置串口1为115200波特率,并切换引脚为P30和P31上(默认引脚),超时中断为32byte。
- // 变长参数部分支持乱序输入,波特率和超时中断需要带上单位bps和byte,中间不要有空格。
- // 如果不输入变长参数,例如:set_uart_mode(Uart1, Uart_End);//则代表115200波特率,64byte,P30P31(UART1下)
- // 即不输入的选项拥有默认值,不设置也可以的。
- void set_uart_mode(uart_name uart, ...);
- // 默认值为115200波特率,超时中断64byte,引脚切换每个串口的第一个(参见上面的宏定义)
- // uart1是P30和P31,uart2是P12和P13,uart3是P00和P01,uart4是P02和P03
复制代码
实验箱程序如下:
- #include <AI8051U.H>
- #include "io_int.h"
- #include "set_io.h"
- #include "set_uart.h"
-
- void main(void)
- {
- EAXFR = 1;
- CKCON = 0;
- WTST = 0;
- //初始化程序
- //按下P32,按下P33,通过串口打印出识别到的上升沿/下降沿
- set_io_mode(hz_mode,Pin32,Pin33,Pin36,Pin_End); //设置P32 P33 P36为高阻输入模式,上电默认为高阻输入模式
- set_io_mode(en_pur,Pin32,Pin33,Pin36,Pin_End); //设置P32 P33 P36内部的4K上拉电阻打开
- set_io_mode(pp_mode,Pin37,Pin_End); //将串口发送脚P37设置为推挽输出,抗干扰
- set_ioint_mode(falling_edge_mode,Pin32,Pin_End); //设置P32为下降沿中断
- set_ioint_mode(rising_edge_mode,Pin33,Pin_End); //设置P33为上升沿中断
- set_ioint_mode(en_int,Pin32,Pin33,Pin_End); //同时打开P32 P33的IO中断
-
- set_uart_mode(Uart1,"115200bps",Use_Timer2,Base_8b,"64byte",Uart1_P36_7, Uart_End);
- //设置串口1为115200bps的波特率,使用定时器2作为串口波特率发生器
- //超时中断长度选择64byte ,引脚切换到P36、P37上
-
- EA = 1;
- while(1)
- {
- //循环执行的程序
- if(get_ioint_state(Pin32)) // 设置P32为下降沿中断
- {
- uart_printf(Uart1,"P32 Click\r\n");
- }
- if(get_ioint_state(Pin33)) // 设置P33为上升沿中断
- {
- uart_printf(Uart1,"P33 Click\r\n");
- }
- }
- }
复制代码
擎天柱程序如下:
- #include <AI8051U.H>
- #include "io_int.h"
- #include "set_io.h"
-
- void main(void)
- {
- EAXFR = 1;
- CKCON = 0;
- WTST = 0;
- //初始化程序
- //按下P32,按下P33,通过串口打印出识别到的上升沿/下降沿
- set_io_mode(hz_mode,Pin32,Pin33,Pin_End); //设置P32 P33 为高阻输入模式,上电默认为高阻输入模式
- set_io_mode(en_pur,Pin32,Pin33,Pin_End); //设置P32 P33 内部的4K上拉电阻打开
- set_io_mode(pu_mode,Pin20,Pin21,Pin_End);
- set_ioint_mode(falling_edge_mode,Pin32,Pin_End); //设置P32为下降沿中断
- set_ioint_mode(rising_edge_mode,Pin33,Pin_End); //设置P33为上升沿中断
- set_ioint_mode(en_int,Pin32,Pin33,Pin_End); //同时打开P32 P33的IO中断
-
-
- EA = 1;
- while(1)
- {
- //循环执行的程序
- if(get_ioint_state(Pin32)) // 设置P32为下降沿中断
- {
- P20 = ~P20;
- }
- if(get_ioint_state(Pin33)) // 设置P33为上升沿中断
- {
- P21 = ~P21;
- }
- }
- }
复制代码
Ai8051U创新风格库函数IO中断学习程序.zip
(1.83 MB, 下载次数: 9)
|