找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2186|回复: 2
收起左侧

标题题目和程序都有,就是看不懂

[复制链接]
ID:366458 发表于 2018-7-7 09:14 来自手机 | 显示全部楼层 |阅读模式
  利用实验箱所带小键盘,加上一个开关作为功能选项键,实现A-H八个大写母,以 及 a-h 八个小写字母的输入扫描程序,利用另一个开关模拟回车键,让所输入的字 母显示在七段数码管显示器上。
;********************;
;* 8255薄膜按键实验 *;
;********************;
a8255        equ 288H    ;8255 A口   
b8255        equ 289H
c8255        equ 28aH    ;8255 C口
k8255        equ 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 67H,74H,5cH,7cH,58H,5eH,7bH,71H,7DH,76H,77H,7FH
           DB 39h,3FH,79h,71h,0ffh   ;LED段码表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
char  db '01234567?@ABCDEF'                    ;字符表
NUM DB 8 DUP(0)
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
        mov ds,ax
        mov es,ax                   ;把数据放在数据段寄存器
        mov ax,stacks
        mov ss,ax                   ;把堆栈放在堆栈段
        MOV DX,k8255                ;初始化8255控制字
        mov al,81h                  ;设置c端口低四位输入,a,b输出,0工作方式
        out dx,al
        MOV    BX,0      
main_key:
        call key  
  cmp byte ptr key_in,'1'     
        jz dis1  
  cmp byte ptr key_in,'2'     
        jz dis2

dis1:    call key
cmp byte ptr key_in, '0'
jz bbb
PUSH BX                     
            MOV BX,OFFSET LED
            MOV AL,byte ptr key_in
      SUB al,30h
      CMP al,09h
      JNG  DIS2
       SUB al,07h   
sub al,8
XLAT                        
        POP BX
        MOV NUM+BX,AL               
        INC BX
        CMP BX,8                    
        JB  dis1
        jmp ccc                 
DIS2:  call key
cmp byte ptr key_in, '0'
jz bbb
PUSH BX                     
            MOV BX,OFFSET LED
            MOV AL,byte ptr key_in
      SUB al,30h
      CMP al,09h
      JNG  DIS2
       SUB al,07h
     XLAT                        
        POP BX
        MOV NUM+BX,AL               
        INC BX
        CMP BX,8                    
        JB  dis2
                    


CCC:  MOV BX,0FE08H  ;BH=0FE  BL=08 ;预备点亮第一个数码管,并且控制循环次数
        MOV DI ,OFFSET NUM           ;取num偏移地址
BBB:         MOV DX,b8255   
        MOV  AL,bh
        OUT DX,AL                   ;点亮数码管
        ROL BH,1                    ;准备点亮下一个
        MOV DX,a8255
        MOV AL,[di]                 
        OUT DX,AL                   ;依次将得到的字符输出
        inc di           
       

push cx
          mov cx,100                 
ddd:    loop ddd                  ;延时
          pop cx
        DEC BL                    
        CMP BL,0
        JZ CCC                    ;是否已经全部输出,如果是则重新输出
        JMP BBB
           
       ; mov ax,4c00h         
        ;int 21h                 
key proc near

key_loop:   
        mov dx,c8255
        mov al,0fh            
        out dx,al                   ;清除输入端口的值
        in al,dx                    ;读行扫描值
        and al,0fh
        cmp al,0fh                  ;判断是否按下
        jz key_loop                 ;未发现有键按下则转
        call delay                  ;delay for amoment
        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 key_loop                 ;未发现有键按下则转
        
        mov si,offset table1        ;键盘扫描码表首址
        mov di,offset char          ;字符表首址
        mov cx,16                   ;待查表的表大小
key_tonext:
        cmp ax,[si]                 ;cmp (col,row) with every word
        jz key_findkey              ;in the table
        dec cx
        jz key_loop                 ;未找到对应扫描码
        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                 ;消抖
        ret
;exit:        mov byte ptr key_in,'E'
        ret
key endp
delay proc near
       push cx
       mov  cx,0ffffh
delay1:
       loop delay1
       pop  cx
       ret
delay endp
code ends
end start


这个程序谁能看懂?求求大的很帮我注释一下每一步的作用。万分感谢
回复

使用道具 举报

ID:366458 发表于 2018-7-7 10:09 来自手机 | 显示全部楼层
大佬们告诉我一下吧
回复

使用道具 举报

ID:7485 发表于 2018-7-7 16:02 | 显示全部楼层
上面不是有注释吗?你看不懂说明你学习不到家,……自己认真学习。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表