📄 tc8253.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 模式对话框程序实例
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.386
.model flat, stdcall
option casemap:none
;**************头文件和导入库文件****************************
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;**************equ******************************
IDD_DIALOG_MML equ 101
IDC_BUTTON_CNT equ 1005
IDC_BUTTON_EXIT equ 1006
IDC_EDIT equ 1007
.const
wIO_Base dw 0A400H ; IO address 2
w8253_Offset dw 20H
CounterNum db 10;计数初值
;**************data?****************************
.data?
w8253Port_CTRL dw ?
w8253Port_TC0 dw ?
w8253Port_TC1 dw ?
w8253Port_TC2 dw ?
hDlg dd ?
iGetTCValue dd ?
bCurrentCNT db ?
;**************代码段****************************
.code
_GetTCValue proc hWnd, uMsg, idEvent, dwTime
pushad
;---------发送计数器0的锁存命令-------
mov dx,w8253Port_CTRL
mov al,11000010B
out dx,al
;---------读取设置计数器0的状态-------
mov dx,w8253Port_TC0
in al,dx
and al,01000000B
.if al==0 ;当为有效计数值时
;---------读取设置计数器0的当前计数值-------
in al,dx
mov bCurrentCNT,al
movzx eax,al
invoke SetDlgItemInt,hDlg ,IDC_EDIT,eax,FALSE
.if bCurrentCNT==0 ;当计数值为0时
invoke SendMessage,hDlg,WM_USER,NULL,NULL
.endif
.endif
popad
ret
_GetTCValue endp
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_INITDIALOG
;---------------
; 初始化
;---------------
push hWnd
pop hDlg
;----计算8253的各端口地址-----
mov dx, wIO_Base
add dx, w8253_Offset
mov w8253Port_TC0,dx
inc dx
mov w8253Port_TC1,dx
inc dx
mov w8253Port_TC2,dx
inc dx
mov w8253Port_CTRL,dx
.elseif uMsg == WM_CLOSE
invoke EndDialog, hWnd,NULL
.elseif uMsg == WM_COMMAND
mov eax, wParam
.if ax == IDC_BUTTON_CNT
;---------设置计数器0的工作方式-------
mov dx,w8253Port_CTRL
mov al,00010000B
out dx,al
;---------设置计数器0的初值-------
mov dx,w8253Port_TC0
mov al,CounterNum
out dx,al ;送低字节
;--------------------------------------------
; 设置一个计数器,用于定时(0.25s)
;--------------------------------------------
invoke SetTimer, NULL, NULL,250, addr _GetTCValue
mov iGetTCValue, eax
;-------使“开始计数”按钮无效--------
invoke GetDlgItem,hWnd,IDC_BUTTON_CNT
invoke EnableWindow,eax,FALSE
.elseif ax == IDC_BUTTON_EXIT
invoke KillTimer, NULL, iGetTCValue
invoke EndDialog, hWnd,NULL
.endif
.elseif uMsg == WM_USER
;-------撤销定时器-------
invoke KillTimer, NULL, iGetTCValue
;-------使能“开始计数”按钮--------
invoke GetDlgItem,hWnd,IDC_BUTTON_CNT
invoke EnableWindow,eax,TRUE
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
;====================================================================
start:
invoke GetModuleHandle, NULL
invoke DialogBoxParam, eax, IDD_DIALOG_MML, NULL, DlgProc, NULL
invoke ExitProcess, NULL
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -