打印

菜鸟请教中断编程问题

[复制链接]
2003|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
haxy|  楼主 | 2007-1-6 19:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大侠,在KELL中运行一段汇编编的中断程序,但确不能正常运行,错误为
error A22; EXPRESSION  TYPE DOES NOT MATCH INSTRUCTION.(在PUSH A行和POP A行).程序如下:
         ORG   0                      ;程序从0地址开始
         JMP   START                  ;跳过中断向量
         ORG   03H                    ;INT0中断向量
         JMP   INT                    ;执行INT0中断子程序

START:   MOV   IE,#10000001B          ;打开总开关与EX0分路开关
         MOV   SP,#30H                ;设定堆栈地址
         SETB  IT0                  ;采用负缘触发信号
         MOV   A,#0                   ;将ACC设定为00000000B
LOOP:    MOV   P2,A                   ;输出到LED
         CALL  DELAY                  ;调用延迟子程序
         CPL   A                      ;将A的内容反相
         JMP   LOOP                   ;跳至LOOP形成一个循环
;=========INT0中段子程序开始=========
INT:     PUSH  PSW                    ;将PSW存入堆栈
         PUSH  A                      ;将ACC存入堆栈
      SETB  RS0                    ;切换到RB1
;=========第一层循环开始=============
INTLOOP0:MOV   R0,#3                  ;设定三次单灯左移
         MOV   A,#0FEH                ;单灯左移初始值
         MOV   R1,#8                  ;设定八次左移
;=========第二层循环开始=============
INTLOOP1:MOV   P2,A                   ;输出到LED
         CALL  DELAY                  ;调用延迟子程序
         RL    A                      ;将A的内容左移
         DJNZ  R1,INTLOOP1            ;跑至INTLOOP0形成一个循环
;=========第二层循环结束=============
         DJNZ  R0,INTLOOP0            ;跳至INTLOOP1形成一个循环
;=========第一层循环结束=============
         POP   A                      ;取回ACC内容
         POP   PSW                    ;取回PSW内容
         RETI                         ;反回主程序
;=========INT0中断子程度结束=========
;=========0.1秒DELAY子程序===========
DELAY:   MOV   R7,#200
D1:      MOV   R6,#250
         DJNZ  R6,$
         DJNZ  R7,D1
         RET
         END

相关帖子

沙发
lyjian| | 2007-1-6 20:03 | 只看该作者

改成PUSH ACC 和 POP ACC就行

使用特权

评论回复
板凳
haxy|  楼主 | 2007-1-6 21:07 | 只看该作者

菜鸟请教中断编程问题

谢谢楼上的.我刚才改了一下,改成ACCR后在KILL里能运行,不过生成的HEX文件,在PROTEUS里防真,但不能跳出中断,按中断按键后一直执行单灯左移,3次后不能跳回主程序,不知道为什么:(
同学用C语言编的程序好用,不知道汇编应该怎么改.

使用特权

评论回复
地板
hotpower| | 2007-1-6 21:20 | 只看该作者

Keil不是能软件仿真吗???

使用特权

评论回复
5
haxy|  楼主 | 2007-1-6 21:32 | 只看该作者

中断汇编

用PROTEUS做硬件电路防真,能直观的看一下实验情况.

使用特权

评论回复
6
conwh| | 2007-1-7 03:47 | 只看该作者

有可能是在DELAY中产生的中断

注意中断的入口和出口的问题.建议改变RS0

使用特权

评论回复
7
lyjian| | 2007-1-8 08:52 | 只看该作者

下面程序中R0每个循环都在赋值"MOV R0,#3"

;=========第一层循环开始=============
INTLOOP0:MOV   R0,#3                  ;设定三次单灯左移
         MOV   A,#0FEH                ;单灯左移初始值
         MOV   R1,#8                  ;设定八次左移
;=========第二层循环开始=============
INTLOOP1:MOV   P2,A                   ;输出到LED
         CALL  DELAY                  ;调用延迟子程序
         RL    A                      ;将A的内容左移
         DJNZ  R1,INTLOOP1            ;跑至INTLOOP0形成一个循环
;=========第二层循环结束=============
         DJNZ  R0,INTLOOP0            ;跳至INTLOOP1形成一个循环

使用特权

评论回复
8
sharpstar| | 2007-1-8 10:17 | 只看该作者

MOV R0,#3,应该放在循环外部得吧

使用特权

评论回复
9
haxy|  楼主 | 2007-1-13 19:09 | 只看该作者

好用了,谢谢各位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