微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计

汇编代码

; I/O 端口地址定义
IOY0 EQU 0600H 
IOY1 EQU 0640H 
IOY2 EQU 0680H

MY8255_A EQU IOY0+00H*2     ; 8255 A 口端口地址
MY8255_B EQU IOY0+01H*2     ; 8255 B 口端口地址
MY8255_C EQU IOY0+02H*2     ; 8255 C 口端口地址
MY8255_MODE EQU IOY0+03H*2  ; 8255 模式控制端口地址

MY8253_COUNT0 EQU IOY1+00H*2 ;8053 计时器0端口地址
MY8253_COUNT1 EQU IOY1+01H*2 ;8053 计时器1端口地址
MY8253_COUNT2 EQU IOY1+02H*2 ;8053 计时器2端口地址
MY8253_MODE EQU IOY1+03H*2 ;8253 模式控制端口地址

MY8259_ODD EQU IOY2
MY8259_EVEN EQU IOY2+01H*2

CODE SEGMENT
    ASSUME CS:CODE, DS:DATA,SS:STACK1


START:
   MOV AX,STACK1
   MOV SS,AX
   
   MOV AX,0000H
   MOV DS,AX
   
   ;写NMI中断(重置)向量表
   MOV AX,OFFSET INTNMI
   MOV SI,02H*4
   MOV [SI],AX
   MOV AX,CS
   MOV [SI+2],AX
   ;写0号中断(慢速)向量表
   MOV AX,OFFSET INT0
   MOV SI,20H*4
   MOV [SI],AX
   MOV AX,CS
   MOV [SI+2],AX
   ;写1号中断(快速)向量表
   MOV AX,OFFSET INT1
   MOV SI,21H*4
   MOV [SI],AX
   MOV AX,CS
   MOV [SI+2],AX
   ;写2号中断(超时)向量表
   MOV AX,OFFSET INT2
   MOV SI,22H*4
   MOV [SI],AX
   MOV AX,CS
   MOV [SI+2],AX
   ;写3号中断(失败)向量表
   MOV AX,OFFSET INT3
   MOV SI,23H*4
   MOV [SI],AX
   MOV AX,CS
   MOV [SI+2],AX
   
   ;这时候再装入数据段,之前让DS段超越是0000(中断向量表特有的要求)
   MOV AX,DATA
   MOV DS, AX   
   
    ;8255工作方式
    MOV AL,90H ;A输入 B输出 C输出
    MOV DX,MY8255_MODE 
    OUT DX,AL
    
    ;8253工作方式 //写在8259前正好ignore掉定时器2因为装载工作字产生的第一次跳变
    MOV DX, MY8253_MODE
    MOV AL, 00110100B ;定时器0,双字节,方式3
    OUT DX, AL
    MOV AL,01111000B ;定时器1,双字节,方式4
    OUT DX,AL
    MOV AL, 10110100B ;定时器2,双字节,方式2
    OUT DX,AL
    
    
    ;8259工作方式
    MOV AL,13H
    MOV DX,MY8259_ODD
    OUT DX,AL
    MOV DX,MY8259_EVEN
    MOV AL,20H
    OUT DX,AL
    MOV AL,01H
    OUT DX,AL
    MOV AL,0E0H
    OUT DX,AL
    
RESET:
   STI
   
   MOV RESETR,0
   MOV SCORER,0
   MOV FAILR,0
   
   ;8255初始化
   ;B全1
    MOV AL,0FFH ;B输出全1
    MOV DX,MY8255_B
    OUT DX,AL
    
    ;PC7(发声器)无效,数码管,老鼠灯全部有效
    MOV AL,00H 
    MOV DX,MY8255_C
    OUT DX,AL
    
    ;8253初始化
    ;计数器1 60秒一次性中断信号
    MOV AX,TIME
    MOV BX,1000
    MUL BX
    MOV DX,MY8253_COUNT1
    OUT DX,AL
    MOV AL,AH
    OUT DX,AL
    
    
    ;计数器2 SPEED秒一次老鼠信号
    MOV AX,SPEED
    MOV BX,1000
    MUL BX 
    MOV DX,MY8253_COUNT2
    OUT DX,AL
    MOV AL,AH
    OUT DX,AL

    ;主工作循环
A0:
   CALL SHOWDATA ;显示数据
   CALL SCAN ;扫描键盘
   CMP ENDR,1
   JE ED
   JMP NED
ED:
   CLI 
   MOV DX,MY8255_C
   MOV AL, 07FH
   OUT DX,AL
   MOV DX,MY8255_B
   MOV AL,00H
   OUT DX,AL
  
   JMP A0
NED:  
   CMP RESETR,1
   JE RESET
   JMP A0

;NMI号中断,处理重置,完成
INTNMI PROC
    CLI
    MOV RESETR,1
    MOV ENDR,0
    STI
    IRET
INTNMI ENDP

; 0号中断,摸鱼模式,完成
INT0 PROC
    CLI
    CMP MODE, 0
    JZ A1
    MOV SPEED, 5
    CALL SETSPEED

    MOV AL,20H
    MOV DX,IOY2
    OUT DX,AL
    STI
A1: 
    IRET 
INT0 ENDP
; 1号中断,鸡血模式,完成
INT1 PROC
   CLI
    CMP MODE, 1
    JZ A2
    MOV SPEED, 2
    CALL SETSPEED ;修改游戏速度
    
    MOV AL,20H
    MOV DX,IOY2
    OUT DX,AL
    STI
A2: 
    IRET
INT1 ENDP

; 2号中断,计时结束,完成
INT2 PROC
    CLI
    MOV ENDR,1
    
    MOV AL,20H
    MOV DX,IOY2
    OUT DX,AL
    STI
    IRET
INT2 ENDP

; 3号中断,老鼠
INT3 PROC
    CLI
    CMP ALIVE, 0
    JZ A3 
    JMP A4
    
    
A3: ;若老鼠死了
   MOV ALIVE,1;死老鼠复活
   
   MOV SOLVE,1
   
   CALL RAND
    MOV AL,20H
    MOV DX,IOY2
    OUT DX,AL
    STI
    IRET
    
A4: ;若老鼠活着
   MOV ALIVE,0;杀死老鼠
   
   XOR AL,AL
   MOV AL,SOLVE
   ADD AL,FAILR
   CMP AL, 2
   JNA A9
   MOV ENDR,1
A9:   
   MOV FAILR,AL
    MOV AL,20H
    MOV DX,IOY2
    OUT DX,AL
    STI
    IRET
INT3 ENDP

; 生成0到5的随机数,并将其转换成老鼠放在RATR中
RAND PROC

    ; 线性同余法参数
    MOV AX, [SEED]       ; 加载当前种子
    MOV BX, 110355      ; 乘数
    IMUL BX              ; AX = AX * BX,结果存储在 DX:AX
    ADD AX, 12345       ; 加增量 c
    MOV BX, 6           ; 限制范围到 0-5
    XOR DX, DX           ; 清空 DX
    DIV BX               ; (DX:AX) / BX,余数在 DX
    MOV SEED, AX       ; 更新种子
    MOV AL, DL ; 保存灯号(余数)
    
    ADD AL,1
    MOV RATR,AL
    
    RET
RAND ENDP


DALLY2 PROC ;防抖延迟
    D0: 
        MOV CX, 8
    D1: 
        MOV AX, 7
    D2: 
        DEC AX
        JNZ D2
        LOOP D1
        DEC DL
        JNZ D0
        RET
DALLY2 ENDP

; 胜利处理过程
WIN PROC
    INC SCORER
    MOV SOLVE, 0

