回 帖 发 新 帖 刷新版面

主题:[讨论]请达人给指下路,谢谢(30分)

学了一个学期的汇编,也就完整的编过两次程序,现在要写个项目,求达人给指下路。
我考虑是不是可以写个什么USB或者摄像头或者是键盘的驱动玩玩....
谢谢,再拜达人
(30分)

回复列表 (共2个回复)

沙发

送一段键盘驱动处理程序给你~端口级的,我不会进行解说,有空自己看一下计算机接口技术的书。
    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

板凳

感激涕零,谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册