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
急,求帮助
#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);
}
}
仿真结果如下: