接着上篇的程序 Main VI:按键中断VI Main VI主要用来初始化各种寄存器和外设,配置中断、设置中断优先级以及开启中断等操作。而处理中断发生后用户需要执行的事件代码就要用到ISR中断服务VI,处理完毕后清除中断标志位后即可返回Main VI。 下面,我们编写ISR中断服务VI。 一,新建一个外部IO中断服务子VI的ISR模板函数EXTI_IO_ISR.vi。(注意,该VI名不能修改,否则无法正常编译) 1,新建中断服务子VI 2,保存命名(要去掉默认名称最后面的数字),使名称保持为EXTI_IO_ISR.vi。 3,按住左键,将子VI拖到主VI下面 二,新建一个全局变量,用于主VI与中断服务子VI之间的信息交互。 1,新建全局变量 2,保存命名Info_Global.vi。 3,添加3种类型的输入控件:整形数值控件(Counter),布尔型变量(flag),字符串型控件(Message),然后把名称改下 数值型控制件:记录进入中断服务VI的有效次数 布尔型控件:记录一些状态信息供主VI使用 字符串型控件:用来传递一些命令参数或者数据信息 4,将其拖到中断服务子VI下 三,缩写中断服务子VI 根据相关IO,新建EIO 1,硬件电路 2,创建EIO 以上IO放入程序框图中,需要设置输入输出方式 四,编写KEY_1中断服务子VI (一)打开EXTI_IO_ISR.vi程序框图 1,打开EXTI_IO_ISR.vi程序框图,切换到case条件结构中的EXTI2_ISR分支,即中断号2 2,增加3帧平铺式顺序结构 (二),第1帧:按键消抖 对于提高机械式开关按键的准确性来说,一般可以通过增加20ms延时来消除物理按键因抖动带来的误判。因为按键输入选择的是下降沿触发,如果延时20ms后,按键输入引脚还是低电平状态,说明这是一次有效的按键触发 1,等待20ms (三)第2帧:LED_1指示灯状态 1,LED_1连续闪烁5次,设闪烁时间间隔为500ms 2,KEY_1和LED_1 KEY_1要在属性中设置输入方式:上拉输入 LED_1要转为写入,要在属性中设置输出方式:开漏输出 3,条件结构,确认当按键输入为低电平有效 4,for循环,实现指示灯闪烁 每当for循环迭代计数数i对10取余为0时,对LED_1进行取反操作,等效为每隔500ms(10*50ms)反转一次。 商与余数 完整的for循环程序 注: flag标志位的添加: 将之前建立的Info_Global.vi拖到程序框中,然后在选择项里选择flag For循环的循环条件:需勾选条件接线 (四)第3帧:清除中断标志位 主要用来通知CPU该次中断已经完成并挂起,可以完全退出该中断线程,否则下一次产生的中断会被屏蔽,无法再进入服务子VI程序。 1,清除中断标志位 2,在中断标志位引脚创建常量,并选择2号中断位:EXTI2_Flag 3,恢复flag标志位为假 完成KEY_1中断服务子VI 下篇讲其他按键的中断服务子VI |
|
来自: 龙之吻6iinxl8c > 《LabVIEW》