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

📄 led.asm

📁 windows32 汇编 8255数码管实验
💻 ASM
字号:
.386
.model flat, stdcall
option casemap:none

include        windows.inc
include        user32.inc
includelib     user32.lib
include        kernel32.inc
includelib     kernel32.lib

IDD_DIALOG     equ    101
IDE_DISPLAY    equ    1000
IDB_GO         equ    1001
IDB_STOP       equ    1002
 
.data
ThreadID       dd     01h
szFormat       db     '%04d', 0
szBuffer       db     5 dup(0)     
ledTable       db     0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 98h, 0
displayTable   db     5 dup(0)
addrBase       dw     0a400h
addrPaOffset   dw     00h
addrPbOffset   dw     01h
addrCnOffset   dw     03h

.data?
displayData    dw     ?
hThread	       dd     ?
Thread_Exe     db     ?
hDlg           dd     ?
displayNum     db     ?
index          db     ?
saveAl         db     ?

.code
getBcdNum proc
	mov ecx, 4
	.while ecx
		dec ecx
		mov al, szBuffer[ecx]
		and al, 0fh
		lea ebx, ledTable
		xlat
		mov displayTable[ecx], al
	.endw
	ret
getBcdNum endp

ledDisplay proc
	mov al, 80h
	mov dx, addrBase
	add dx, addrCnOffset
	out dx, al
	mov displayNum, 30
	.while displayNum
		mov index, 0
		mov saveAl, 0f7h		
		.while index < 4
			mov al, index
			lea ebx, displayTable
			xlat
			mov dx, addrBase
			add dx, addrPaOffset
			out dx, al
			mov al, saveAl
			ror saveAl, 1
			mov dx, addrBase
			add dx, addrPbOffset
			out dx, al
			invoke Sleep, 5
			inc index
		.endw
		dec displayNum
	.endw
	mov al, 0ffh
	mov dx, addrBase
	add dx, addrPbOffset
	out dx, al
	ret
ledDisplay endp

displayThread proc
	.while Thread_Exe
		xor eax, eax
		mov ax, displayData
		invoke wsprintf, addr szBuffer, addr szFormat, eax
		invoke SetDlgItemText, hDlg, IDE_DISPLAY, addr szBuffer 
		invoke getBcdNum
		invoke ledDisplay
		inc displayData
		.if displayData == 10000
			mov displayData, 0
		.endif
	.endw
	ret
displayThread endp

DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	.if uMsg == WM_INITDIALOG
		invoke GetDlgItem, hWnd, IDB_GO
		invoke EnableWindow, eax, TRUE
		invoke GetDlgItem, hWnd, IDB_STOP
		invoke EnableWindow, eax, TRUE
		mov eax, hWnd
		mov hDlg, eax
	.elseif uMsg == WM_COMMAND
		mov eax, wParam
		.if ax == IDB_GO
			invoke GetDlgItem, hWnd, IDB_GO
			invoke EnableWindow, eax, FALSE
			invoke GetDlgItem, hWnd, IDB_STOP
			invoke EnableWindow, eax, TRUE
			mov displayData, 0
			mov Thread_Exe, 01h			
			invoke CreateThread, NULL, 0, addr displayThread, NULL, NULL, addr ThreadID
			.if eax
				mov hThread, eax
				invoke CloseHandle, eax
			.endif
		.elseif ax == IDB_STOP
			invoke GetDlgItem, hWnd, IDB_GO
			invoke EnableWindow, eax, TRUE
			invoke GetDlgItem, hWnd, IDB_STOP
			invoke EnableWindow, eax, FALSE
			mov Thread_Exe, 00h
			invoke SetDlgItemText, hWnd, IDE_DISPLAY, NULL  
		.endif
	.elseif uMsg == WM_CLOSE
		invoke EndDialog, hWnd, NULL 
	.else
		mov eax, FALSE
		ret
	.endif
	mov eax, TRUE
	ret
DlgProc endp

start:
invoke GetModuleHandle, NULL
invoke DialogBoxParam, eax, IDD_DIALOG, NULL, DlgProc, NULL
invoke ExitProcess, NULL
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -