找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2538|回復(fù): 2
收起左側(cè)

標(biāo)題題目和程序都有,就是看不懂

[復(fù)制鏈接]
ID:366458 發(fā)表于 2018-7-7 09:14 來(lái)自觸屏版 | 顯示全部樓層 |閱讀模式
  利用實(shí)驗(yàn)箱所帶小鍵盤(pán),加上一個(gè)開(kāi)關(guān)作為功能選項(xiàng)鍵,實(shí)現(xiàn)A-H八個(gè)大寫(xiě)母,以 及 a-h 八個(gè)小寫(xiě)字母的輸入掃描程序,利用另一個(gè)開(kāi)關(guān)模擬回車(chē)鍵,讓所輸入的字 母顯示在七段數(shù)碼管顯示器上。
;********************;
;* 8255薄膜按鍵實(shí)驗(yàn) *;
;********************;
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    ;鍵盤(pán)掃描碼表
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                   ;把數(shù)據(jù)放在數(shù)據(jù)段寄存器
        mov ax,stacks
        mov ss,ax                   ;把堆棧放在堆棧段
        MOV DX,k8255                ;初始化8255控制字
        mov al,81h                  ;設(shè)置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 ;預(yù)備點(diǎn)亮第一個(gè)數(shù)碼管,并且控制循環(huán)次數(shù)
        MOV DI ,OFFSET NUM           ;取num偏移地址
BBB:         MOV DX,b8255   
        MOV  AL,bh
        OUT DX,AL                   ;點(diǎn)亮數(shù)碼管
        ROL BH,1                    ;準(zhǔn)備點(diǎn)亮下一個(gè)
        MOV DX,a8255
        MOV AL,[di]                 
        OUT DX,AL                   ;依次將得到的字符輸出
        inc di           
       

push cx
          mov cx,100                 
ddd:    loop ddd                  ;延時(shí)
          pop cx
        DEC BL                    
        CMP BL,0
        JZ CCC                    ;是否已經(jīng)全部輸出,如果是則重新輸出
        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                 ;未發(fā)現(xiàn)有鍵按下則轉(zhuǎn)
        call delay                  ;delay for amoment
        mov ah,al                   ;將行狀態(tài)保存
        MOV DX,k8255                  
        mov al,88h                  
        out dx,al                    ;設(shè)置工作狀態(tài)高四位輸入
        mov dx,c8255
        mov al,ah
        or al,0f0h
        out dx,al                   ;對(duì)列進(jìn)行清除
        in al,dx                    ;讀列掃描值
        and al,0f0h
        cmp al,0f0h
        jz key_loop                 ;未發(fā)現(xiàn)有鍵按下則轉(zhuǎn)
        
        mov si,offset table1        ;鍵盤(pán)掃描碼表首址
        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                 ;未找到對(duì)應(yīng)掃描碼
        add si,2
        inc di         
        jmp key_tonext
key_findkey:
        mov dl,[di]
        mov ah,02
        int 21h                    ;顯示查找到的鍵盤(pán)碼
        mov byte ptr key_in,dl     ;字符進(jìn)行另一個(gè)命名
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            ;按鍵未抬起轉(zhuǎn)
        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


這個(gè)程序誰(shuí)能看懂?求求大的很幫我注釋一下每一步的作用。萬(wàn)分感謝
回復(fù)

使用道具 舉報(bào)

ID:366458 發(fā)表于 2018-7-7 10:09 來(lái)自觸屏版 | 顯示全部樓層
大佬們告訴我一下吧
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2018-7-7 16:02 | 顯示全部樓層
上面不是有注釋嗎?你看不懂說(shuō)明你學(xué)習(xí)不到家,……自己認(rèn)真學(xué)習(xí)。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表