找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1721|回复: 9
打印 上一主题 下一主题
收起左侧

C51单片机外部中断0汇编与C混合编程问题

[复制链接]
跳转到指定楼层
楼主
ID:888259 发表于 2021-3-8 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.问题背景
         在外部中断0的服务函数中通过嵌入汇编修改中断产生后现场保护的主程序入口地址,以实现中断返回后直接跳转到用户自定义的函数开始执行。
我的思路是,在中断函数服务结束前,先弹出栈中的数据存放在DPH、DPL中,然后修改DPH与DPL的值,再讲DPH、DPL的值压入栈中,等待中断服务函数结束后,单片机自行再讲DPH及DPL弹出,这样中断恢复的主程序入口地址就被改变了。
2.问题代码
        void INT0_Service() interrupt 0 using 1
{
                Menu_Status--;
                if(Menu_Status<1)
                {
                                Menu_Status = 1;
                }

// 先弹出栈中的数据               
                #pragma ASM //汇编嵌套开始
                        POP DPH
                        POP DPL
                        POP ACC

//替换DPH,DPL的值               
                        MOV DPH,#000H
                        MOV DPL,#00EH
               
                        PUSH ACC
                        PUSH DPL
                        PUSH DPH
                #pragma ENDASM //汇编嵌套结束
               
                LCDWriteCmd(LCD_SCREEN_CLR); //清屏       
}

PS:我想让中断服务结束后直接跳转到0x000E这个地址去执行程序。
3.问题求助
(1).这段程序编译没有问题,但是无法按照预期跳转。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:390416 发表于 2021-3-8 19:06 | 只看该作者
在中断里面 居然去执行LCD的操作,谁教你单片机的?
回复

使用道具 举报

板凳
ID:888259 发表于 2021-3-9 11:07 | 只看该作者
人人学会单片机 发表于 2021-3-8 19:06
在中断里面 居然去执行LCD的操作,谁教你单片机的?

自己学的
回复

使用道具 举报

地板
ID:888259 发表于 2021-3-9 11:24 | 只看该作者

那中断服务函数里什么该写,什么不该写呢?
回复

使用道具 举报

5#
ID:844772 发表于 2021-3-9 14:41 | 只看该作者
这个想法好,90年代病毒的典型手段啊。不过51的中断是硬件恢复的,我觉得你改地址没用啊,不过我没查手册,希望有牛人回答。
回复

使用道具 举报

6#
ID:858964 发表于 2021-3-9 16:40 | 只看该作者
建议你试试将中断服务函数修改为:
        void INT0_Service() interrupt 0 using 1
{
        Menu_Status--;
        if(Menu_Status<1)
           {
             Menu_Status = 1;
           }
     
          LCDWriteCmd(LCD_SCREEN_CLR); //清屏      

         #pragma ASM      
           CLR  EA            //关中断
           AJMP 000EH     //  或 LJMP 000EH           
         #pragma ENDASM   
  }
回复

使用道具 举报

7#
ID:451718 发表于 2021-3-9 17:34 | 只看该作者
Jinbw 发表于 2021-3-9 11:24
那中断服务函数里什么该写,什么不该写呢?

显示部分的函数,需要调用很多内存数据。 而外部中断是有高优先级的。  假如你主程序正在执行显示部分的函数功能,有些可写的参数已经执行了, 突然中断来了,这时就会在中断里面,再次执行显示部分的函数功能。 而这时那些可写部分的参数,是被中断保护的。你如何在中断里面再去运行和调用呢?  简单点说,就像你走路的时候,突然左脚踩到了右脚的鞋带,这是又要去迈出右脚。 其结果知道了不?
回复

使用道具 举报

8#
ID:888259 发表于 2021-3-9 17:48 | 只看该作者
Kxuan163 发表于 2021-3-9 16:40
建议你试试将中断服务函数修改为:
        void INT0_Service() interrupt 0 using 1
{

还是不行,没法跳转到指定函数入口
回复

使用道具 举报

9#
ID:367369 发表于 2021-3-9 17:58 | 只看该作者
Jinbw 发表于 2021-3-9 11:24
那中断服务函数里什么该写,什么不该写呢?

中断服务程序中的内容尽量简洁,而且千万不要加延时,一只做赋值和值判断
可以在里面修改一些标志位,在主函数中根据标志位执行对应的耗时久的函数
回复

使用道具 举报

10#
ID:844772 发表于 2021-3-10 11:02 | 只看该作者
您这种在51的中断中重装地址,如果能实现说一下啊,我一直以为它是硬件保存寄存器地址,程序改不了的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表