Proteus仿真8086时,使用74373作地址锁存器,仿真时一直没发现输出指定的地址,LE引脚也是一直置0,想问一下是仿真电路图画错了,还是代码有问题?
源码:
IOY0 EQU 0300H ;8255片选端口始地址
MY8255_A EQU IOY0 + 00H ;8255的A口地址
MY8255_B EQU IOY0 + 04H ;8255的B口地址
MY8255_C EQU IOY0 + 08H ;8255的C口地址
MY8255_MODE EQU IOY0 + 0CH ;8255的控制寄存器地址
Data segment
Table DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH
Table1 DB 3FH,73H,79H,54H,79H,5EH
Table2 DB 79H,31H,31H,3CH,31H
BitSelect DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
Origin DB 01D,02D,03D,04D
Adminkey DB 04D,03D,02D,01D
Counter1 DB 0
Counter2 DB 0
Counter3 DB 0
Counter4 DB 0
Open_flag DB 0
Warning_flag DB 0
Admin_flag DB 0
Delete_flag DB 0
Disp_flag DB 0
Data ends
Stack1 segment stack
DW 1000H dup(?)
Stack1 ends
Code segment
assume cs:code,ds:data,ss:stack1
Start:
mov ax,data
mov ds,ax
Start1:
mov si,0200H
mov ax,0
mov bx,0
mov cx,0
mov dx,0
Setio:
mov dx,MY8255_MODE
mov al,81h
out dx,al
Init:
lea bx,bitselect
mov al,[bx+counter2]
mov dx,MY8255_B
out dx,al
mov al,80H
mov dx,MY8255_A
out dx,al
call delay_1ms
inc counter2
jmp init
;Startdisp:
;mov al,40H
;mov bl,feh
;mov dx,MY8255_A
;out dx,al
;mov dx,MY8255_B
;out dx,bh
;sal bh,1
;cmp bh,40H
;je startdisp
Waitkey_row:
mov al,0
mov dx,MY8255_C
out dx,al
in al,dx
and al,0fh
cmp al,00h
jne waitkey_row
call delay_1ms
mov al,00h
out dx,al
in al,dx
and al,0fh
cmp al,00h
jne waitkey_row
Detect_Row:
mov bl,0
and al,0fh
shr al,1
jnc reverse
inc bl
loop detect_row
Reverse:
mov al,88H
mov dx,MY8255_MODE
out dx,al
Waitkey_line:
mov al,0
mov dx,MY8255_C
out dx,al
in al,dx
and al,0f0h
cmp al,0h
jne waitkey_line
call delay_1ms
mov al,00h
out dx,al
in al,dx
and al,0f0h
cmp al,00h
jne waitkey_row
shr al,1
shr al,1
shr al,1
shr al,1
mov dl,0
mov cx,0004H
Detect_Line:
and al,0fh
shr al,1
inc dl
jnc recond_line
loop detect_line
Recond_Line:
mov al,bl
shr al,1
shr al,1
add al,dl
;cmp delete_flag,0
;jnz display
;cmp al,0
;je waitkey_row
cmp al,10
jb setting
cmp al,0
jz num_input
jmp display
Num_input:
mov [si][counter1],al
inc counter1
Display:
mov al,0
mov bx,0
call display_num
jmp waitkey_row
Setting:
mov counter4,al
mov al,0
call menu
jmp waitkey_row
Display_num proc near
cycle:
lea di,bitselect
mov al,[di][counter2]
mov dx,MY8255_B
out dx,al
lea di,table
mov bl,[si][counter2]
mov al,[di][bx]
mov dx,MY8255_A
out dx,al
call delay_1ms
inc bx
inc counter2
mov dl,counter1
cmp counter2,dl
jnz cycle
ret
Display_num endp
Menu proc near
cmp counter4,0BH
je clear
cmp counter4,0CH
je delete
cmp counter4,0DH
je reset
cmp counter4,0EH
je confirm
cmp counter4,0FH
je admin
cmp counter4,10H
je close
clear:
jmp start1
delete:
dec counter1
jmp waitkey_row
reset:
mov cx,6
mov bh,0
mov ax,0
set_code:
lea di,origin
mov ax,[si+bx]
mov [di+bx],ax
jmp waitkey_row
loop set_code
confirm:
mov bh,0
mov cx,6
compare:
cmp admin_flag,0
jne compare_adminkey
je compare_password
compare_adminkey:
lea di,adminkey
mov dl,[di+counter3]
cmp [si+counter3],dl
jz warning
inc counter3
loop compare
mov counter3,0
jmp admin_mode
compare_password:
lea di,adminkey
mov dl,[di+counter3]
cmp [si+counter3],dl
jz warning
inc counter3
loop compare
mov counter3,0
jmp open
admin_mode:
mov dx,MY8255_B
mov al,0feh
out dx,al
jmp waitkey_row
open:
mov ah,0
cmp open_flag,1
je open_disp
mov open_flag,1
open_disp:
mov dx,MY8255_B
lea di,bitselect
mov al,[di+bx]
out dx,al
lea di,table1
mov dx,MY8255_A
mov al,[di+bx]
or al,80H
out dx,al
call delay_1ms
inc bl
cmp bl,7
jz open
jmp waitkey_row
warning:
cmp warning_flag,1
je warning_disp
mov bh,1
mov al,0
mov warning_flag,1
warning_disp:
mov dx,MY8255_B
lea di,bitselect
mov al,[di+bx]
out dx,al
lea di,table2
mov dx,MY8255_A
mov al,[di+bx]
out dx,al
inc ah
call delay_1ms
jmp waitkey_row
admin:
mov admin_flag,1
jmp waitkey_row
close:
jmp start1
ret
Menu endp
Delay_5ms proc near
mov cx,0B5FH
loop $
ret
delay_5ms endp
Delay_1ms proc near
mov cx,0126H
loop $
ret
delay_1ms endp
MOV AH,4CH
INT 21H
Code ends
end start
电路图:
Proteus和汇编源文件:
链接:https://pan.baidu.com/s/1uIVzq6NSjSIjdeeu7yquGA?pwd=upj9
提取码:upj9
希望 帮忙解答
由于您提供的代码只是部分代码,我无法看到完整的程序和相关的电路图。但是从您提供的信息来看,可能存在以下问题:
未能正确连接锁存器和8255芯片,导致输出错误。
未能正确设置锁存器的控制信号,导致地址不能正确锁存。
数据总线上的数据没有被有效地存储到指定的地址中。
为了解决这个问题,您可以尝试以下几种方法:
确保您已经正确连接了锁存器和8255芯片。检查电路图和仿真模型,并确保它们之间正确连接。
检查锁存器的控制信号是否正确设置,特别是时钟信号。如果时钟信号不稳定,可能导致地址无法正确锁存。
使用调试工具来确认数据是否正确存储在指定的地址中。可以使用调试工具来单步执行程序,并监视内存地址中的数据。
希望这些信息对您有所帮助!