PDA

View Full Version : حرکت مکان نما با صفحه کلید



mohsen4707
چهارشنبه 22 آذر 1391, 18:20 عصر
باسلام.
بنده می خواهم یه برنامه ای بنویسم که با دکمه های صفحه کلید مکان نما را حرکت بدهم. چطور دکمه های بالا ،پایین،چپ وراست را تشخیص بدهم و برای هربار حرکت باید چطور صفحه نمایش را پاک کنم و در صفحه جدید موقیت جدید را بهش بدهم. باتشکر

shahmohammadi
جمعه 24 آذر 1391, 16:14 عصر
سلام.

چطور دکمه های بالا ،پایین،چپ وراست را تشخیص بدهم
كليدهايي مثل بالا، پايين، چپ و راست براي خودشون كد اسكن دارند. كد اسكن دوبايت هست كه يكيش 0‌ ﻪ.
وقتي از زيروقفه‌ي‌ 1 يا 8 ازوقفه‌ي 21 استفاده كنيد، كامپيوتر منتظر فشردن كليد مي‌شه. اگر كليد كد اسكي داشته باشه (مثل حروف تايپي، اينتر، فاصله، اسكيپ) كد اسكي كليد در al مي‌گيره. اگر طرف كليدهاي‌كداسكن‌دار رو زده باشه مقدار al مي‌شه 0. برنامه باديدن صفر مي فهمه كه اون كليد ها فشرده شدند. اگر دوباره اين توابع رو صدا بزنيم آنگاه كد اسكن اون كليدي كه در دفعه‌ي اول فشره شده مي ره توي Al.
تفاوت اين دو زير وقفه در اينجاست كه زيروقفه‌ي 1 كاراكتر خوانده شده رو در صفحه نمايش نشون مي‌ده ولي 8 نمايش نمي‌ده و براي مثال شما مناسب‌تر هست.

براي بقيه سوالاتون از وقفه هاي زير استفاده كنيد:
خواندن موقعيت فعلي مكان نما: تابع 3 از وقفه‌ي 10h.
رفتن به موقيعتي از صفحه: تابع 2 از وقفه‌ي 10h.

shahmohammadi
جمعه 24 آذر 1391, 16:53 عصر
اين هم يك مثال از تشخيص كليد هاي مكان‌نما:
;detect arrow keys
;masm used fo assemble

dsg segment para public 'data'
msgUpp db "Upp key pressed", "$"
msgLeft db "Left key presed", "$"
msgRight db "Right key pressed", "$"
msgDown db "Down key Pressed", "$"
dsg ends

ssg segment para stack 'stack'
dw 100 dup(?)
ssg ends

csg segment para public 'code'
main proc far
assume cs:csg,ds:dsg,ss:ssg,es:nothing
push ds
sub ax,ax
push ax
mov ax,dsg
mov ds,ax
mov ah,00
int 16h

cmp al,0
jnz EndIf
cmp ah,72
jnz NotUpp
mov AX,dsg
mov DS,AX
mov AH,09
lea DX,msgUpp
int 21h
jmp EndIf
NotUpp:

cmp ah,77
jnz NotRight
mov AX,dsg
mov DS,AX
mov AH,09
lea DX,msgRight
int 21h
jmp EndIf
NotRight:

cmp ah,75
jnz NotLeft
mov AX,dsg
mov DS,AX
mov AH,09
lea DX,msgLeft
int 21h
jmp EndIf
NotLeft:

cmp ah,80
jnz EndIf
mov AX,dsg
mov DS,AX
mov AH,09
lea DX,msgDown
int 21h

EndIf:
mov ah,01
int 21h ;getch() return will be the character in al
ret
main endp
csg ends
end main

mahnaz_s
پنج شنبه 07 دی 1391, 19:41 عصر
ببخشید منظورتون از تابع3 از وقفه 10hوتابع 2 از وقفه 10h چیه چون من دانشجوی ترم اول نرم افزار هستم و اصلا از برنامه بالا چیزی نفهمیدم اگه بیشتر توضیح بدین ممنون میشم .