主题:[讨论]请达人给指下路,谢谢(30分)
zhoudavid
[专家分:240] 发布于 2006-06-09 01:37:00
学了一个学期的汇编,也就完整的编过两次程序,现在要写个项目,求达人给指下路。
我考虑是不是可以写个什么USB或者摄像头或者是键盘的驱动玩玩....
谢谢,再拜达人
(30分)
回复列表 (共2个回复)
沙发
chenzep [专家分:3640] 发布于 2006-06-09 15:27:00
送一段键盘驱动处理程序给你~端口级的,我不会进行解说,有空自己看一下计算机接口技术的书。
PUSHA
PUSH DS
PUSH ES
XOR CX,CX
KEY_READ_LOOP:
IN AL,64H
JMP $+2
JMP $+2
TEST AL,1
JNZ KEY_READ_READY
LOOP KEY_READ_LOOP
MOV AH,1
JMP KEY_READ_EXIT
KEY_READ_READY:
PUSH CX
MOV CX,16
KEY_READ_DELAY:
JMP $+2
JMP $+2
LOOP KEY_READ_DELAY
POP CX
IN AL,60H
XOR AH,AH
KEY_READ_EXIT:
CMP AH,1
JNZ SCAN_TO_ASCII
MOV BX,V_DATA_SEL
MOV DS,BX
MOV BX,VRAM_SEL
MOV ES,BX
MOV SI,OFFSET KEY_ERR
XOR DI,DI
MOV AH,01FH
LODSB
.WHILE AL!=0
STOSW
LODSB
.ENDW
JMP INT69H_EXIT
SCAN_TO_ASCII:
MOV BX,KEYROM_SEL
MOV ES,BX
MOV DS,BX
MOV AH,AL ;扫描码送入AH
AND AL,7FH ;最高位表示键盘是否按下
MOV DI,0E87EH
MOV CX,08
REPNZ SCASB
MOV AL,AH ;检查是否是换档键,恢复扫描码
JZ SHIFT_key
TEST AL,80H ;如果是放开键盘,也不处理
JNZ INT69H_EXIT
CMP AL,39H ;处理空格
JZ SPACE_SCAN
CMP AL,53
JA INT69H_EXIT ;如果不是标准的几个字符,不处理.
MOV BX,0E8E5H
XLAT ;获得ASCII值
WRITE_BOIS:
MOV BX,BOIS_DATA_SEL
MOV DS,BX
MOV BX,DS:[1AH] ;BUF的头指针相对于BOIS数据区起始位置的偏移
MOV CX,DS:[1CH] ;BUF的尾指针相对于BOIS数据区起始位置的偏移
MOV SI,CX
.IF CX==3CH ;如果到了BUF的最后面,移动到BUF的前面
MOV CX,1EH
.ELSE
ADD CX,2
.ENDIF
CMP BX,CX
JZ INT69H_EXIT ;如果缓冲区满,不接受新的字符
MOV DS:[SI],AX ;保存ASCII和扫描码到BUF,这里不能先保存AX在移动尾指针
MOV DS:[1CH],CX ;保存尾指针
JMP INT69H_EXIT
SHIFT_key:
JMP INT69H_EXIT ;这里不处理换挡键
SPACE_SCAN:
MOV AL,' '
JMP WRITE_BOIS
INT69H_EXIT:
MOV AL,20H
OUT 20H,AL
POP ES
POP DS
POPA
IRETD
板凳
zhoudavid [专家分:240] 发布于 2006-06-09 15:50:00
感激涕零,谢谢
我来回复