IO 口中断

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

调试步骤

  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

相关帖子

回帖

欢迎来到这里!

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

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