WIN_LODE: ;打开蜂鸣器,加载音乐
    MOV DX,MY8255_C
    MOV AL,11111111B;
    OUT DX,AL
    MOV SI, OFFSET WIN_FREQ_LIST
    MOV DI, OFFSET WIN_TIME_LIST

WIN_PLAY: ;播放音乐
    MOV DX, 0FH
    MOV AX, 4240H
    DIV WORD PTR [SI]
    MOV DX, MY8253_COUNT0
    OUT DX, AL
    MOV AL, AH
    OUT DX, AL
    MOV DL, [DI]
    CALL DALLY3
    ADD SI, 2
    INC DI
    CMP WORD PTR [SI], 0
    JE NOTWIN
    JMP WIN_PLAY

NOTWIN:
    MOV DX,MY8255_C
    MOV AL,01111111B;
    OUT DX,AL
    RET
WIN ENDP


; 失败处理过程
LOSE PROC
    INC FAILR
    MOV SOLVE, 0
    CMP FAILR, 2
    JNA NOTED
    
    MOV ENDR, 1

NOTED:    
LOSE_LODE: ;打开蜂鸣器,加载音乐
    MOV DX,MY8255_C
    MOV AL,11111111B;
    OUT DX,AL
    MOV SI, OFFSET LOSE_FREQ_LIST
    MOV DI, OFFSET LOSE_TIME_LIST

LOSE_PLAY: ;播放音乐
    MOV DX, 0FH
    MOV AX, 4240H
    DIV WORD PTR [SI]
    MOV DX, MY8253_COUNT0
    OUT DX, AL
    MOV AL, AH
    OUT DX, AL
    MOV DL, [DI]
    CALL DALLY3
    ADD SI, 2
    INC DI
    CMP WORD PTR [SI], 0
    JE NOTLOSE
    JMP LOSE_PLAY

NOTLOSE:
    MOV DX,MY8255_C
    MOV AL,01111111B;
    OUT DX,AL
    RET
LOSE ENDP


SETSPEED PROC ;设定游戏速度
    MOV AX, SPEED
    MOV BX,1000
    MUL BX
    MOV DX, MY8253_COUNT2
    OUT DX, AL
    MOV AL,AH
    OUT DX,AL
    RET
SETSPEED ENDP



SHOWDATA PROC ;展示数据到数码管
   CALL PUTBUF
   CALL DISDATA
   RET
SHOWDATA ENDP


DISDATA PROC ;读取缓冲区,数码管显示
   
    MOV SI, 3005H       ; 将SI寄存器指向显示缓冲区起始地址
    MOV CX,6
AGAIN: 
    MOV AL,1
    DEC CL
    ROL AL,CL
    INC CL
    NOT AL
    AND AL,01111111B
    MOV DX, MY8255_C    ;位选
    OUT DX, AL          ; 输出显示码到端口C
    
    MOV AL, [SI]        ; 读取缓冲区中的字符
    MOV BX, OFFSET DTABLE
    AND AX, 00FFH       ; 获取字符的低字节
    ADD BX, AX          ; 计算DTABLE的偏移地址
    MOV AL, [BX]        ; 读取显示码
    MOV DX, MY8255_B
    OUT DX, AL          ; 输出显示码到端口B
    
    CALL DALLY
    DEC SI              ; 移动到下一个缓冲区位置
    LOOP AGAIN           ; 继续输出字符
    
    CMP ALIVE,0
    JE OMIT
    
    MOV AL,00111111B
    MOV DX,MY8255_C
    OUT DX,AL
    MOV AL, RATR        ; 读取老鼠位置
    MOV BX, OFFSET DTABLE
    AND AX, 00FFH       ; 获取字符的低字节
    ADD BX, AX          ; 计算DTABLE的偏移地址
    MOV AL, [BX]        ; 读取显示码
    MOV DX, MY8255_B
    OUT DX, AL          ; 输出显示码到端口B
    CALL DALLY
    
OMIT:    
    RET                 ; 返回
