⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tc8253.asm

📁 windows32 汇编 8253IO实验
💻 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 + -