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

原理图设计

汇编代码

; I/O 端口地址定义
IOY0 EQU 0600H 
IOY1 EQU 0640H 
IOY2 EQU 0680HMY8255_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*2CODE SEGMENTASSUME CS:CODE, DS:DATA,SS:STACK1START:MOV AX,STACK1MOV SS,AXMOV AX,0000HMOV DS,AX;写NMI中断(重置)向量表MOV AX,OFFSET INTNMIMOV SI,02H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写0号中断(慢速)向量表MOV AX,OFFSET INT0MOV SI,20H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写1号中断(快速)向量表MOV AX,OFFSET INT1MOV SI,21H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写2号中断(超时)向量表MOV AX,OFFSET INT2MOV SI,22H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;写3号中断(失败)向量表MOV AX,OFFSET INT3MOV SI,23H*4MOV [SI],AXMOV AX,CSMOV [SI+2],AX;这时候再装入数据段,之前让DS段超越是0000(中断向量表特有的要求)MOV AX,DATAMOV DS, AX   ;8255工作方式MOV AL,90H ;A输入 B输出 C输出MOV DX,MY8255_MODE OUT DX,AL;8253工作方式 //写在8259前正好ignore掉定时器2因为装载工作字产生的第一次跳变MOV DX, MY8253_MODEMOV AL, 00110100B ;定时器0,双字节,方式3OUT DX, ALMOV AL,01111000B ;定时器1,双字节,方式4OUT DX,ALMOV AL, 10110100B ;定时器2,双字节,方式2OUT DX,AL;8259工作方式MOV AL,13HMOV DX,MY8259_ODDOUT DX,ALMOV DX,MY8259_EVENMOV AL,20HOUT DX,ALMOV AL,01HOUT DX,ALMOV AL,0E0HOUT DX,ALRESET:STIMOV RESETR,0MOV SCORER,0MOV FAILR,0;8255初始化;B全1MOV AL,0FFH ;B输出全1MOV DX,MY8255_BOUT DX,AL;PC7(发声器)无效,数码管,老鼠灯全部有效MOV AL,00H MOV DX,MY8255_COUT DX,AL;8253初始化;计数器1 60秒一次性中断信号MOV AX,TIMEMOV BX,1000MUL BXMOV DX,MY8253_COUNT1OUT DX,ALMOV AL,AHOUT DX,AL;计数器2 SPEED秒一次老鼠信号MOV AX,SPEEDMOV BX,1000MUL BX MOV DX,MY8253_COUNT2OUT DX,ALMOV AL,AHOUT DX,AL;主工作循环
A0:CALL SHOWDATA ;显示数据CALL SCAN ;扫描键盘CMP ENDR,1JE EDJMP NED
ED:CLI MOV DX,MY8255_CMOV AL, 07FHOUT DX,ALMOV DX,MY8255_BMOV AL,00HOUT DX,ALJMP A0
NED:  CMP RESETR,1JE RESETJMP A0;NMI号中断,处理重置,完成
INTNMI PROCCLIMOV RESETR,1MOV ENDR,0STIIRET
INTNMI ENDP; 0号中断,摸鱼模式,完成
INT0 PROCCLICMP MODE, 0JZ A1MOV SPEED, 5CALL SETSPEEDMOV AL,20HMOV DX,IOY2OUT DX,ALSTI
A1: IRET 
INT0 ENDP
; 1号中断,鸡血模式,完成
INT1 PROCCLICMP MODE, 1JZ A2MOV SPEED, 2CALL SETSPEED ;修改游戏速度MOV AL,20HMOV DX,IOY2OUT DX,ALSTI
A2: IRET
INT1 ENDP; 2号中断,计时结束,完成
INT2 PROCCLIMOV ENDR,1MOV AL,20HMOV DX,IOY2OUT DX,ALSTIIRET
INT2 ENDP; 3号中断,老鼠
INT3 PROCCLICMP ALIVE, 0JZ A3 JMP A4A3: ;若老鼠死了MOV ALIVE,1;死老鼠复活MOV SOLVE,1CALL RANDMOV AL,20HMOV DX,IOY2OUT DX,ALSTIIRETA4: ;若老鼠活着MOV ALIVE,0;杀死老鼠XOR AL,ALMOV AL,SOLVEADD AL,FAILRCMP AL, 2JNA A9MOV ENDR,1
A9:   MOV FAILR,ALMOV AL,20HMOV DX,IOY2OUT DX,ALSTIIRET
INT3 ENDP; 生成0到5的随机数,并将其转换成老鼠放在RATR中
RAND PROC; 线性同余法参数MOV AX, [SEED]       ; 加载当前种子MOV BX, 110355      ; 乘数IMUL BX              ; AX = AX * BX,结果存储在 DX:AXADD AX, 12345       ; 加增量 cMOV BX, 6           ; 限制范围到 0-5XOR DX, DX           ; 清空 DXDIV BX               ; (DX:AX) / BX,余数在 DXMOV SEED, AX       ; 更新种子MOV AL, DL ; 保存灯号(余数)ADD AL,1MOV RATR,ALRET
RAND ENDPDALLY2 PROC ;防抖延迟D0: MOV CX, 8D1: MOV AX, 7D2: DEC AXJNZ D2LOOP D1DEC DLJNZ D0RET
DALLY2 ENDP; 胜利处理过程
WIN PROCINC SCORERMOV SOLVE, 0WIN_LODE: ;打开蜂鸣器,加载音乐MOV DX,MY8255_CMOV AL,11111111B;OUT DX,ALMOV SI, OFFSET WIN_FREQ_LISTMOV DI, OFFSET WIN_TIME_LISTWIN_PLAY: ;播放音乐MOV DX, 0FHMOV AX, 4240HDIV WORD PTR [SI]MOV DX, MY8253_COUNT0OUT DX, ALMOV AL, AHOUT DX, ALMOV DL, [DI]CALL DALLY3ADD SI, 2INC DICMP WORD PTR [SI], 0JE NOTWINJMP WIN_PLAYNOTWIN:MOV DX,MY8255_CMOV AL,01111111B;OUT DX,ALRET
WIN ENDP; 失败处理过程
LOSE PROCINC FAILRMOV SOLVE, 0CMP FAILR, 2JNA NOTEDMOV ENDR, 1NOTED:    
LOSE_LODE: ;打开蜂鸣器,加载音乐MOV DX,MY8255_CMOV AL,11111111B;OUT DX,ALMOV SI, OFFSET LOSE_FREQ_LISTMOV DI, OFFSET LOSE_TIME_LISTLOSE_PLAY: ;播放音乐MOV DX, 0FHMOV AX, 4240HDIV WORD PTR [SI]MOV DX, MY8253_COUNT0OUT DX, ALMOV AL, AHOUT DX, ALMOV DL, [DI]CALL DALLY3ADD SI, 2INC DICMP WORD PTR [SI], 0JE NOTLOSEJMP LOSE_PLAYNOTLOSE:MOV DX,MY8255_CMOV AL,01111111B;OUT DX,ALRET
LOSE ENDPSETSPEED PROC ;设定游戏速度MOV AX, SPEEDMOV BX,1000MUL BXMOV DX, MY8253_COUNT2OUT DX, ALMOV AL,AHOUT DX,ALRET
SETSPEED ENDPSHOWDATA PROC ;展示数据到数码管CALL PUTBUFCALL DISDATARET
SHOWDATA ENDPDISDATA PROC ;读取缓冲区,数码管显示MOV SI, 3005H       ; 将SI寄存器指向显示缓冲区起始地址MOV CX,6
AGAIN: MOV AL,1DEC CLROL AL,CLINC CLNOT ALAND AL,01111111BMOV DX, MY8255_C    ;位选OUT DX, AL          ; 输出显示码到端口CMOV AL, [SI]        ; 读取缓冲区中的字符MOV BX, OFFSET DTABLEAND AX, 00FFH       ; 获取字符的低字节ADD BX, AX          ; 计算DTABLE的偏移地址MOV AL, [BX]        ; 读取显示码MOV DX, MY8255_BOUT DX, AL          ; 输出显示码到端口BCALL DALLYDEC SI              ; 移动到下一个缓冲区位置LOOP AGAIN           ; 继续输出字符CMP ALIVE,0JE OMITMOV AL,00111111BMOV DX,MY8255_COUT DX,ALMOV AL, RATR        ; 读取老鼠位置MOV BX, OFFSET DTABLEAND AX, 00FFH       ; 获取字符的低字节ADD BX, AX          ; 计算DTABLE的偏移地址MOV AL, [BX]        ; 读取显示码MOV DX, MY8255_BOUT DX, AL          ; 输出显示码到端口BCALL DALLYOMIT:    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,0MOV AH,0MOV [SI], ALMOV [SI+1], AHXOR AH,AHMOV AL,SCORERMOV BL,10DIV BL;此时AH是余数个位,AL是十位MOV [SI+2], ALMOV [SI+3], AHXOR AH,AHMOV AL,FAILRMOV BL,10DIV BL;此时AH是余数个位,AL是十位MOV [SI+4], ALMOV [SI+5], AHRET
PUTBUF ENDPDALLY PROC ;显示延迟PUSH CX             ; 保存CX寄存器的值MOV CX, 8      ; 设置延时计数器
T1: MOV AX, 40       ; 进入内层循环
T2: DEC AX              ; 递减AXJNZ T2              ; 如果AX不为零,继续循环LOOP T1             ; 每次循环,CX寄存器减1POP CX              ; 恢复CX寄存器的值RET                 ; 返回
DALLY ENDP
DALLY3 PROC ;音乐延时PUSH CXPUSH AX
A6:    MOV CX,16
A7:MOV AX,200
A8:DEC AX JNZ A8LOOP A7DEC DLJNZ A6POP AXPOP CXRET 
DALLY3 ENDP 
CLEAR PROCMOV DX, MY8255_BMOV AL, 00HOUT DX, AL            ; 清除显示数据RET
CLEAR ENDPSCAN PROC ;扫描按键MOV DX,MY8255_AIN AL,DXNOT ALAND AL, 00111111BMOV HITR,ALCMP HITR, 0JZ A5CALL DALLY2CMP HITR,0JZ A5 ;防抖JNZ DICIDE
A5:RET
SCAN ENDPDICIDE PROC ;决策函数CMP ALIVE,1JNE DICIDEL; 将HITR和RATR加载到AL和BL中MOV AL, HITRMOV BL, RATRDEC BL; 将RATR转换成对应的位掩码XOR CX, CX      ; 清除CX,用于计数MOV CL, BL      ; 将RATR的值移动到CL作为循环计数MOV BH, 01H     ; 准备初始掩码00000001bROL BH,CLCOMPARE:AND AL, BH      ; 比较HITR和转换后的RATR掩码JNZ DICIDEW         ; 如果两个值相等,跳转到WINJMP DICIDEL        ; 否则跳转到LOSE
DICIDEW:CALL WINRET
DICIDEL:CALL LOSERET
DICIDE ENDPCODE ENDSSTACK1 SEGMENT PARA STACKDW 1000H DUP(?)
STACK1 ENDSDATA SEGMENT; 数据段定义 ;时间相关TIME DW 60      ; 游戏时间设置 60SSPEED 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,0LOSE_FREQ_LIST DW 392, 120,0WIN_TIME_LIST DB 1,1LOSE_TIME_LIST DB 1,1;老鼠存在相关ALIVE DB 0;老鼠存在表示,1存在;决策相关RATR DB 0HITR DB 0SOLVE 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内存给够

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录day25 | leetcode 491.递增子序列 46.全排列 回溯总结

