【接口技术】实验3:可编程并行接口8255

实验3 可编程并行接口8255实验

一、实验目的

1:了解8255芯片结构及编程方法。

2:了解8255输入/输出实验方法。

3:掌握8255控制键盘及显示电路的基本功能及编程方法。

4:掌握一般键盘和显示电路的工作原理。

二、实验内容

1:8255并行I/O输入/输出实验

8255是Intel公司生产的可编程外围接口电路,简称PPI。它有A、B、C三个八位端口寄存器,通过24位端口线与外部设备相连,其中C口可分为上半部和下半部。这24根端口线全部为双向三态。三个端口可分二组来使用,可分别工作于三种不同的工作方式。

(1)将实验的线路连接好后进行编程,将8255的C口作为输入,输入信号由8个逻辑电平开关提供,A口作为输出,其内容由发光二极管来显示。

(2)编程从8255C口输入数据,再从A口输出。

(3)接线,如下表所示。

待接线接口1

待接线接口2

8255的CS端

I/O地址译码的Y1端

8255的JP6端(PA7——PA0),A口

LED显示的JP2端(L7——L0)

8255的JP8端(PC7——PC0),C口

逻辑开关的JP1端(K7——K0)

(4)程序的流程图,如下图所示。

2:4*4键盘键号显示实验

(1)编程程序

设置8255C口键盘输入、A口为数码管段码输出,使得在小键盘上每按一个键,8位数码管上显示出相应字符。即,8255控制寄存器端口地址28BH、A口的地址288H、C口的地址28AH。

(2)接线,如下表所示。

待接线接口1

待接线接口2

8255的CS端

I/O地址译码的Y1端

8255的JP6端(PA7——PA0)

数码管的JP3端(DP——A)

8255的JP8端(PC7——PC0)

4*4键盘的JP13端(行3——列0)

数码管的S0端

+5V

(3)程序的流程图,如下图所示。

三、源程序(含注释)

实验内容1:

P8255A    EQU  288H     ;a port

P8255C    EQU  28AH     ;c port

P8255reg  EQU  28BH     ;register port, CS

code segment

    assume cs:code

start:                  ;写方式控制字

    mov bx,200          ; BX <- 200

L1:

    mov cx,0            ; CX <- 0

L2:

    loop L2             ; CX == 0,跳出循环,所以相当于 NOP

    dec bx              ; BX--

    jne L1              ; if BX != 0 goto L1

    ; delay

    mov dx,P8255reg     ;move cs to dx,便于写入控制命令

    mov al,10001001b    ;方式0输出,A口输出且PC输入,所以是10001001

    out dx,al           ;output to leds

next:

    mov dx,P8255C       ;move c-port to dx

    in al,dx            ;input to al

    mov dx,P8255A       ;move a-port to dx

    out dx,al           ;output al

    mov ah,1            ;use function-1

    int 16h

    je next             ;if zf==1, jump to next

exit:

    mov ah,4ch          ;return dos

    int 21h

code ends

end start

实验内容2:

a8255 equ 288H    ;8255 A  

c8255 equ 28aH    ;8255 C

k8255 equ 28bH    ;8255 CS

data segment

table1 dw 0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h        ;键盘行列码表

       dw 07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h

LED    DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH        ;LED段码表,分别代表0~F

       DB 39h,5EH,79h,71h,0ffh

char  db '0123456789ABCDEF'                                      ;字符表

mes   db 0ah,0dh,'PLAY ANY KEY IN THE SMALL KEYBOARD! ',0ah,0dh  ;提示信息

      db 'IT WILL BE ON THE SCREEN! END WITH E ',0ah,0dh,'$'

key_in db 0h

data ends

stacks segment stack

     db 100 dup (?)

stacks ends

code segment

        assume cs:code,ds:data,ss:stacks,es:data

