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

news2024/12/26 8:09:39

原理图设计

汇编代码

; 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内存给够

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

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

相关文章

Origin教程008:Origin绘制热图

文章目录 练习数据热图练习数据 https://download.csdn.net/download/WwLK123/90185283热图 使用拖拽的方式导入数据: 然后【单击】全选数据: 然后选择【绘图】->【等高线图】->【带标签热图】: 然后勾选【Y数据跨列】: 点击【确定

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计,通过优化硬件组成和软件设计,实现高效率和高准确度的检定工作,有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…

阿里云镜像服务使用指南

阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)是面向容器镜像、Helm Chart等符合OCI标准云原生制品安全托管及高效分发平台。ACR企业版支持全球同步加速、大规模和大镜像分发加速、多代码源构建加速等全链路加速能力,与容器服务A…

【Ambari】使用 Knox 进行 LDAP 身份认证

目录 一、knox介绍 二、Ambari配置LDAP认证 三、验证Knox网关 3.1YARNUI 3.2 HDFSUI 3.3 HDFS RestFULL 3.4 SparkHistoryserver 3.5 HBASEUI 一、knox介绍 Apache Knox网关是一个用于与Apache Hadoop部署的REST api和ui交互的应用程序网关。Knox网关为所有与Apache Ha…

Fiddler v5.0.2最新专业网络抓包工具简体中文版

前言 Fiddler抓包工具一个非常专业且已经翻译成中文的网络调试帮手。它就像一个超级监视器,能帮你看到电脑和互联网之间所有通过HTTP协议传输的信息。比如,当你在网上冲浪时,它可以记录下你和网站之间交换的所有“小纸条”,比如网…

我的 2024 年终总结

2024 年,我离开了待了两年的互联网公司,来到了一家聚焦教育机器人和激光切割机的公司,没错,是一家硬件公司,从未接触过的领域,但这还不是我今年最重要的里程碑事件 5 月份的时候,正式提出了离职…

汽车网络安全渗透测试

产品和企业IT的融合引发了新的网络安全风险,从功能安全到数据隐私都面临潜在威胁。汽车行业正在使用各种方法进行安全检测和验证,但传统的安全测试中漏洞检测低效且不完整。Vector带来一种使用更少测试案例的增强型灰盒渗透测试,能够在提高覆…

C#WPF基础介绍/第一个WPF程序

什么是WPF WPF(Windows Presentation Foundation)是微软公司推出的一种用于创建窗口应用程序的界面框架。它是.NET Framework的一部分,提供了一套先进的用户界面设计工具和功能,可以实现丰富的图形、动画和多媒体效果。 WPF 使用…

【EtherCATBasics】- KRTS C++示例精讲(2)

EtherCATBasics示例讲解 目录 EtherCATBasics示例讲解结构说明代码讲解 项目打开请查看【BaseFunction精讲】。 结构说明 EtherCATBasics:应用层程序,主要用于人机交互、数据显示、内核层数据交互等; EtherCATBasics.h : 数据定义…

秒验简介与下载说明

秒验简介与下载说明 产品概述 秒验是一款帮助开发者实现一键验证功能的产品,从根源上降低企业验证成本, 有效提高拉新转化率,降低因验证带来的流失率,3秒完成手机号验证 SDK信息 下载SDK 下载地址 SDK提供Maven和pod引入两种方…

算法学习(17)—— FloodFill算法

目录 关于FloodFill算法 部分OJ题详解 733. 图像渲染 200. 岛屿数量 695. 岛屿的最大面积 130. 被围绕的区域 417. 太平洋大西洋水流问题 529. 扫雷问题 LCR130. 衣橱整理 关于FloodFill算法 爆搜,深搜,回溯的算法原理并不难,这类题…

美国辅料查询之FDA批准药用辅料数据库(IID数据库)

药用辅料的性质很大程度上决定了制剂的性质,每一种新的药用辅料的问世,都会为制剂技术的发展带来新的机遇,每一种药用辅料都可能让制剂研发员开发出新剂型药物,所以在药物制剂研发过程中,药用辅料的信息调研是不可或缺…

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码

【ELK】filebeat采集数据输出到kafka指定topic

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 背景filebeat主体配置filebeat.inputs部分filebeat.output部分 filebeat完整配置 背景 今天收到需求,生产环境中通需要优化filebeat的输出,…

知识图谱+大模型:打造全新智慧城市底层架构

在数字化时代,智慧城市的建设正迎来新一轮的变革。本文将探讨如何结合知识图谱和大模型技术,构建智慧城市的全新底层架构,以应对日益增长的数据量和复杂性,提升城市管理的智能化水平。 知识图谱:智慧城市的知识库 知识…

网络安全 | 云计算中的数据加密与访问控制

网络安全 | 云计算中的数据加密与访问控制 一、前言二、云计算概述2.1 云计算的定义与特点2.2 云计算的服务模式2.3 云计算的数据安全挑战 三、数据加密技术在云计算中的应用3.1 对称加密算法3.2 非对称加密算法3.3 混合加密算法 四、云计算中的访问控制模型4.1 基于角色的访问…

计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

攻防世界 - Web - Level 1 unseping

关注这个靶场的其它相关笔记:攻防世界(XCTF) —— 靶场笔记合集-CSDN博客 0x01:Write UP 本关是一个 PHP 代码审计关卡,考察的是 PHP 反序列化漏洞以及命令执行的一些绕过手段,下面笔者将带你一步步过关。…

黑马程序员JavaWeb开发教程(前端部分) ---笔记分享

总结 此篇文章记录的内容是不全的,我觉得基础的部分没有记录,我想主要学的是此课程的后端部分,前端部分学校有学习过,我就开倍速一带而过啦,还有就是学校学的是Vue3和此视频讲的Vue2还是有一定区别的。希望能对大家有…

【统计的思想】统计抽样测试(二)

在统计抽样测试里,一旦我们选定了某个测试方案(n|Ac),我们就可以算出任意不合格品率p对应的接收概率L(p)。把各种可能的p值对应的L(p)连成一条曲线,这就是测试方案(n|Ac)的操作特性曲线。比如,方案(80|1)的操作特性曲线长这个样子…