考试周连考不复习就挂科了 一直没更新十分抱歉 今天开始在周日前补回来 491.递增子序列 在90.子集I中我们是通过排序,再加一个标记数组来达到去重的目的。 而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。 …

车载U盘制作教程:轻松享受个性化音乐

车载U盘播放音乐相较于蓝牙播放具有一些明显的优势,这些优势主要体现在音质、稳定性、音乐管理以及兼容性等方面。以下是车载U盘播放音乐的一些优势: 音质更佳:车载U盘播放音乐时,音乐文件是直接被解码并播放的,这意味…

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…

重温设计模式--8、命令模式

文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式,它旨在将一个请求封装成一个对象,从而让你可以用不同的请求对客户端进行参数化,将请求的发送者和接收者解耦,并且能…

oracle怎样使用logmnr恢复误删除的数据

如果有同事误删除数据了,可以用logmnr挖掘归档日志,生成回滚sql,快速恢复数据,比用整个库的备份恢复要快得多。 一 操作步骤 1.1 创建目录 su - oracle mkdir logmnr create directory logmnr_dir as /home/oracle/logmnr; …

读取文件内容、修改文件内容、识别文件夹目录(Web操作系统文件文件夹详解)

前言 因 Unicode IDE 编辑器导入文件、文件夹需要,研究了下导入文件/文件夹的功能实现,发现目前相关文章有点少,故而记录下过程,如果有误,还望指正。(API的兼容性及相关属性、接口定义,请自行查看文件系统…

第6章 图论

2024年12月25日一稿 🐰6.1 图的基本概念 6.1.1 图的定义和表示 6.1.2 图的同构 6.1.3 完全图与正则图 6.1.4 子图与补图 6.1.5 通路与回路 6.2 图的连通性 6.2.1 无向图的连通性 6.2.2 有向图的连通性 6.3 图的矩阵表示 6.3.1 关联矩阵 6.3.2 有向图的邻接矩阵…

网络管理(Network Management,NM)(一)

1.什么是AUTOSAR的网络管理?为什么要网络管理 ? 2.网络管理的三种模式? 上电时,进入总线睡眠模式,如果有唤醒源唤醒,则进入网络模式。其中。唤醒源唤醒分为主动唤醒和被动唤醒,主动唤醒指的是ecu自己想使…

三维扫描在汽车/航空行业应用

三维扫描技术应用范围广泛,从小型精密零件到大型工业设备,都能实现快速、准确的测量。 通过先进三维扫描技术获取产品和物体的形面三维数据,建立实物的三维图档,满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维…

机器学习实战32-利用机器学习对电商销售数据进行归因分析的方法,旨在找出销量下降的原因

大家好,我是微学AI,今天给大家介绍一下机器学习实战32-利用机器学习对电商销售数据进行归因分析的方法,旨在找出销量下降的原因。文章详细介绍了代码编写过程、应用场景及其具体操作,通过实际案例分析,帮助读者深入了解如何运用机器学习技术对电商销售数据进行分析,从而为…

录播检测原理是什么?

直播间录播的检测可以通过多种方式进行。以下是一些常见的检测方法: 1、水印识别:直播平台可以在实时直播画面中嵌入特定的水印,通过识别水印来判断是否存在录播行为。 2、特征分析:直播平台可以通过对直播画面进行特征分析,检测…

WebSocket | 背景 概念 原理 使用 优缺点及适用场景

1 背景 在 WebSocket 出现之前,为了实现推送技术,所用的技术都是轮询,轮询是指浏览器每隔一段时间向服务器发出 HTTP 请求,服务器再返回最新的数据给客户端 常见的轮询方式分为轮询与长轮询,它们的区别如下图所示&…

硬件设计-传输线匹配

目录 简介: 主题: 终端匹配 始端匹配 始端匹配的阻值 始端匹配的输出驱动电流 中间匹配 电阻阻值的选择 简介: 系统何时需要匹配电阻?按照第四章的内容来看有两种情况:长线传输造成信号反射的情况和短线传输造成…

设计模式的主要分类是什么?请简要介绍每个分类的特点。

大家好,我是锋哥。今天分享关于【设计模式的主要分类是什么?请简要介绍每个分类的特点。】面试题。希望对大家有帮助; 设计模式的主要分类是什么?请简要介绍每个分类的特点。 1000道 互联网大厂Java工程师 精选面试题-Java资源分…

基于微信小程序的校园访客登记系统

基于微信小程序的校园访客登记系统 功能列表 用户端功能 注册与登录 :支持用户通过手机号短信验证码注册和登录。个人资料管理 :允许用户编辑和更新个人信息及其密码。站内信消息通知:通知公告。来访预约:提交来访预约支持车牌…

重温设计模式--观察者模式

文章目录 观察者模式(Observer Pattern)概述观察者模式UML图作用:实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题(Subject):具体主题(Concrete Subject&#xf…

CH32V307VCT6---工程template创建

一、硬件:沁恒官网申请的CH32V307VCT6开发板 二、开发环境:Mounriver 三、最终效果 1.PB9连接LED1,使其闪烁 2.OLED屏幕显示:软件IIC,PB10----SDA,PB11---SCL 3.工程链接:CH32V307VCT6 lo…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC(Two-Phase Commit)协议准备阶段提交阶段情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务情况 2:当所有事务参与者均反馈就绪(ready&a…

【软考高级】系统架构设计师复习笔记-精华版

文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包(BSP&#xf…

图解HTTP-HTTP报文

参考资料:图解HTTP HTTP报文 用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(CR LF作为换行符)数据行构成的文本。 请求报文及响…