?? 8255_kb.asm
字號:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 8255小鍵盤實驗,缺省連線
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.386
.model flat, stdcall
option casemap:none
;**************頭文件和導(dǎo)入庫文件****************************
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;**************equ******************************
IDD_DIALOG1 equ 102
IDC_CHAR equ 1001
IDC_STOP equ 3
;**************data?****************************
.data
wIO_Base2 dw 0A400H ; IO address 2
w8255_OFFSET dw 0
Failure db '創(chuàng)建線程失敗!',0
Col_Num db -1,0,1,-1,2,-1,-1,-1,3,7 dup(-1)
Char_Table db '048C159D26AE37BF',0
ShowChar db 0,0
.data?
w8255_PA dw ?
w8255_PB dw ?
w8255_PC dw ?
w8255_CTRL dw ?
hDlg dd ?
ThreadID dd ?
hThread dd ?
nRet dd ?
;**************代碼段****************************
.code
;=============================================================
;行掃描法識別按鍵,掃描一遍(0~3行)
;當(dāng)有鍵按下時,在al中返回按下鍵對應(yīng)的字符ASCII碼
;當(dāng)無鍵按下時,在al中返回0
;=============================================================
LScan_KeyBoard proc
Local Line_Init:BYTE
mov Line_Init,00000001B
;----某一行送1,其余行送0-----
mov cl,0
.while (cl<4)
mov dx,w8255_PC
mov al,Line_Init
out dx,al
nop
in al,dx
and al,0F0H
.if (al==0);---無鍵按下,則掃描下一行---
rol Line_Init,1
inc cl
.else ;---有鍵按下---
shr al,4
lea ebx,Col_Num ;---查表求列號(0~3),在al中---
xlat
mov ah,cl ;====ah中為行號,al中為列號====
;====計算位置號:行號*4+列號====
shl ah,2
add al,ah
;====查表得出位置號所對應(yīng)的字符====
lea ebx,Char_Table
xlat
.break ;===當(dāng)有鍵按下退出循環(huán)時,在al中返回按下鍵對應(yīng)的字符ASCII碼===
.endif
.endw
.if (cl==4) ;===當(dāng)無鍵按下退出循環(huán)時,在al中返回0===
mov al,0
.endif
ret
LScan_KeyBoard endp
Scan_Thread proc
@@:invoke LScan_KeyBoard
.if al!=0 ;表明有鍵按下,al中為按下鍵的ASCII碼
mov ShowChar,al
invoke SetDlgItemText,hDlg,IDC_CHAR,addr ShowChar;顯示字符
.endif
jmp @B ;循環(huán)掃描
ret
Scan_Thread endp
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_INITDIALOG
push hWnd
pop hDlg
;-------計算8255端口地址-------
mov ax,wIO_Base2
add ax,w8255_OFFSET
mov w8255_PA,ax
inc ax
mov w8255_PB,ax
inc ax
mov w8255_PC,ax
inc ax
mov w8255_CTRL,ax
;------初始化8255,行掃描法:PC口高位(列值)輸入,低位(行值)輸出----
mov dx,w8255_CTRL
mov al,10001000B
out dx,al
;-------使“停止掃描”按鈕無效--------
invoke GetDlgItem,hWnd,IDC_STOP
invoke EnableWindow,eax,FALSE
.elseif uMsg == WM_CLOSE
invoke TerminateThread, hThread, 0
invoke EndDialog, hWnd,NULL
.elseif uMsg == WM_COMMAND
mov eax, wParam
.if ax == IDOK
;------------------------------------------------
; 當(dāng)按下該按鈕后,創(chuàng)建一個線程,用于掃描小鍵盤
;------------------------------------------------
invoke CreateThread, NULL, 0, addr Scan_Thread, NULL, NULL, addr ThreadID
.if eax
mov hThread, eax
;-------使“開始掃描”按鈕無效--------
invoke GetDlgItem,hWnd,IDOK
invoke EnableWindow,eax,FALSE
;-------使“停止掃描”按鈕有效--------
invoke GetDlgItem,hWnd,IDC_STOP
invoke EnableWindow,eax,TRUE
.else
invoke MessageBox, NULL, addr Failure, addr Failure, MB_OK
.endif
.elseif ax == IDC_STOP
;------------------------------
;停止掃描,中止掃描線程
;-------------------------------
invoke TerminateThread, hThread, 0
;-------使“停止掃描”按鈕無效--------
invoke GetDlgItem,hWnd,IDC_STOP
invoke EnableWindow,eax,FALSE
;-------使“開始掃描”按鈕有效--------
invoke GetDlgItem,hWnd,IDOK
invoke EnableWindow,eax,TRUE
.elseif ax == IDCANCEL
invoke TerminateThread, hThread, 0
invoke EndDialog, hWnd, NULL
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
;====================================================================
start:
invoke GetModuleHandle, NULL
invoke DialogBoxParam, eax, IDD_DIALOG1, NULL, DlgProc, NULL
invoke ExitProcess, NULL
end start
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -