【微机原理 实验】可编程外围接口芯片8255(4)(硬件-含汇编代码)

实验十  可编程外围接口芯片8255(4)

 

更多微机实验:

Github: https://github.com/Amoiensis/Assembly-language 

CSDN: https://blog.csdn.net/yxp189/column/info/39992 

                         汇编语言-微机原理与接口技术-实验

注意未经允许,请勿转载!

           转载请标明出处~

适用课程:微机原理与接口技术(实验)

选用教材:微型计算机原理与接口技术-中国科学技术大学出版社

注意:8255芯片对应多个实验,请于???链接中查看~

 

一、实验目的

1、掌握8255A编程原理。

2、了解键盘阵列结构,学会读取按键的方法。

 

二、实验内容

按下图接线,8255C口接键盘(实际8255的PC0~PC3接键盘的列0~列3,PC4~PC7接键盘的行0~行3),8255CS接地址译码输出的288h~28fh。 8255的A口PA0~PA7接数码管的a~dp。

8255端口A地址为:288H

端口C地址为:    28AH

控制口地址为:   28BH

编程使得在键盘阵列上每按一个键后,微机屏幕上有相应字符显示出来,按“E”退出程序。

 

三、编程提示

1.识别键盘上的闭合键,通过采用行扫描法或行翻转法:

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值;如果列值中有某位为低电平,则表明行列交点处的键被按下;否则扫描下一行,直到扫完全部的行线为止。

行翻转法是识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式;程序通过输出端口向全部行线上送低电平,然后读取列线的值;如果此时有某一键被按下,则必定会使某一列线值为零,程序再对两个并行端口进行方式设置,使行线工作在输入方式,列线工作在输出方式,并且将刚才读到的列线值从列线所接的并行端口输出,再读取行线上的值;那么,在闭合键所在的行线上的值必定为零。这样,当一个键被按下时,必定可以读到一对唯一的行值和列值。

2.在程序设计时,将各个键对应的代码(列值,行值)放在一个表中,程序通过查表来确定具体按下的为哪一个键。

 

四、实验电路图

 

实验代码

;Author:YXP
;CSDN:yxp189
;Email:yxp189@protonmail.com
;如有问题,欢迎和我联系~
;转载请标明出处~

      IOPORT  EQU       0CC00H-280H
       A8255  EQU       IOPORT+288H ;8255端口,a口  段码
       B8255  EQU       IOPORT+289H ;8255端口,b口 位码
       C8255  EQU       IOPORT+28AH ;8255端口,c口 键盘
       K8255  EQU       IOPORT+28BH ;8255端口,控制口
        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
              DB        39H,5EH,79H,71H,0FFH    ;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
        CHAR  DB        '0123456789ABCDEF'      ;字符表
      KEY_IN  DB        'G'
       CHAR1  DB        0FFH
         MES  DB        0AH,0DH
              DB        'PLAY ANY KEY IN THE SMALL KEYBOARD! ',0AH,0DH
              DB        'IT WILL BE ON THE SCREEN AND LED ! END WITH F or ANY KEY',0AH,0DH,'$'
        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
              MOV       DS,AX
              MOV       ES,AX
              MOV       AX,STACKS
              MOV       SS,AX
              MOV       DX,OFFSET MES           ;显示提示信息
              MOV       AH,09
              INT       21H
         KY:  CALL      KEY         ;调键盘扫描子程序,得到一个字符
              CALL      DISPLY      ;调显示子程序,显示得到的字符
              MOV       AH,1
              INT       16H
              JNZ       EXIT        ;按任意键退出
              MOV       DL,BYTE PTR KEY_IN
              CMP       DL,'F'
              JNZ       KY
       EXIT:  MOV       AX,4C00H    ;如果是"F"键则退出
              INT       21H         ;退出
         KEY  PROC      NEAR
   KEY_LOOP:  MOV       DX,K8255
              MOV       AL,81H
              OUT       DX,AL
              MOV       DX,C8255
              MOV       AL,0FH
              OUT       DX,AL
              IN        AL,DX       ;读行扫描值
              AND       AL,0FH
              CMP       AL,0FH
              JZ        KEY1        ;未发现有键按下则转
              CALL      DELAY       ;延时
              MOV       AH,AL
              MOV       DX,K8255
              MOV       AL,88H
              OUT       DX,AL
              MOV       DX,C8255
              MOV       AL,AH
              OR        AL,0F0H
              OUT       DX,AL
              IN        AL,DX       ;读列扫描值
              AND       AL,0F0H
              CMP       AL,0F0H
              JZ        KEY1        ;未发现有键按下则转
    
              MOV       SI,OFFSET TABLE1        ;键盘扫描码表首址
              MOV       DI,OFFSET CHAR          ;字符表首址
              MOV       CX,16       ;待查表的表大小
 KEY_TONEXT:
              CMP       AX,[SI]
              JZ        KEY_FINDKEY
              DEC       CX
              JZ        KEY1        ;未找到对应扫描码
              ADD       SI,2
              INC       DI
              JMP       KEY_TONEXT
            KEY_FINDKEY:
              MOV       DL,[DI]
              MOV       AH,02
              INT       21H         ;显示查找到的键盘码
              MOV       BYTE PTR KEY_IN,DL
 KEY_WAITUP:
              MOV       DX,K8255
              MOV       AL,81H
              OUT       DX,AL
              MOV       DX,C8255
              MOV       AL,0FH
              OUT       DX,AL
              IN        AL,DX       ;读行扫描值
              AND       AL,0FH
              CMP       AL,0FH
              JNZ       KEY_WAITUP  ;按键未抬起转
              CALL      DELAY       ;等待
       KEY1:  RET
         KEY  ENDP
       DELAY  PROC      NEAR
              PUSH      AX          ;延时 50ms--100ms
              PUSHF
              MOV       AH,0
              INT       1AH
              MOV       BX,DX
     DELAY1:
              MOV       AH,0
              INT       1AH
              CMP       BX,DX
              JZ        DELAY1
              MOV       BX,DX
     DELAY2:
              MOV       AH,0
              INT       1AH
              CMP       BX,DX
              JZ        DELAY2
              POPF
              POP       AX
              RET
       DELAY  ENDP
      DISPLY  PROC      NEAR
              PUSH      AX
              MOV       BX,OFFSET LED
              MOV       AL,BYTE PTR KEY_IN
              SUB       AL,30H
              CMP       AL,09H
              JNG       DIS2
              SUB       AL,07H
       DIS2:  XLAT
              MOV       DX,A8255
              OUT       DX,AL       ;输出显示数据,段码
              MOV       AL,0FFH
              MOV       DX,B8255
              MOV       CX,0006     ;段码显示,6位
    DISPLY1:
              OUT       DX,AL       ;输出显示数据,位码,打开显示
              PUSH      CX
              MOV       CX,0A000H   ;显示时间延迟
           DISPLY_DELAY:
              LOOP      DISPLY_DELAY
              POP       CX
              LOOP      DISPLY1
              POP       AX
              RET
      DISPLY  ENDP
        CODE  ENDS
              END       START

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现想法: 1、先在STM8S003上试验。 2、使用STM32F103RBT6作主控芯片。 3、将下载器配置成U盘,初步定在8M。用于存储hex,和s19文件。 4、2.4寸的液晶屏。 5、再移植个emwin,如果内容充足再移植个ucos. 改版后实现功能: 1、电路上增加蜂鸣器。 2、W25Q64使用硬件SPI 3、可编程输出电压 4、将STM32F103RBT6换成RCT6增加到48K的RAM和256K的FLASH. 5、软件上实现器件可选 6、设置管理员身份。可禁止和使用U盘、设置烧写次数、加载烧写文件等功能 7、支持EEPROM的擦出和烧写。 最终实现功能: 编程器没有实现EEPROM的擦除,也没实现可编程电压输出。 编程器分两种模式,一个烧录模式,一个管理员模式。 开机不用输入密码直接按ex键进入烧录模式,此模式下setting键无效。即无法设置。只能烧写,烧录完设定好的次数后无法正常烧写。 开机时输入正确密码按OK键进入管理员模式,setting键有效,可以选择烧录文件、芯片型号、是否使能USB,修改密码和该烧录文件的烧写总次数。 在主界面上显示了USB的状态,电压状态(未实现),烧录总次数、本次开机后烧录的次数,选择是否擦除eeprom(未实现)是否擦除FLASH后编程(理该上应该勾选上),及状态显示,和开始按键。 演示视频: 电路城语:此资料为卖家免费分享,不提供技术支持,请大家使用前验证资料的正确性!如涉及版权问题,请联系管理员删除! 附件包以下资料:
抱歉,我无法为您提供完整的微型计算机实验代码。但我可以给您提供一些关于数据传送的微型计算机实验1的基本知识。 数据传送指的是将数据从一个地方传送到另一个地方。在微型计算机中,数据传送分为两种类型:内部数据传送和外部数据传送。 内部数据传送是指数据在微处理器内部传送,例如从寄存器到寄存器或从寄存器到内存。外部数据传送是指数据在微处理器和外部设备(如输入/输出设备、存储器等)之间传送。 在微型计算机实验1中,您需要了解以下内容: 1. 内部数据传送的指令和操作码 2. 外部数据传送的指令和操作码 3. 内存地址的编码方法 4. 数据传送的实现方法 在数据传送实验中,您需要编写程序来实现将数据从一个位置传送到另一个位置。此外,您还需要使用微型计算机实验箱中的设备(如键盘、显示器等)来进行输入和输出。 下面是一个简单的数据传送实验示例代码: ``` ORG 100H ;程序起始地址 MOV AX, 1234H ;将数据1234H存放到AX寄存器中 MOV BX, AX ;将AX寄存器中的数据传送到BX寄存器中 MOV CX, 5678H ;将数据5678H存放到CX寄存器中 MOV [1000H], CX ;将CX寄存器中的数据传送到内存地址1000H中 MOV DX, [2000H] ;将内存地址2000H中的数据传送到DX寄存器中 HLT ;程序结束 ``` 在上面的示例代码中,我们使用了MOV指令来实现数据传送。MOV指令用于将数据从一个位置传送到另一个位置。在这个例子中,我们将数据存放到寄存器和内存中,并将数据从内存中传送到寄存器中。 在编写完代码后,您需要使用微型计算机实验箱来进行编译和运行。在运行程序时,您需要在键盘上输入数据,并在显示器上查看输出结果。 希望这些信息对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值