DISDATA ENDP
PUTBUF PROC ;写入缓冲区

    ;读计数器1(游戏时间)计数器值
    ;MOV AL,80H
    ;MOV DX,MY8253_MODE ;锁存
    ;OUT DX,AL
    ;MOV DX,MY8253_COUNT1
    ;IN AL,DX
    ;MOV AH,AL
    ;IN AL,DX
    ;XCHG AH,AL ;读出计数值
    ;XOR DX,DX
    ;MOV BX,1000 
    ;DIV BX ;得到秒数
    
    MOV SI, 3000H
    
    ;MOV BL,10
    ;DIV BL
    ;此时AH是余数个位,AL是十位
    MOV AL,0
    MOV AH,0
    MOV [SI], AL
    MOV [SI+1], AH
    
    
    XOR AH,AH
    MOV AL,SCORER
    MOV BL,10
    DIV BL
    ;此时AH是余数个位,AL是十位
    MOV [SI+2], AL
    MOV [SI+3], AH
    
    XOR AH,AH
    MOV AL,FAILR
    MOV BL,10
    DIV BL
    ;此时AH是余数个位,AL是十位
    MOV [SI+4], AL
    MOV [SI+5], AH
    
    RET
PUTBUF ENDP


DALLY PROC ;显示延迟
    PUSH CX             ; 保存CX寄存器的值
    MOV CX, 8      ; 设置延时计数器
T1: 
    MOV AX, 40       ; 进入内层循环
T2: 
    DEC AX              ; 递减AX
    JNZ T2              ; 如果AX不为零,继续循环
    LOOP T1             ; 每次循环,CX寄存器减1
    POP CX              ; 恢复CX寄存器的值
    RET                 ; 返回
DALLY ENDP
DALLY3 PROC ;音乐延时
    PUSH CX
    PUSH AX
A6:    
    MOV CX,16
A7:
    MOV AX,200
A8:
    DEC AX 
    JNZ A8
    LOOP A7
    DEC DL
    JNZ A6
    POP AX
    POP CX
    RET 
DALLY3 ENDP 
CLEAR PROC
    MOV DX, MY8255_B
    MOV AL, 00H
    OUT DX, AL            ; 清除显示数据
    RET
CLEAR ENDP


SCAN PROC ;扫描按键
   MOV DX,MY8255_A
   IN AL,DX
   NOT AL
   AND AL, 00111111B
   MOV HITR,AL
   CMP HITR, 0
   JZ A5
   CALL DALLY2
   CMP HITR,0
   JZ A5 ;防抖
   JNZ DICIDE
A5:
   RET
SCAN ENDP

DICIDE PROC ;决策函数
    CMP ALIVE,1
    JNE DICIDEL
   ; 将HITR和RATR加载到AL和BL中
    MOV AL, HITR
    MOV BL, RATR
    DEC BL
    ; 将RATR转换成对应的位掩码
    XOR CX, CX      ; 清除CX,用于计数
    MOV CL, BL      ; 将RATR的值移动到CL作为循环计数
    MOV BH, 01H     ; 准备初始掩码00000001b
    
    ROL BH,CL

COMPARE:
    AND AL, BH      ; 比较HITR和转换后的RATR掩码
    JNZ DICIDEW         ; 如果两个值相等,跳转到WIN
    JMP DICIDEL        ; 否则跳转到LOSE
DICIDEW:
   CALL WIN
   RET
DICIDEL:
   CALL LOSE
   RET
DICIDE ENDP

CODE ENDS

STACK1 SEGMENT PARA STACK
	DW 1000H DUP(?)
STACK1 ENDS


