1、PIC 实 验 报 告-电平变化按键中断任课教师:周燕学院:信息学院班级:11 级电科一、实验目的1为了方便连接键盘,PIC 中档单片机的 I/O 端口 RB4RB7 具有一个特别的功能- 电平变化中断功能。单片机在使能此中断后(对RBIE 置位) ,能够在 PORTD4PORTD7 这四个引脚的电平发生变化时产生中断,从而使软件可以通过中断的方式管理连接在这 4 个引脚上的键盘。本实验通过连接到 RB4 和 RB5 的两个按键来演示按键中断功能。二、实验功能内容使用 RB4 和 RB5 的按键中断功能 ,实现按键识别功能.即在每次按下和 RB4 相连的 KEY4 后仅点亮 LED4, 每次按
2、下和 RB5 相连的KEY5 后仅点亮 LED5,三、实现功能用到的硬件电路设计和电路板的链接方法将跳线将 JR_RB 和 KEY4、KEY5 短接,跳线器 JP_RD 和LED4、LED5 短接。2四、软件设计1.流程图设计主程序设定 PORTD 全部为输出引脚并输出 00H将端口 B 设置为输入并使能其弱上拉功能使 PORTB 的电平变化中断无条件循环中断服务程序中断入口程序保护中断现场通过 RBIE 和 RBIF 判断是否为外部中断调用 20ms 延时子程序,消除按键抖动读入 RB4 和 RB5 的电平,取反后送入 RD4 和 RD5通过检测 RB4 和 RB5是否全部恢复为 1 来判断
3、按键是否松开调用 20ms 延时子程序,消除断开抖动的影响清 RBIF 标志中断出口程序恢复中断现场中断返回Y NNY使能全局中断和 PORTB 电平变化中断位32.程序设计和注释#include p16f877a.inc COUNT EQU 20H ;定义 COUNT 寄存器 SAVEW EQU 21H ;定义 SAVEW 寄存器 SAVES EQU 22H ;定义 SAVES 寄存器 COUNT1 EQU 23H ;定义 COUNT1 寄存器 COUNT2 EQU 24H ;定义 COUNT2 寄存器ORG 00HNOP ;空指令GOTO MAINORG 0x004MOVWF SAVEWS
4、WAPF STATUS,WCLRF STATUSMOVWF SAVES ;保护现场 GOTO RBINT;函数名称:main;* 函数功能:使能由端口 RB 产生的中断;* 使用说明:;*MAINBCF STATUS,RP1BSF STATUS,RP0 ;转到体 1CLRF TRISD ;将 PORTD 设置为输出端口CLRF OPTION_REG ;开启内部弱上拉MOVLW B00111111 MOVWF TRISB ;将 RB0-RB5 设置为输入端口BSF INTCON,RBIE ;允许端口 RB 产生的中断BCF STATUS,RP0 ;转到体 0CLRF COUNT ;COUNT 清
5、零CLRF PORTD ;将 PORTD 清零BSF INTCON,GIE ;打开全局中断BSF INTCON,PEIE ;打开外设中断GOTO $;函数名称:RBINT; 函数功能:RB 端口产生中断 RBINT 服务函数,判断是哪个按键被按击,并点亮对应的LED。RBINT BTFSS INTCON,RBIE ;判断是否允许端口 RB 产生的中断4GOTO JMP ;否结束中断BTFSS INTCON,RBIF ;判断是否为端口 RB 中断GOTO JMP ;否结束中断CALL DELAY_20ms ;是,调用延时子程序MOVF PORTB,0 ;RB 的值送到 W 寄存器MOVWF CO
6、UNT ;存到 COUNT 寄存器MOVLW B11001111 ;0xCF 送到 W 寄存器,屏蔽不显示位IORWF COUNT,1 ;和 COUNT 做或后存到 COUNTCOMF COUNT,0 ;反逻辑,COUNT 取反后送到 W 寄存器MOVWF PORTD ;送到 RD 端口显示BTFSS PORTB,4 ;判断按键 4 是否松开GOTO $-1 ;否;继续检测BTFSS PORTB,5 ;判断按键 5 是否松开GOTO $-1 ;否;继续检测CALL DELAY_20ms ;是,调用延时子程序BCF INTCON,RBIF ;是,清标志位JMPSWAPF SAVES,WMOVWF
7、 STATUSSWAPF SAVEW,FSWAPF SAVEW,W ;恢复现场RETFIE;* 函数名称:DELAY_20ms;* 函数功能:延时 20msDELAY_20msMOVLW D28 ;设置外部循环次数MOVWF COUNT1 ;LOOP3MOVLW D237 ;设置内部循环次数MOVWF COUNT2 ;DECFSZ COUNT2 ,1 ;内部循环变量自减 1,为 0 则跳转GOTO $-1 ;DECFSZ COUNT1,1 ;外部循环变量自减 1,为 0 则跳转GOTO LOOP3 ;RETURN ;返回主程序5END 五、实验结果与分析实验结果:将程序烧入目标板后,按下按键
8、key4 后 led4 亮,按下key5 后,led4 灭,led5 亮。结果分析:在 debug 下烧入程序,打开 watch 窗口,添加 SFR,运行程序观察。figure1figure2 初始化6figure3 按下 key4通过 figure3 可以看出,在终端入口设置断点,按下 key4 时,PORTB,4 输出高电平,led4 亮,进入中断后,终端总是能关闭。figure3 按下 key5按下 key5 时,PORTB,5 输出高电平,led5 亮。六、实验小结(碰到的问题及解决方法)经过这次的实验,我终于理解了老师上课时候说的中断的各个步骤。这次的实验使我对中断有了更深的了解和认识。