start:

        cli                       ;禁止中断发生

        mov ax,data               ;data放入ax

        mov ds,ax                 ;data进入ds

        mov es,ax                 ;data进入es

        mov ax,stacks             ;堆栈stacks放入ax

        mov ss,ax                 ;堆栈进入ss

        mov dx,offset mes         ;输出mes提示信息

        mov ah,09                 ;use function-9

        int 21h                   ;在屏幕上显示字符串

        ;need to add          

        mov dx,k8255              ;move cs to dx,便于写入控制命令

        mov al,10000001b          ;方式0输出,A口输出且C口高四位输出,低四位输入

        out dx,al                 ;控制字写入dx

main_key:

        call key                  ;调用key子程序

        call display              ;调用display子程序

        cmp byte ptr key_in,'E'   ;比较是否按下“E”

        jnz main_key              ;zf==0 jump to main-key

        mov ax,4c00h              ;返回dos4cH

        int 21h                  

key proc near                    

key_loop:                        

        mov ah,1                  ;use function-1

        int 16h                   ;按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符

        jnz exit                  ;zf==0 jump to exit

        ;need to add

        mov dx,c8255            ;选定c

        in al,dx                ;c口输入

        and al,0FH              ;0000 1111作与运算,消除高位保留低位

        cmp al,0FH              ;0FH进行比较,如果没有按键按下,则相等

        jz key_loop             ;zf==1 jump to key_loop

        call delay              ;调用延时

        ;need to add

        mov ah,al               ;al移动到ah,即行码存入ah

        mov dx,k8255            ;选定控制口

        mov al,10001000b        ;方式0输出,A口输出且C口高四位输入,低四位输出

        out dx,al               ;控制字写入dx

        mov dx,c8255            ;选定c

        in al,dx                ;c口输入

        and al,0F0H             ;1111 0000作与运算,消除低位保留高位

        cmp al,0F0H             ;F0H进行比较,如果没有按键按下,则相等

        jz key_loop             ;zf==1 jump to key_loop

        mov si,offset table1    ;si保存行列码表的首地址

        mov di,offset char      ;di保存字符表的首地址

        mov cx,16               ;待查字符个数为16,即0-9A-F