DATA SEGMENT
    ; 数据段定义 
    
    ;时间相关
    TIME DW 60      ; 游戏时间设置 60S
    SPEED DW 5 ;老鼠出现时间间隔 5s
    
    ;计数相关
    ;时间计数器由计数器2负责
    SCORER DB 1       ; 打中地鼠的数量计数器
    FAILR DB 2   ; 失败次数计数器
    MODE DB 0 ;游戏模式,0摸鱼模式,1鸡血模式
    
    ;重置相关
    RESETR DB 0 ;重置表示,1重置
    
    ;结束相关
    ENDR DB 0 ;结束表示,1结束
    
    ;音乐相关
    WIN_FREQ_LIST DW 1100, 800,0
    LOSE_FREQ_LIST DW 392, 120,0
    WIN_TIME_LIST DB 1,1
    LOSE_TIME_LIST DB 1,1
    
    ;老鼠存在相关
    ALIVE DB 0;老鼠存在表示,1存在
    
    ;决策相关
    RATR DB 0
    HITR DB 0
    SOLVE DB 0
    
    ;数码管相关
    DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH  ; 0~9的显示码
    
    ; LCG 参数
    SEED DW 12345D ; 生成随机数种子
                                
DATA ENDS
END START

Proteus中Unknown 1-byte opcode / Unknown 2-byte opcode错误的可能解决方案

  1. 没用的电路要断开,或者连了外设就要写控制方式字
  2. 数据段要在写完中断向量表之后装载到DS中(这里主要是因为用了DS:SI)
  3. 使用单片8259也要写ICW4
  4. 数据段放在代码段后面
  5. 栈开大一点
  6. 8086内存给够

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】

目录😋 任务描述 相关知识 1. 二叉树的基本概念与结构定义 2. 建立二叉树 3. 先序遍历 4. 中序遍历 5. 后序遍历 6. 层次遍历 测试说明 通关代码 测试结果 任务描述 本关任务:实现二叉树的遍历 相关知识 为了完成本关任务,你需要掌…

简单园区网拓扑实验

1.实验拓扑 2.实验要求 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan 4、上层通过静态路由协议完成数据通信过程 5、AR1为企业出口路由器 6、要求全网可…

USB接口实现CDC(usb转串口功能)

主控:stm32f429 PHY芯片:usb3320 Cubemx System Core-RCC connectivity-USB_OTG_HS Middleware and Software Packs-USB_DEVICE 时钟配置:根据自己使用的MCU工作频率设置 Generate Code Keil5 打开工程 usbd_cdc_if.c这个文件&…

C++---------动态内存管理

以下是对 C 中相关概念的详细说明及代码示例&#xff1a; 一、动态分配和堆 new 操作符&#xff1a; new 操作符用于在堆上动态分配内存。它会调用对象的构造函数&#xff08;如果是类对象&#xff09;并返回指向分配内存的指针。示例&#xff1a; #include <iostream&g…

企业该如何进行合格文件外发管理

随着信息技术的迅猛发展&#xff0c;企业间的文件交换变得越来越频繁。但是&#xff0c;如何确保文件传输的安全性与效率&#xff0c;成为企业管理者面临的一个重大挑战。镭速&#xff08;Raysync&#xff09;文件外发管理方案以其独特的优势&#xff0c;成为众多企业的首选。本…

Modbus数据网关在制造企业的应用与效果

Modbus是一种广泛应用于工业通信的协议&#xff0c;支持多种设备间的数据交换&#xff0c;如传感器、仪器仪表、PLC、工业机器人、数控机床等。Modbus数据网关则是一种网络通信转换设备&#xff0c;它能够将Modbus协议的数据转换为其他主流协议&#xff08;如MQTT、OPC UA、HTT…

解决集群Elasticsearch 未授权访问漏洞

1、ES集群配置 首先至少是三个节点 2、生成证书&#xff08;后面要用&#xff09; cd /home/elasticsearch-7.4.2/bin ./elasticsearch-certutil cert 回车&#xff0c;空密码&#xff08;可以输入密码&#xff09;&#xff0c;回车 3、将elastic-certificates.p12 复制到三…

mac启ssh服务用于快速文件传输

