IO 口中断

本贴最后更新于 644 天前,其中的信息可能已经天翻地覆

调试步骤

  1. 看数据手册,了解常用的寄存器
  2. 查看参考代码,分析每一个语句的含义。如配置了什么寄存器,寄存器的作用是什么,配置了哪一位。
  3. 有哪些需要主要的地方。

中断触发选择方式

image.png

image.png

image.png

image.png

ISR.ASM 文件

image.png

中断入口地址

  1. 手册的《11.3 章节 D4 系统中断列表》。image.png

  2. 手册《附录 O 关于中断号大于 31 在 Keil 中编译出错的处理》。

  3. 手册《8.2 特殊功能寄存器列表》image.png

程序

#include "STC8A_IO_INT.h" //IO中断配置参考程序 void io_interrupt_config() { //需要修改的地方 P1M0 = 0x00; P1M1 = 0x00; P_SW2 |= 0x80; P1IM0 = 0x00; //上升沿中断 P1IM1 = 0xFF; P1INTE = 0xff; //使能 P1 口中断 P_SW2 &= ~0x80; EA = 1; } //由于中断向量大于 31,在 KEIL 中无法直接编译 //必须借用第 13 号中断入口地址 void common_isr() interrupt 13 { unsigned char psw2_st; unsigned char intf; psw2_st = P_SW2; P_SW2 |= 0x80; //需要修改的地方 intf = P1INTF; if (intf) { //需要修改的地方 P1INTF = 0x00; if (intf & 0x01) { //P1.0 口中断 } if (intf & 0x02) { //P1.1 口中断 } if (intf & 0x04) { //P1.2 口中断 } if (intf & 0x08) { //P1.3 口中断 } if (intf & 0x10) { //P1.4 口中断 } if (intf & 0x20) { //P1.5 口中断 } if (intf & 0x40) { P2=0XFF; //P1.6 口中断 } if (intf & 0x80) { //P1.7 口中断 P2=0X00; } } P_SW2 = psw2_st; }
// ISR.ASM //将下面的代码保存为 ISP.ASM,然后将文件加入到项目中即可 CSEG AT 0133H;P1口中断入口地址 JMP P1INT_ISR ;修改名字 P1INT_ISR: ;修改名字 JMP 006BH ;借用 13 号中断的入口地址 END //012BH P0口中断入口地址 //0133H P1口中断入口地址 //013BH P2口中断入口地址 //0143H P3口中断入口地址 //014BH P4口中断入口地址 //0153H P5口中断入口地址 //015BH P6口中断入口地址 //0163H P7口中断入口地址

注意事项

  1. 调试一个新东西的时候,应该注意保存一份源程序。在此程序中再实现功能的添加。

参考文章

  1. EAXFR:扩展 RAM 区特殊功能寄存器(XFR)访问控制寄存器 STC 8051 单片机扩展 SRAM 介绍、使用以及配置_YaHa201286 的博客-CSDN 博客_单片机 sram

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...