key_tonext:

        cmp ax,[si]             ;比较ax和行列码表

        jz key_findkey          ;zf==1,则跳转到key-findkey(即找到对应码了)

        dec cx                  ;cx--(没找到,则待查找个数减1

        jz key_loop             ;zf==1,则跳转到key-loop(如果移动出了字符表,则继续主循环)

        add si,2                ;si+=2(没找到,则码表移动)

        inc di                  ;di++(没找到,则字符表移动)

        jmp key_tonext          ;无条件跳转到key-tonext,继续查找

key_findkey:

        mov dl,[di]             ;比较dl和字符表

        mov ah,02               ;use function-2

        int 21h                 ;屏幕显示一个字符

        mov byte ptr key_in,dl  ;字符存入key-in,便于比较是否为E

key_waitup:

        mov dx,k8255            ;控制字端口调用

        mov al,81h              ;1000 0001写入al

        out dx,al               ;写入控制字

        mov dx,c8255            ;调用c

        mov al,0fh              ;0000 1111写入al

        out dx,al               ;写入控制字

        in al,dx                ;读行扫描

        and al,0fh              ;作与运算,消除高位

        cmp al,0fh              ;比较低位是否有按下

        jnz key_waitup          ;zf==0 继续扫码

        call delay              ;调用延时

        ret                     ;使用堆栈

exit:

        mov byte ptr key_in,'E' ;E送入key-in

        ret                     ;使用堆栈

key endp

delay proc near

        push ax                 ;堆栈塞入数据

        mov ah,0                ;use function-0

        int 1ah                 ;等待输入

        mov bx,dx               ;dx送入bx

delay1:

        mov ah,0                ;use function-0

        int 1ah                 ;等待输入

        cmp bx,dx               ;比较dxbx

        jz delay1               ;zf==1 继续等待输入

        mov bx,dx               ;dx送入bx

delay2:

        mov ah,0                ;use function-0

        int 1ah                 ;等待输入

        cmp bx,dx               ;比较dxbx

        jz delay2               ;zf==1 继续等待输入

        pop ax                  ;堆栈弹出数据

        ret                     ;使用堆栈

delay endp

display PROC near

        push ax

        mov bx,offset LED       ;led首地址送入bx

        mov al,byte ptr key_in  ;key-in送入al

        sub al,30h              ;al减去30H,因为0-9ASCII30H-39H,因此减去之后得到数字本身

        cmp al,09h              ;比较是哪一个数字

        jng DIS2                ;if not greater, jump to dis2(即是数字就跳转到dis2

        sub al,07h              ;al减去07H,因为A-FASCII97H-102H,因此减去之后得到字母本身

DIS2:  

        xlat

        mov dx,a8255            ;选定a

        out dx,al               ;a口输出

        pop ax                  ;弹出数据

        ret

display endp                      

code ends

end start

四、遇到的问题和解决过程

问题1:在实验2中,一开始按下键盘后所输出的数是沿键盘主对角线对称的那个数。

解决1:经过线路检查发现,实验箱上的接口是A——DP,而实验指导书上的内容是DP——A,因此需要将并口接线旋转并口接线180°再插入到数码管的接口。

问题2:在实验2中,发现数码管在遇到字母按键输入时,无法正常显示。

解决2:对程序进行断点测试,发现在下面代码段中的【jng DIS2】无法成功编译。后续改成jle指令(小于等于)之后,程序可以正常运行。我们怀疑可能存在的问题是实验室电脑上的编译器无法兼容jng指令(不大于)。(后续重启程序,修改为jng后也可以正常运行,因此我们也不太确定这个问题所引发的原因。)

问题3:在实验2中,实验指导书令S0接地(GND),此时无论键盘输入什么内容,数码管都不会显示。

解决3:实验指导书编写错误(如下图所示),应该是令S0接VCC(+5V)。只有将S0赋高电平使得位选成功后,才会在右边第一个数码管显示。

问题4:在实验2中,实验指导书上的图标注键盘的行是C口的高4位,如果不仔细甄别会写错代码的方式控制字。

解决4:实验指导书编写错误(如下图所示)。经过分析后得出,键盘的行应该是C口的低4位,因此需要在对键盘的行进行输入的时候,应该对pc低位进行输入设置,并写出对应的方式控制字。同理,对键盘的列进行相应的控制字编写。

五、实验结果

实验内容1:

(1)拨码开关输入,LED灯输出

如下图所示,当设置低5位拨码开关为1、高3位拨码开关为0时,LED会进行对应的显示,即低5位处于亮起状态、高3位处于熄灭状态。

(2)完整操作过程

完整操作过程如视频附件3-1.mp4所示。在视频中,我们依次测试了拨码开关先设置为1和再设置为0的结果。

实验内容2:

(1)键盘输入非E字母

如下图所示,当按下按键【A】时,数码管显示A,且PC屏幕上显示A。

(2)键盘输入数字

如下图所示,当按下按键【2】时,数码管显示2,且PC屏幕上显示2。

(3)键盘输入E字母

如下图所示,当按下按键【E】时,数码管显示E,且PC屏幕上显示E。同时,可以看到程序检测到用户输入【E】并执行终止,并输出【done!】字符串。

 (4)完整操作过程

完整操作过程如视频附件3-2.mp4所示。在视频中,我们依次测试了数字、非E字母和E字母。

六、体会与总结

1:进一步巩固了8255方式控制字的使用。在实验2中,如果需要对8255的输入/输出端口进行修改,需要进行以下两个步骤。第一,在开头对端口进行重定义,并注意A口到C口的地址是依次分布的,例如在本实验中A口是288H、B口是289H、C口是28AH。第二,对方式控制字进行修改,但是有可能修改后的控制字仍然保持不变。例如,如果在键盘的列输入时,将输出从A口变为B口,则需要把控制字从【10001001】变成【10001001】,虽然二者在码字内容上相同,但是编写的思路是不同的。编写思路如下表所示,其中橘色部分为二者思路不同的地方。

D7

D6

D5

D4

D3

D2

D1

D0

输出是A口

特征位1

A组采用方式0,置为00

A口输出,置为0

PC高位输入,置为1

B组默认为0

B口默认为0

PC低位输入,置为1

输出是B口

特征位1

A组默认为00

A口默认为0

PC高位输入,置为1

B组采用方式0,置为0

B口输出,置为0

PC低位输入,置为1

2:学习了一般键盘和显示电路的工作原理。一般的矩阵键盘是通过行和列的输入判断按键是否按下的,例如在本实验中,行由低4位进行控制,列由高4位进行控制,且初始时行码和列码均为1,当有按键按下后,对应的位置会变为0。一般的显示电路是采用段码和位码对数码管进行显示控制,例如在本实验中,通过VCC片选S0,即选中第0个数码管,并通过段码片选进行数字图案的显示。段码的控制如下图所示。

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

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

相关文章

JAVA - 阻塞队列

一、什么是堵塞队列 堵塞队列&#xff08;Blocking Queue&#xff09;是一种特殊类型的队列&#xff0c;它具有一些特定的行为和限制。在堵塞队列中&#xff0c;当队列为空时&#xff0c;尝试从队列中取出元素的操作将会被阻塞&#xff0c;直到队列中有可用元素&#xff1b;当…

java el表达式解析

使用Java EL表达式解析 在Java开发中&#xff0c;我们经常需要对表达式进行解析和计算。EL&#xff08;Expression Language&#xff09;表达式是一种用于在Java应用程序中计算和输出动态值的简单语言。它可以用于实现动态的条件判断、数学计算、字符串合并等功能。本文将教你…

《第一行代码:Android》第三版-3.4.4体验Activity的生命周期

本文的代码是在主Activity中&#xff0c;重载了几个生命周期函数&#xff0c;在日志中打印出对应的日志信息&#xff0c;有两个按钮&#xff0c;负责启动另外的Activity&#xff0c;并回到主Activity 由此查看日志&#xff0c;来体会生命周期。 MainActivity.kt 文件如下 pac…

SAP_MM_ABAP_物料视图维护监控报表(自定义开发)

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读458次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

Java零基础——Nginx篇

1.【熟悉】服务器概述 1.1 目前常见的web服务器 1&#xff0c;Apache(http://httpd.apache.org) 它是世界上用的最多的web服务器&#xff0c;市场占有率达60%左右&#xff0c;模块非常丰富&#xff0c;系统非常稳定&#xff0c;可移植性好&#xff0c;但是比较消耗资源 2&…

Javaweb之Vue组件库Element案例的详细解析

4.4 案例 4.4.1 案例需求 参考 资料/页面原型/tlias智能学习辅助系统/首页.html 文件&#xff0c;浏览器打开&#xff0c;点击页面中的左侧栏的员工管理&#xff0c;如下所示&#xff1a; 需求说明&#xff1a; 制作类似格式的页面 即上面是标题&#xff0c;左侧栏是导航&…

E. Kolya and Movie Theatre

https://codeforces.com/contest/1862/problem/E 容易发现就是维护一个长度至多为m的序列和 减去 i*d&#xff08;i为最后选择看电影的是哪一天&#xff09; 一开始没有把第0天的p是0用上&#xff0c;没想出来 维护非负序列和这里可以用一个set&#xff0c;有点类似于滑动窗口&…

示波器高压探头的操作说明及使用注意事项

操作说明&#xff1a; 连接探头衰减端的地线(鳄鱼夹)到好的接地点或可靠的接地测试端。连接BNC头到示波器的BNC输入端口。选择示波器要求的量程范围。 注意&#xff1a;请务必在连接测试前把高压电源关闭。 注意事项&#xff1a; 请勿将测试设备的接地线从地面接线柱上移开。…

人工智能对人脑的探索研究!物理限制推动类脑人工智能的发展

原创 | 文 BFT机器人 在一项开创性的研究中&#xff0c;剑桥科学家采用了一种新颖的人工智能方法&#xff0c;展示了物理约束如何深刻影响了人工智能系统的发展。 这项研究会让人想起人脑的发育和能力限制&#xff0c;为复杂神经系统的进化提供了新的见解。通过整合这些限制&a…

90基于matlab的无迹卡尔曼滤波器参数估计的非线性最小二乘优化

基于matlab的无迹卡尔曼滤波器参数估计的非线性最小二乘优化&#xff0c;数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 90matlab无迹卡尔曼滤波器参数估计 (xiaohongshu.com)

史上最全接单平台集锦,程序员不容错过!

非典型程序员不是每天都累成狗&#xff0c;天天”996"甚至”007“。可能&#xff0c;面临着上班摸鱼没事干&#xff0c;下班躺尸打游戏的无聊境况。那么&#xff0c;如果你也是这样的程序员&#xff0c;有没有什么安排可以打发时间&#xff1f; 闲着还不如挣钱~心情好的时…

幼教智能时代精英论坛北京举行

中国日报11月29日电 近日&#xff0c;智能时代赢之道—2023幼教智能时代精英论坛在北京泰山饭店成功举办&#xff0c;来自全国各地的近百位幼儿园园长、幼教老师集聚一堂&#xff0c;探索智能时代幼教的智慧化解决方案。 伴随“教育数字化战略行动”的深入开展&#xff0c;智慧…

创建Asp.net MVC项目实现视图页面数据传值显示

MVC中视图传值 ViewData ViewBag TempData 举例创建三中传值方式实现页面数据展示 MVC中视图传值 Asp.net MVC中Controller向View传值有多种方式,这里简单说一下其中3种方式 ViewData、ViewBag和TempData ViewData ViewData存储数据&#xff0c;ViewData的声明和赋值方…

Jenkins+Git+Appium 持续集成策略

持续集成 &#xff08;Continuous integration&#xff0c;简称 CI&#xff09; 持续集成是一种开发实践&#xff0c;它倡导团队成员需要频繁的集成他们的工作&#xff0c;每次集成都通过自动化构建&#xff08;包括编译、构建、自动化测试&#xff09;来验证&#xff0c;从而尽…

班主任每日工作流程

以下是班主任的每日工作流程&#xff0c;虽然每天的工作都很繁琐&#xff0c;但是为了学生的成长和发展&#xff0c;班主任们必须认真履行职责&#xff0c;用自己的爱心和责任心去呵护每一个学生。 早晨7&#xff1a;30到校&#xff0c;组织学生打扫卫生&#xff0c;检查学生作…

基于Java SSM框架+Vue实现垃圾分类网站系统项目【项目源码+论文说明】

基于java的SSM框架Vue实现垃圾分类网站系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

哈希_快乐数

//编写一个算法来判断一个数 n 是不是快乐数。 // // 「快乐数」 定义为&#xff1a; // // // 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 // 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 // 如果…

一键删除方舟编译器缓存文件js、js.map插件ArkCompilerSupport

新手学习鸿蒙开发&#xff0c;发现DevEco Studio编译过种会生成js、js.map&#xff0c;在论坛上看了其它开发者也提了问题但无没解决&#xff0c;写了一个插件大家试下&#xff1a; https://plugins.jetbrains.com/plugin/23192-arkcompilersupport 源码&#xff1a;https://g…

作业飞翔的鸟

首先创建一个新的Java项目命名为“飞翔的鸟”&#xff0c;并在src中创建一个包命名为“com.qiku.bird"&#xff0c;在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”&#xff0c;并向需要的图片素材导入到包内。 package com.qiku.bird;impo…

如何利用轮廓系数(Silhouette Coefficient)来判断模糊c均值聚类FCM的聚类簇数量

文章目录 前言一、轮廓系数的计算方法二、具体流程 前言 轮廓系数&#xff08;Silhouette Coefficient&#xff09;是一种评价聚类效果的指标&#xff0c;它可以用于判断模糊C均值聚类的聚类簇数量。 一、轮廓系数的计算方法 对于每个数据点i&#xff0c;计算它属于每个聚类…