x.1 在mac上启SSH服务 方法一&#xff1a;图形交互界面启ssh&#xff08;推荐&#xff09; 通过sharing - advanced - remote login来启动ssh&#xff1b;&#xff08;中文版mac应该是 “系统设置 → 通用 → 共享”里打开“远程登录”来启动&#xff09; 查看自己的用户名和…

Jenkins 任意文件读取(CVE-2024-23897)修复及复现

Jenkins任意文件读取漏洞CVE-2024-23897修复及复现 漏洞详情影响范围漏洞复现修复建议 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行…

C语言数组查找

数组概念 就是一堆数的一个集合&#xff0c;包含于指针&#xff0c;但是与指针不同的是数组是开辟了空间的 char a[20] //开辟了20个空间 char *p //一个指针&#xff0c;并没有开辟空间 数组名作为指针&#xff1a; 在C语言中&#xff0c;数组名通常可以被看作是一…

HarmonyOS NEXT 实战之元服务:静态案例效果---最近播放音乐

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index import { authentica…

CVPR2024 | DiffAM:基于扩散模型的对抗性化妆迁移用于面部隐私保护

DiffAM: Diffusion-based Adversarial Makeup Transfer for Facial Privacy Protection 摘要-Abstract引言-Introduction相关工作-Related Works人脸识别中的对抗攻击化妆迁移扩散模型和风格迁移 方法-Method问题表述DiffAM文本引导的化妆去除图像引导的对抗性化妆转移 实验-Ex…

ffmpeg之播放一个yuv视频

播放YUV视频的步骤 初始化SDL库&#xff1a; 目的&#xff1a;确保SDL库正确初始化&#xff0c;以便可以使用其窗口、渲染和事件处理功能。操作&#xff1a;调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 创建窗口用于显示YUV视频&#xff1a; 目的&#xff1a;…

Java高级工程师1380道面试题(附答案)分享

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

打造高效租赁小程序让交易更便捷

内容概要 在如今节奏飞快的商业世界里&#xff0c;租赁小程序如同一只聪明的小狐狸&#xff0c;迅速突围而出&#xff0c;成为商家与消费者之间的桥梁。它不仅简化了交易流程&#xff0c;还在某种程度上将传统租赁模式带入了互联网时代。越来越多的企业意识到&#xff0c;这种…

VS2022 无法使用GitHub账户登录/无法使用copilot 解决方案

无法登录github 账户 错误提示如下&#xff1a; We encountered an issue while adding your GitHub account. Exception Type: GitHubSignInException. Inner Exception: StreamJsonRpc.RemoteInvocationException. Error Message: The input is not a valid Base-64 str…

前端样式练手:阴阳图+时钟的组合

开篇 今天的小作品是突然脑子灵光一闪写出来的&#xff0c;代码不多&#xff0c;就不过多赘述了。 代码实现 <template><div class"clock-container"><!-- 八卦图 --><!-- <div class"bagua"><divv-for"(trigram, ind…

对话 Project Astra 研究主管:打造通用 AI 助理,主动视频交互和全双工对话是未来重点

Project Astra 愿景之一&#xff1a;「系统不仅能在你说话时做出回应&#xff0c;还能在持续的过程中帮助你。」 近期&#xff0c;Google DeepMind 的 YouTube 频道采访了 Google DeepMind 研究主管格雷格韦恩 (Greg Wayne)。 格雷格韦恩的研究工作为 DeepMind 的诸多突破性成…

Maven 项目文档

如何创建 Maven 项目文档。 比如我们在 C:/MVN 目录下&#xff0c;创建了 consumerBanking 项目&#xff0c;Maven 使用下面的命令来快速创建 java 项目&#xff1a; mvn archetype:generate -DgroupIdcom.companyname.bank -DartifactIdconsumerBanking -DarchetypeArtifact…

目标检测——基于yolov8和pyqt的螺栓松动检测系统

目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…