📄 led.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 + -