8086 Proteus仿真

Proteus仿真8086时,使用74373作地址锁存器,仿真时一直没发现输出指定的地址,LE引脚也是一直置0,想问一下是仿真电路图画错了,还是代码有问题?

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Time: 2023-05-26 09:56:51 周五
;Author: MAIN_AND_SUB
;8086密码锁设计,按键1-10分别对应1234567890数字,11-16对应清除、退格、重置、确认、管理员、关闭,打开亮绿灯,密码出错亮红灯,管理员模式亮蓝灯
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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 ;0~9段码显示
Table1 DB 3FH,73H,79H,54H,79H,5EH ; OPENED字母显示
Table2 DB 79H,31H,31H,3CH,31H ; ERROR字母显示
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 ;设A、B、下C口输出,上C口输入(A口段选,B口位选,下C口行输出)
      
;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   
      
Waitkey_row: 
       mov al,0 ;行输出低电平
       mov dx,MY8255_C
       out dx,al
       in al,dx ;读取各行状态
       and al,0fh 
       cmp al,00h ;如果各行仍为低电平,继续等待
       jz 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 cx,4
       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
       je 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

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]
        or al,40H 
       out dx,al
       lea di,table1
       mov dx,MY8255_A
       mov al,[di+bx] ;显示opened
       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] 
       or al,80h ;亮红灯
       out dx,al   ;显示error  
       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/1d9rxf72pRqeNt9xQmjJecw?pwd=mhl9
提取码:mhl9

急,求帮助

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7509983
  • 这篇博客也不错, 你可以看下Proteus仿真51系列单片机时出现引脚不显示电平,无法仿真的情况
  • 除此之外, 这篇博客: 8051单片机Proteus仿真与开发实例-串口通信仿真中的 7、代码实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <reg52.h>		
    
    // 初始化串口
    void uart_init()
    {
    	TMOD = 0x20;		/* Timer 1, 8-bit 自动重载模式 */
    	TH1 = 0xFD;		/* 波特率9600 */
    	SCON = 0x50;		/* 模式1,接收使能 */
    	TR1 = 1;		/* 启动timer 1 */
    }
    
    // 发送单个字符
    void uart_send_byte(char tx_data)
    {
    	SBUF = tx_data;		/* 将数据加载到SBUF寄存器 */
    	while (TI==0);		/* 等到停止位传输 */
    	TI = 0;			/* 清空 TI 标志 */
    }
    
    // 发送字符串
    void uart_send_str(char *str)
    {
    	int i;
    	for(i=0;str[i]!=0;i++)	/*发送字符串,最后一位为NULL*/
    	{
    		uart_send_byte(str[i]);
    	}
    }	
    
    // 延时us
    void delay_us(unsigned short us){
         us >>= 3;
         while(us--);
    }
    // 延时ms
    void delay_ms(unsigned short ms){
         unsigned short i = 0,j = 0;
         for(i = 0; i < ms; i++){
            delay_us(1000);//延时1ms
         }
    }
    
    void main()
    {
    	uart_init();		/* 初始化UART */
    	uart_send_str("****uart test****\r\n");
    	for(;;){
    		uart_send_str("test\r\n");
    		delay_ms(1000);
    	}
    }
    

    仿真结果如下:

    在这里插入图片描述