|
原創的西電微機原理實驗 包括匯編源文件和對應的Proteus仿真電路 可以直接在電腦上運行仿真 完成的功能與要求在實驗板上完成的功能一樣
0.png (58.75 KB, 下載次數: 110)
下載附件
2016-3-14 15:54 上傳
1.png (77.04 KB, 下載次數: 90)
下載附件
2016-3-14 15:54 上傳
- ;各種地址
- nCS5 EQU 0DE28H
- PA8255 EQU nCS5+0
- PB8255 EQU nCS5+2
- PC8255 EQU nCS5+4
- CTL8255 EQU nCS5+6
- DISPBUFF EQU 3000H
- ;按鍵抖動時間
- KeyShock EQU 06FFFH
-
- DATAS SEGMENT
- ;此處輸入數據段代碼
- ;數碼管段碼 0 1 2 3 4 5 6 7 8 9 A B C D E F
- SegCode DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
- ;矩陣鍵盤按鍵碼 0 1 2 3 4 5 6 7 8 9 A B C D E F
- KeyCode DB 11H,21H,41H,81H,12H,22H,42H,82H,14H,24H,44H,84H,18H,28H,48H,88H
- DATAS ENDS
- STACKS SEGMENT
- ;此處輸入堆棧段代碼
- STACKS ENDS
- CODES SEGMENT
- ASSUME CS:CODES,DS:DATAS,SS:STACKS
- START:
- MOV AX,DATAS
- MOV DS,AX
- ;將8086控制總線拉到確定電平
- MOV DX,00H
- OUT DX,AL
- IN AL,DX
- ;此處輸入代碼段代碼
-
- ;初始化數碼管顯示緩沖區
- InitBuff:
- MOV SI,DISPBUFF
- MOV CX,4
- Loop1:
- MOV [SI],CL
- INC SI
- LOOP Loop1
-
-
-
- ;主函數...
- MOV DI,03H
-
- Loop3:
- CALL Disp
- CALL MatrixKeyboard
- JMP Loop3
-
- ;矩陣鍵盤掃描子函數
- MatrixKeyboard PROC
- Begin:
- ;初始化8255控制字
- MOV DX,nCS5 + 6
- MOV AL,10001000B ;PC高4位作鍵盤掃描列信號,PC低4位作鍵盤掃描行信號
- OUT DX,AL
-
- Scan:
- ;PC口
- MOV DX,nCS5 + 4 ;PC行掃描給出全低電平
- MOV AL,00H
- OUT DX,AL
- WaitKey:
- IN AL,DX ;讀出PC列掃描電平
- AND AL,0F0H ;去除低4位,保留高4位
- CMP AL,0F0H ;將得到的列電平和F0H比較,如果相等說明列線全高,沒有按鍵按下
- JZ ExtiKeyboard ;如果沒有按鍵按下,直接返回
-
- MOV CX,KeyShock ;如果有按鍵按下,先延時一會,去抖動
- LOOP $
- ;開始正反向掃描
- IN AL,DX ;讀取列值
- AND AL,0F0H
- CMP AL,0F0H
- JZ ExtiKeyboard ;如果再次讀到的結果是高電平,表明前次按下是抖動,不予理會
- MOV CL,AL ;如果確實有按鍵按下則記錄列地址
-
- MOV DX,nCS5 + 6 ;重新設置控制字
- MOV AL,10000001B ;PC行列翻轉,高4位做鍵盤掃描行信號,低4為作鍵盤掃描行信號
- OUT DX,AL
-
- MOV DX,nCS5 + 4 ;PC行掃描給出全低電平
- MOV AL,00H
- OUT DX,AL
-
- IN AL,DX
- AND AL,0FH ;取低4位
- OR AL,CL ;將正向和反向的合成按鍵碼
-
- MOV BX,OFFSET KeyCode
- MOV SI,00H
- NOT AL ;AL取反,完全只是為了計算按鍵碼方便
-
- ScanKey:
- CMP AL,[BX][SI] ;將讀到的鍵碼和鍵碼表比較
- JE FindKey ;如果相等(找到),調到找到處理部分
- INC SI ;如果不相等,再跟下一個比較
- CMP SI,10H
- JZ Begin ;找到第16個還沒找到表示按鍵非法,重新從頭開始掃描
- JMP ScanKey ;與鍵碼表中下一個鍵碼比較
- FindKey:
- CALL PutBuff
- ;MOV BX,DISPBUFF
- ;MOV [BX],SI
- ExtiKeyboard:
- RET
- MatrixKeyboard ENDP
- PutBuff PROC
-
- MOV BX,DISPBUFF
- ADD BX,DI
-
- MOV AX,SI
- MOV [BX],AL
- DEC DI
- JNC Finish
- MOV DI,03H
- Finish:
- RET
- PutBUff ENDP
-
- ;數碼管顯示子函數
- Disp PROC
- MOV SI,DISPBUFF
- MOV CL,0FEH
-
- Loop2:
- MOV AL,CL
- MOV DX,PB8255 ;位選
- OUT DX,AL
-
- MOV BX,OFFSET SegCode
- MOV AX,0
- MOV AL,[SI]
- ADD BX,AX
- MOV AL,[BX]
- MOV DX,PA8255
- OUT DX,AL
-
- CALL DelayMs
- CALL ClearDig
-
- CMP CL,0F7H ;判斷有沒有一遍掃完
- JZ ExitDisp
-
- INC SI
- ROL CL,1
-
- JMP Loop2
-
- ExitDisp:
- RET
- DISP ENDP
- ;清除數碼管顯示子函數
- ClearDig PROC
- MOV DX,PA8255
- MOV AL,00H
- OUT DX,AL
- RET
- ClearDig ENDP
- ;延時子函數
- DelayMs PROC
- PUSH AX ;保護原先的寄存器內容
- PUSH BX
-
- MOV AX,00FFH
- L2: MOV BX,000FH
- L3: DEC BX
- JNZ L3
- DEC AX
- JNZ L2
-
- POP BX ;恢復原先的寄存器內容,注意這里的彈棧順序
- POP AX
-
- RET
- DelayMs ENDP
-
- ;收尾工作
- JMP $
- MOV AH,4CH
- INT 21H
- CODES ENDS
- END START
復制代碼
|
-
-
微機原理實驗.rar
2016-3-14 15:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
413.35 KB, 下載次數: 53, 下載積分: 黑幣 -5
|