❶ 用89C51单片机设计4*4矩阵式键盘计算器程序 要汇编的
KEYBUF EQU 40H ;键号存放单元
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值
MOV R0,#30H ;显示首地址
MOV R2,#0CH ;计算数据存放单元个数
CLR A
QING: MOV @R0,A ;将数据存放单元清零
INC R0
DJNZ R2,QING
MOV P0,#8FH ;关闭显示
MOV R1,#30H ;将显示首地址存放R1里
;===============================================
;五位无符号显示子程序
DIS1: MOV R0,#30H ;把显示数据第一位放在R0里
MOV R2,#04H ;把显示的位码放在R2里
MOV R3,#05H ;把显示的长度放在R3里
DIS2: MOV A,@R0
ANL A,#0FH ;屏蔽显示数据的高四位
MOV B,A
MOV A,R2
ANL A,#0FH ;屏蔽位码的高四位
SWAP A
ORL A,B
MOV P0,A ;送总显示数据到P0显示
LCALL DELY4ms ;调用延时4ms
INC R0 ;取下一个显示数据
DEC R2
DJNZ R3,DIS2 ;四位显示晚后重新开始显示
;===================================================
;键盘扫描子程序
WAIT: MOV P1,#0FFH ;P1口送高电平
CLR P1.0 ;第一行清零
MOV A,P1 ;读P1口
ANL A,#0F0H ;低位屏蔽
XRL A,#0F0H ;判断低位是否有低电平 ,即判断是否有按键按下
JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第而行去扫描
LCALL DELY10ms ;延时10ms去抖在进行判断是否有按键按下
MOV A,P1 ;继续读P1口
ANL A,#0F0H ;判断低位是否有低电平
CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H就转到NK1
MOV KEYBUF,#0 ;否者判断为0号键
AJMP DK ;转DK1查表程序
NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H就转到NK2
MOV KEYBUF,#1 ;否者判断为1号键
AJMP DK ;转DK2查表程序
NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H就转到NK3
MOV KEYBUF,#2 ;否者判断为2号键
AJMP DK ;转DK3查表程序
NK3: CJNE A,#70H,NK4 ;如果扫描数据不为70H就转到NK4
LJMP SAN_CHU
NK4: NOP
NOKEY1: MOV P1,#0FFH ;和上面相同
CLR P1.1
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
LCALL DELY10MS
MOV A,p1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK5
MOV KEYBUF,#3
AJMP DK
NK5: CJNE A,#0D0H,NK6
MOV KEYBUF,#4
AJMP DK
NK6: CJNE A,#0B0H,NK7
MOV KEYBUF,#5
AJMP DK
NK7: CJNE A,#70H,NK8
MOV KEYBUF,#10 ;否者判断为3号键
AJMP DK ;转DK4查表程序
NK8: NOP
NOKEY2: MOV P1,#0FFH
CLR P1.2
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK9
MOV KEYBUF,#6
AJMP DK
NK9: CJNE A,#0D0H,NK10
MOV KEYBUF,#7
AJMP DK
NK10: CJNE A,#0B0H,NK11
MOV KEYBUF,#8
AJMP DK
NK11: CJNE A,#70H,NK12
LJMP DENG_HAO
NK12: NOP
NOKEY3: MOV P1,#0FFH
CLR P1.3
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK13
LJMP CHU
NK13: CJNE A,#0D0H,NK14
LJMP CHENG
NK14: CJNE A,#0B0H,NK15
LJMP JIAN
NK15: CJNE A,#70H,NK16
LJMP JIA
NK16: NOP
;=======================================================
;查表求键值程序
DK: MOV B,#00H
MOV A,KEYBUF ;查表程序 查对应的键号数据
MOV DPTR,#TABLE ;把表头地址放入DPTR
MOVC A,@A+DPTR ;A里面存放的为键号,利用A和表头地址找到对应的键号数据
MOV B,A ;把查到的数据送往显示单元
INC R1 ;取下一个显示单元
MOV A,R1
CJNE A,#36H,DKA1 ;判断显示单元是否已满
MOV R1,#35H ;35H,36H单元用于更好的控制五位显示
AJMP DKA
DKA1: MOV 34H,33H ;按键代码按左移显示,先按先显示
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,B
DKA: MOV A,P1 ;读P1口
ANL A,#0F0H ;屏蔽高四位
XRL A,#0F0H ;地位是有低电平
JNZ DKA ;如果有低电平继续读P1口,否者向下执行,查找第二行
NOKEY4: LJMP DIS1
;===================================
;功能按键功能设定
DENG_HAO:MOV DPTR,#JI_SUAN ;等号键功能通过加、减、乘、除设定的偏移量来调用子程序
MOV A,3CH ;3CH存放的为功能程序入口地址偏移量
JMP @A+DPTR ;转移到按键功能程序
JI_SUAN: AJMP JIA1 ;加计算子程序
AJMP JIAN1 ;减计算子程序
AJMP CHENG1 ;乘计算子程序
AJMP CHU ;除计算子程序
;=======删除键功能
SAN_CHU: ACALL QING_DIS
AJMP DKA
;=======加键功能
JIA: MOV 3CH,#00H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======减键功能
JIAN: MOV 3CH,#02H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======乘键功能
CHENG: MOV 3CH,#04H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=======除键功能
CHU: MOV 3DH,#06H
ACALL CUN_SHU
ACALL QING_DIS
AJMP DKA
;=================================
;存被加(减、乘、除)数,存放在37H~3BH里
CUN_SHU: MOV 37H,30H ;36H存放的为最低位
MOV 38H,31H
MOV 39H,32H
MOV 3AH,33H
MOV 3BH,34H ;3AH存放的为最高位
RET
;================================
;清除显示单元
QING_DIS: MOV R1,#30H
QING1: MOV @R1,#00H
INC R1
MOV A,R1
CJNE A,#36H,QING1
MOV R1,#30H
LOP1: RET
;================================
;十进制加法子程序
JIA1:
MOV A,37H ;个位被加数
ADD A,30H ;个位被加数+加数
MOV B,#10 ;十六进制除10转换成BCD码
DIV AB
MOV 30H,B ;余数即个位存放在30H
MOV 37H,A ;商存放在37H
MOV A,38H ;十位被加数
ADD A,31H ;十位被加数+加数
ADD A,37H ;加上个位之和的进位
MOV 37H,#00H ;清除37H
MOV B,#10 ;十六进制除10转换成BCD码
DIV AB
MOV 31H,B ;余数即十位存放在31H
MOV 38H,A ;商存放在38H
MOV A,39H ;百位计算同十位
ADD A,32H
ADD A,38H
MOV 38H,#00H
MOV B,#10
DIV AB
MOV 32H,B
MOV 39H,A
MOV A,3AH ;千位计算同十位
ADD A,33H
ADD A,39H
MOV 39H,#00H
MOV B,#10
DIV AB
MOV 33H,B
MOV 3AH,A
MOV A,3BH ;万位计算同十位
ADD A,34H
ADD A,3AH
MOV 3AH,#00H
MOV B,#10
DIV AB
MOV 34H,B
MOV 3BH,#00H
AJMP DKA
;=====================
JIAN1: AJMP DKA
CHENG1: AJMP DKA
CHU1: AJMP DKA
;=============================================
;延时程序和查表表格
DELY4ms: MOV R6,#8 ;延时4毫秒
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10ms:MOV R6,#20 ;延时10毫秒
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET
TABLE: DB 07H, 04H, 01H ; / 本表格是以键盘为参考 7 8 9 /
DB 08H, 05H, 02H ; * 4 5 6 *
DB 09H, 06H, 03H ; - 1 2 3 -
DB 00H, 00H ;= + 清除 0 = +
END
❷ 用汇编语言编写一个程序,能用键盘选择选择产生正弦波、方波、三角形波和锯齿波形
T0832-1.asm
;D/A转换实验,产生方波
;***************根据CHECK配置信息修改下列符号值*******************
IOY0 EQU 9C00H ;片选IOY0对应的端口始地址
;*****************************************************************
DA0832 EQU IOY0+00H*4 ;DA0832的端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
STR1 DB 'DA0832: Square Wave $' ;定义显示的字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STR1 ;显示字符串
MOV AH,9
INT 21H
LOOP1: MOV DX,DA0832 ;写00H,输出低电平
MOV AL,00H
OUT DX,AL
CALL DALLY
MOV DX,DA0832 ;写0FH,输出高电平
MOV AL,7FH
OUT DX,AL
CALL DALLY
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP1 ;无按键则跳回继续循环,有则退出
QUIT: MOV AX,4C00H ;返回到DOS
INT 21H
DALLY PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0050H
D1: MOV AX,5000H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
CODE ENDS
END START
;T0832-2.asm
;D/A转换实验,产生三角波
;***************根据CHECK配置信息修改下列符号值*******************
IOY0 EQU 9C00H ;片选IOY0对应的端口始地址
;*****************************************************************
DA0832 EQU IOY0+00H*4 ;DA0832的端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
STR1 DB 'DA0832: Triangle Wave $' ;定义显示的字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STR1 ;显示字符串
MOV AH,9
INT 21H
LOOP1: MOV AL,00H ;D/A转换起始值
UP: MOV DX,DA0832 ;启动D/A转换
OUT DX,AL
CALL DALLY
INC AL
CMP AL,7FH
JNE UP
DOWN: MOV DX,DA0832
OUT DX,AL
CALL DALLY
DEC AL
CMP AL,00H
JNE DOWN
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP1 ;无按键则跳回继续循环,有则退出
QUIT: MOV AX,4C00H ;返回到DOS
INT 21H
DALLY PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0010H
D1: MOV AX,0100H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
CODE ENDS
END START
❸ 汇编无键盘输入的判断
0B 检验键盘状态 AL=00 有输入AL=FF 无输入
中断调用
AH 功能 调用参数 返回参数
00 程序终止(同INT 20H) CS=程序段前缀
01 键盘输入并回显 AL=输入字符
02 显示输出 DL=输出字符
03 异步通迅输入 AL=输入数据
04 异步通迅输出 DL=输出数据
05 打印机输出 DL=输出字符
06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符
07 键盘输入(无回显) AL=输入字符
08 键盘输入(无回显)检测Ctrl-Break AL=输入字符
09 显示字符串 DS:DX=串地址'$'结束字符串
0A 键盘输入到缓冲区 DS:DX=缓冲区首地址(DS:DX)=缓冲区最大字符数 (DS:DX+1)=实际输入的字符数
0B 检验键盘状态 AL=00 有输入AL=FF 无输入
0C 清除输入缓冲区并请求指定的输入功能 AL=输入功能号(1,6,7,8,A)
0D 磁盘复位 清除文件缓冲区
0E 指定当前缺省的磁盘驱动器 DL=驱动器号 0=A,1=B,... AL=驱动器数
0F 打开文件 DS:DX=FCB首地址 AL=00 文件找到AL=FF 文件未找到
10 关闭文件 DS:DX=FCB首地址 AL=00 目录修改成功AL=FF 目录中未找到文件
11 查找第一个目录项 DS:DX=FCB首地址 AL=00 找到AL=FF 未找到
12 查找下一个目录项 DS:DX=FCB首地址(文件中带有*或?) AL=00 找到AL=FF 未找到
13 删除文件 DS:DX=FCB首地址 AL=00 删除成功AL=FF 未找到
14 顺序读 DS:DX=FCB首地址 AL=00 读成功 =01 文件结束,记录中无数据 =02 DTA空间不够 =03 文件结束,记录不完整
15 顺序写 DS:DX=FCB首地址 AL=00 写成功 =01 盘满 =02 DTA空间不够
16 建文件 DS:DX=FCB首地址 AL=00 建立成功 =FF 无磁盘空间
17 文件改名 DS:DX=FCB首地址(DS:DX+1)=旧文件名(DS:DX+17)=新文件名 AL=00 成功AL=FF 未成功
19 取当前缺省磁盘驱动器 AL=缺省的驱动器号 0=A,1=B,2=C,...
1A 置DTA地址 DS:DX=DTA地址
1B 取缺省驱动器FAT信息 AL=每簇的扇区数DS:BX=FAT标识字节CX=物理扇区大小DX=缺省驱动器的簇数
1C 取任一驱动器FAT信息 DL=驱动器号 同上
21 随机读 DS:DX=FCB首地址 AL=00 读成功 =01 文件结束 =02 缓冲区溢出 =03 缓冲区不满
22 随机写 DS:DX=FCB首地址 AL=00 写成功 =01 盘满 =02 缓冲区溢出
23 测定文件大小 DS:DX=FCB首地址 AL=00 成功(文件长度填入FCB)AL=FF 未找到
24 设置随机记录号 DS:DX=FCB首地址
25 设置中断向量 DS:DX=中断向量AL=中断类型号
26 建立程序段前缀 DX=新的程序段前缀
27 随机分块读 DS:DX=FCB首地址CX=记录数 AL=00 读成功 =01 文件结束 =02 缓冲区太小,传输结束 =03 缓冲区不满
28 随机分块写 DS:DX=FCB首地址CX=记录数 AL=00 写成功 =01 盘满 =02 缓冲区溢出
29 分析文件名 ES:DI=FCB首地址DS:SI=ASCIIZ串AL=控制分析标志 AL=00 标准文件 =01 多义文件 =02 非法盘符
2A 取日期 CX=年DH:DL=月:日(二进制)
2B 设置日期 CX:DH:DL=年:月:日 AL=00 成功 =FF 无效
2C 取时间 CH:CL=时:分DH:DL=秒:1/100秒
2D 设置时间 CH:CL=时:分DH:DL=秒:1/100秒 AL=00 成功 =FF 无效
2E 置磁盘自动读写标志 AL=00 关闭标志AL=01 打开标志
2F 取磁盘缓冲区的首址 ES:BX=缓冲区首址
30 取DOS版本号 AH=发行号,AL=版本
31 结束并驻留 AL=返回码DX=驻留区大小
33 Ctrl-Break检测 AL=00 取状态 =01 置状态(DL)DL=00 关闭检测 =01 打开检测 DL=00 关闭Ctrl-Break检测 =01 打开Ctrl-Break检测
35 取中断向量 AL=中断类型 ES:BX=中断向量
36 取空闲磁盘空间 DL=驱动器号 0=缺省,1=A,2=B,... 成功:AX=每簇扇区数 BX=有效簇数 CX=每扇区字节数 DX=总簇数失败:AX=FFFF
38 置/取国家信息 DS:DX=信息区首地址 BX=国家码(国际电话前缀码)AX=错误码
39 建立子目录(MKDIR) DS:DX=ASCIIZ串地址 AX=错误码
3A 删除子目录(RMDIR) DS:DX=ASCIIZ串地址 AX=错误码
3B 改变当前目录(CHDIR) DS:DX=ASCIIZ串地址 AX=错误码
3C 建立文件 DS:DX=ASCIIZ串地址CX=文件属性 成功:AX=文件代号错误:AX=错误码
3D 打开文件 DS:DX=ASCIIZ串地址AL=0 读 =1 写 =3 读/写 成功:AX=文件代号错误:AX=错误码
3E 关闭文件 BX=文件代号 失败:AX=错误码
3F 读文件或设备 DS:DX=数据缓冲区地址BX=文件代号CX=读取的字节数 读成功: AX=实际读入的字节数 AX=0 已到文件尾读出错:AX=错误码
40 写文件或设备 DS:DX=数据缓冲区地址BX=文件代号CX=写入的字节数 写成功: AX=实际写入的字节数写出错:AX=错误码
41 删除文件 DS:DX=ASCIIZ串地址 成功:AX=00出错:AX=错误码(2,5)
42 移动文件指针 BX=文件代号CX:DX=位移量AL=移动方式(0:从文件头绝对位移,1:从当前位置相对移动,2:从文件尾绝对位移) 成功:DX:AX=新文件指针位置出错:AX=错误码
43 置/取文件属性 DS:DX=ASCIIZ串地址AL=0 取文件属性AL=1 置文件属性CX=文件属性 成功:CX=文件属性失败:CX=错误码
44 设备文件I/O控制 BX=文件代号AL=0 取状态 =1 置状态DX =2 读数据 =3 写数据 =6 取输入状态 =7 取输出状态 DX=设备信息
45 复制文件代号 BX=文件代号1 成功:AX=文件代号2失败:AX=错误码
46 人工复制文件代号 BX=文件代号1CX=文件代号2 失败:AX=错误码
47 取当前目录路径名 DL=驱动器号DS:SI=ASCIIZ串地址 (DS:SI)=ASCIIZ串失败:AX=出错码
48 分配内存空间 BX=申请内存容量 成功:AX=分配内存首地失败:BX=最大可用内存
49 释放内容空间 ES=内存起始段地址 失败:AX=错误码
4A 调整已分配的存储块 ES=原内存起始地址BX=再申请的容量 失败:BX=最大可用空间 AX=错误码
4B 装配/执行程序 DS:DX=ASCIIZ串地址ES:BX=参数区首地址AL=0 装入执行AL=3 装入不执行 失败:AX=错误码
4C 带返回码结束 AL=返回码
4D 取返回代码 AX=返回代码
4E 查找第一个匹配文件 DS:DX=ASCIIZ串地址CX=属性 AX=出错代码(02,18)
4F 查找下一个匹配文件 DS:DX=ASCIIZ串地址(文件名中带有?或*) AX=出错代码(18)
54 取盘自动读写标志 AL=当前标志值
56 文件改名 DS:DX=ASCIIZ串(旧)ES:DI=ASCIIZ串(新) AX=出错码(03,05,17)
57 置/取文件日期和时间 BX=文件代号AL=0 读取AL=1 设置(DX:CX) DX:CX=日期和时间失败:AX=错误码
58 取/置分配策略码 AL=0 取码AL=1 置码(BX) 成功:AX=策略码失败:AX=错误码
59 取扩充错误码 AX=扩充错误码BH=错误类型BL=建议的操作CH=错误场所
5A 建立临时文件 CX=文件属性DS:DX=ASCIIZ串地址 成功:AX=文件代号失败:AX=错误码
5B 建立新文件 CX=文件属性DS:DX=ASCIIZ串地址 成功:AX=文件代号失败:AX=错误码
5C 控制文件存取 AL=00封锁 =01开启BX=文件代号CX:DX=文件位移SI:DI=文件长度 失败:AX=错误码
62 取程序段前缀 BX=PSP地址
I/O端口功能表
———————————————————————————
I/O地址 功能、用途
———————————————————————————
0 DMA通道0,内存地址寄存器(DMA控制器1(8237))
1 DMA通道0, 传输计数寄存器
2 DMA通道1,内存地址寄存器
3 DMA通道1, 传输计数寄存器
4 DMA通道2,内存地址寄存器
5 DMA通道2, 传输计数寄存器
6 DMA通道3,内存地址寄存器
7 DMA通道3, 传输计数寄存器
8 DMA通道0-3的状态寄存器
AH DMA通道0-3的屏蔽寄存器
BH DMA通道0-3的方式寄存器
CH DMA清除字节指针
DH DMA主清除字节
EH DMA通道0-3的清屏蔽寄存器
FH DMA通道0-3的写屏蔽寄存器
19H DMA起始寄存器
20H-3FH 可编程中断控制器1(8259)使用
40H 可编程中断计时器(8253)使用,读/写计数器0
41H 可编程中断计时器寄存器
42H 可编程中断计时器杂项寄存器
43H 可编程中断计时器,控制字寄存器
44H 可编程中断计时器,杂项寄存器(AT)
47H 可编程中断计时器,计数器0的控制字寄存器
48H-5FH 可编程中断计时器使用
60H-61H 键盘输入数据缓冲区
61H AT:8042键盘控制寄存器/XT:8255输出寄存器
62H 8255输入寄存器
63H 8255命令方式寄存器
64H 8042键盘输入缓冲区/8042状态
65H-6FH 8255/8042专用
70H CMOS RAM地址寄存器
71H CMOS RAM数据寄存器
80H 生产测试端口
81H DMA通道2,页表地址寄存器
82H DMA通道3,页表地址寄存器
83H DMA通道1,页表地址寄存器
87H DMA通道0,页表地址寄存器
89H DMA通道6,页表地址寄存器
8AH DMA通道7,页表地址寄存器
8BH DMA通道5,页表地址寄存器
8FH DMA通道4,页表地址寄存器
93H-9FH DMA控制器专用
A0H NM1屏蔽寄存器/可编程中断控制器2
A1H 可编程中断控制器2屏蔽
C0H DMA通道0,内存地址寄存器(DMA控制器2(8237))
C2H DMA通道0, 传输计数寄存器
C4H DMA通道1,内存地址寄存器
C6H DMA通道1, 传输计数寄存器
C8H DMA通道2,内存地址寄存器
CAH DMA通道2, 传输计数寄存器
CCH DMA通道3,内存地址寄存器
CEH DMA通道3, 传输计数寄存器
D0H DMA状态寄存器
D2H DMA写请求寄存器
D4H DMA屏蔽寄存器
D6H DMA方式寄存器
D8H DMA清除字节指针
DAH DMA主清
DCH DMA清屏蔽寄存器
DEH DMA写屏蔽寄存器
DFH-EFH 保留
F0H-FFH 协处理器使用
100H-16FH保留
170H 1号硬盘数据寄存器
171H 1号硬盘错误寄存器
172H 1号硬盘数据扇区计数
173H 1号硬盘扇区数
174H 1号硬盘柱面(低字节)
175H 1号硬盘柱面(高字节)
176H 1号硬盘驱动器/磁头寄存器
177H 1号硬盘状态寄存器
1F0H 0号硬盘数据寄存器
1F1H 0号硬盘错误寄存器
1F2H 0号硬盘数据扇区计数
1F3H 0号硬盘扇区数
1F4H 0号硬盘柱面(低字节)
1F5H 0号硬盘柱面(高字节)
1F6H 0号硬盘驱动器/磁头寄存器
1F7H 0号硬盘状态寄存器
1F9H-1FFH保留
200H-20FH游戏控制端口
210H-21FH扩展单元
278H 3号并行口,数据端口
279H 3号并行口,状态端口
27AH 3号并行口,控制端口
2B0H-2DFH保留
2E0H EGA/VGA使用
2E1H GPIP(0号适配器)
2E2H 数据获取(0号适配器)
2E3H 数据获取(1号适配器)
2E4H-2F7H保留
2F8H 2号串行口,发送/保持寄存器(RS232接口卡2)
2F9H 2号串行口,中断有效寄存器
2FAH 2号串行口,中断ID寄存器
2FBH 2号串行口,线控制寄存器
2FCH 2号串行口,调制解调控制寄存器
2FDH 2号串行口,线状态寄存器
2FEH 2号串行口,调制解调状态寄存器
2FFH 保留
300H-31FH原形卡
320H 硬盘适配器寄存器
322H 硬盘适配器控制/状态寄存器
324H 硬盘适配器提示/中断状态寄存器
325H-347H保留
348H-357H DCA3278
366H-36FH PC网络
372H 软盘适配器数据输出/状态寄存器
375H-376H 软盘适配器数据寄存器
377H 软盘适配器数据输入寄存器
378H 2号并行口,数据端口
379H 2号并行口,状态端口
37AH 2号并行口,控制端口
380H-38FH SDLC及BSC通讯
390H-393H Cluster适配器0
3A0H-3AFH BSC通讯
3B0H-3B H MDA视频寄存器
3BCH 1号并行口,数据端口
3BDH 1号并行口,状态端口
3BEH 1号并行口,控制端口
3C0H-3CFH EGA/VGA视频寄存器
3D0H-3D7H CGA视频寄存器
3F0H-3F7H 软盘控制器寄存器
3F8H 1号串行口,发送/保持寄存器(RS232接口卡1)
3F9H 1号串行口,中断有效寄存器
3FAH 1号串行口,中断ID寄存器
3FBH 1号串行口,线控制寄存器
3FCH 1号串行口,调制解调控制寄存器
3FDH 1号串行口,线状态寄存器
3FEH 1号串行口,调制解调状态寄存器
3FFH 保留
❹ 汇编如何显示键盘的输入字符
直接写显存把,把ASCII写到显存里之后显卡就会帮你把字符显示出来了
比如在80×25,16色文本显示模式(默认的显示模式)下,往B800:0000写30H的话,在第一行第一列就会显示一个"0"
不过这种方法需要比较复杂的软件支持
你可以通过10号中断的03H子功能读取光标位置,然后计算显存地址,然后把AL中的ASCII MOV到显存里
80×25,16色文本显示模式的显存格式是:
ASCII(字节型数据)|前景及背景颜色(字节型数据,白字黑背景是07H)
两个字节为一个单位,表示一个字符,然后就是这样循环,来映射屏幕
==========================================================
对了,你是不是没有设置好字符的属性啊?
(9)、功能09H
功能描述:在当前光标处按指定属性显示字符
入口参数:AH=09H
AL=字符
BH=显示页码
BL=属性(文本模式)或颜色(图形模式)
CX=重复输出字符的次数
出口参数:无
要在BL里填07H才能显示白字黑背景的字呢
================================================
通过写显存的方式显示字符的例子,这个是在DOS下运行的,不过改一下的话估计就能在裸机上运行了,那个显示字符的子过程没保存用到的寄存器,注意一下
assume cs:code,ds:data
data segment
db 'Love WenDaoSheYu Forever!','#'
data ends
code segment
start:mov ax,000EH
int 10H
mov ax,0002H
int 10H
;-------全屏一下,不用按Alt+Enter了
mov ax,data
mov ds,ax
mov al,11001010B
xor bx,bx
mov dx,0604H
;-------"实参表"
call print
exit:mov ah,0
int 16H
mov ax,4C00H
int 21H
print:;(AL=字符属性 DS=待显示字符段地址)
;(BX=待显示字符偏移地址 DH=行 DL=列)
;80×25字符显示模式
;功能简介:显示以"#"结尾的一串字符
push ax
mov cx,0
mov cl,dh
dec cl
mov ax,cx
mov cl,160
mul cl
mov bp,ax
pop ax
;-------处理行信息
mov cl,dl
mov si,cx
dec si
shl si,1
;-------处理列信息
mov cx,0B800H
mov es,cx
;-------初始化显存段寄存器
mov ah,[bx]
mov cl,'#'
pris:mov es:[bp+si],ah
inc si
mov es:[bp+si],al
inc si
inc bx
mov ah,[bx]
cmp ah,cl
jnz pris
;-------显示字符串
ret
code ends
end start