微机原理实验代码.docx
《微机原理实验代码.docx》由会员分享,可在线阅读,更多相关《微机原理实验代码.docx(22页珍藏版)》请在冰豆网上搜索。
微机原理实验代码
CHECKMACROCODE,COMPARE
MOVAL,0000&CODE&B
MOVDX,PORT
OUTDX,AL
MOVDX,PORT+1
INAL,DX
LEABX,TAB&COMPARE
CMPAL,0FH
JNEDISPLAY
ENDM
DATASEGMENT
MESSAGEDB'PLEASEINPUTANYKEYFROMKEYBOARD,PRESSFFOREND.',0DH,0AH,'$'
TAB1DB'F','E','D','C'
TAB2DB'B','A','9','8'
TAB3DB'7','6','5','4'
TAB4DB'3','2','1','0'
KBDB00EH,00DH,00BH,007H
PORTEQU280H
DATAENDS
STACKSEGMENTPARASTACK
DB256DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVDX,PORT+3;初始化8255
MOVAL,10000010b
OUTDX,AL
LEADX,MESSAGE
MOVAH,09H
INT21H
SEARCH:
MOVAL,0;若有键按下,按列查找哪个键
MOVDX,PORT
OUTDX,AL
MOVDX,PORT+1
INAL,DX
ANDAL,0FH
CMPAL,0FH
JESEARCH
CHECK1110,1;查找按下的键,并显示
CHECK1101,2
CHECK1011,3
CHECK0111,4
NOP
JMPSEARCH
DISPLAY:
MOVDI,BX;存小键盘扫描码
LEASI,KB
NEXT:
CMPAL,[SI];查键盘扫描码表
JESHOW;找到了,转去显示
INCSI;否则继续
INCDI
JMPNEXT
SHOW:
;显示键入字符
MOVAH,02H
MOVDL,[DI]
INT21H
CMPDL,'F';若是'F'则退出
JEOVER
CALLDELAY
JMPSEARCH;重新开始查询
OVER:
MOVAH,4CH
INT21H
DELAYPROC;延时循环100*65536次
PUSHDI
PUSHCX
MOVCX,0FH
XORDI,DI
AGAIN:
NOP
DECDI
JNZAGAIN
DECCX
JNZAGAIN
POPCX
POPDI
RET
DELAYENDP
CODEENDS
ENDSTART
SET8253MACROSEGCODE,SEGOFFSET
MOVAL,SEGCODE&B
MOVDX,P8253+3;;工作在模式3
OUTDX,AL
MOVAX,3E8H
MOVDX,P8253+&SEGOFFSET
OUTDX,AL
MOVAL,AH;;先赋高八位再赋低八位
OUTDX,AL
ENDM
LIGHTUPMACRODIGIT,SELECT
LOCALDELAY
MOVDL,DIGIT;;选择位
MOVDH,0
MOVSI,DX
MOVAL,[BX][SI]
MOVDX,P8255+1;;点亮LED
OUTDX,AL
MOVAL,0000&SELECT&B
MOVDX,P8255+2;;PC输出选通信号
OUTDX,AL
PUSHCX
MOVCX,00F00H;;延时
DELAY:
LOOPDELAY
POPCX
XORAX,AX
MOVDX,P8255+2;;PC输出选通信号
OUTDX,AL
ENDM
DATASEGMENT
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
SEC1DB0
SEC2DB5
MIN1DB9
MIN2DB5
P8259EQU20H
P8255EQU288H
P8253EQU280H
OLD_0ADW0,0;原中断向量
OLD_8259DB0
DATAENDS
STACKSEGMENTPARASTACK
DB256DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
CLI
SET825300110110,0
SET825301110110,1
PUSHES;设置中断向量表
PUSHBX
MOVAL,0BH;保护原中断向量,0B中断类型号
MOVAH,35H
INT21H;读中断向量表
MOVOLD_0A+2,ES;ES为段地址,BX为段偏移地址
MOVOLD_0A,BX
POPBX
POPES
PUSHDS
MOVAL,0BH;写新中断向量
MOVAH,25H
MOVDX,SEGINT_0A
MOVDS,DX
MOVDX,OFFSETINT_0A
INT21H
POPDS
MOVAL,10000000B;对8255进行设置,PB/PC输出
MOVDX,P8255+3
OUTDX,AL
INAL,P8259+1;8259奇地址,中断向量屏蔽
MOVOLD_8259,AL;字设置保护原屏蔽字
ANDAL,11110111B;开IRQ3
OUTP8259,AL
STI;开中断
PLAY:
LEABX,LED;LED段码
LIGHTUPSEC1,0001
LIGHTUPSEC2,0010
LIGHTUPMIN1,0100
LIGHTUPMIN2,1000
JMPPLAY
MOVAH,4CH
INT21H
INT_0APROCNEAR;中断服务子程序
CMPSEC1,9
JZINT1
INCSEC1
JMPEXIT
INT1:
MOVSEC1,0
INCSEC2
CMPSEC2,6
JNZEXIT
MOVSEC2,0
INCMIN1
CMPMIN1,10
JNZEXIT
MOVMIN1,0
INCMIN2
CMPMIN2,6
JNZEXIT
MOVMIN2,0
EXIT:
MOVAL,20H
OUT20H,AL
IRET
INT_0AENDP
CODEENDS
ENDSTART
TRANSSETMACROADDRESS,ALNUM
MOVDX,ADDRESS
MOVAX,ALNUM
OUTDX,AL
ENDM
DATASEGMENT
FILEDB'D:
\abc.TXT',0
FCODEDW0
BUFDB2000HDUP(0)
DATAENDS
STACKSEGMENTPARASTACK
DB256DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
TRANSSET3FBH,80H;传输线路控制寄存器,寻址除数锁存器
TRANSSET3F8H,60H;DLL
TRANSSET3F9H,0;DLH
TRANSSET3FBH,1AH;传输线路控制寄存器,LCR地址,7位数据,1位停止
TRANSSET3FCH,03H;MODEM控制寄存器
TRANSSET3F9H,0;屏蔽中断
MOVAH,3DH;文件操作
LEADX,FILE
MOVAL,2
INT21H
MOVFCODE,AX
XORSI,SI
RECEIVE:
MOVDX,3FDH;检测接收数据是否准备好
INAL,DX
TESTAL,01H
JZRECEIVE
MOVDX,3F8H
INAL,DX
MOVDL,AL
MOVAH,02
INT21H
SEND:
MOVDX,3FDH;检测接收数据是否准备好
INAL,DX
TESTAL,20H
JZSEND
MOVAH,3FH;从文件中读取发送
LEADX,BUF
ADDDX,SI
MOVBX,FCODE
MOVCX,1
INT21H
MOVDX,3F8H
MOVAL,BUF[SI]
OUTDX,AL
INCSI
;MOVDL,AL
;MOVAH,02;将字符显示在屏幕上
;INT21H
REPT45
NOP
ENDM
JMPRECEIVE
CODEENDS
ENDSTART
TRANSSETMACROADDRESS,ALNUM
MOVDX,ADDRESS
MOVAX,ALNUM
OUTDX,AL
ENDM
DATASEGMENT
FILEDB'D:
\abc.TXT',0
FCODEDW0
BUFDB2000HDUP(0)
IO8254AEQU280H
IO8251AEQU2B8H
IO8251BEQU2B9H
DATAENDS
STACKSEGMENTPARASTACK
DB256DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
TRANSSETIO8254A+3,00010110B;设置8254计数器0工作方式,低字节,8位,方式3,二进制
TRANSSETIO8254A,52;给8254计数器0送初值(波特率1200,因子16,计数初值52)
TRANSSETIO8251B,0;初始化8251
TRANSSETIO8251B,40H;向8251控制端口送40H,使其复位
TRANSSETIO8251B,7EH;设置为1个停止位,8个数据位,波特率因子为16
TRANSSETIO8251B,27H;向8251送控制字允许其发送和接收
MOVAH,3CH;文件操作
LEADX,FILE
MOVCX,00
INT21H
MOVFCODE,AX
MOVAH,3DH
LEADX,FILE
MOVAL,2
INT21H
XORSI,SI
SEND:
MOVDX,IO8251B
INAL,DX
TESTAL,20H;发送是否准备好
JZSEND
MOVDX,IO8251A
MOVAL,'F'
OUTDX,AL;发送
;MOVDL,AL
;MOVAH,02;将字符显示在屏幕上
;INT21H
REPT64
NOP
ENDM
RECEIVE:
MOVDX,IO8251B
INAL,DX
TESTAL,01;检查接收是否准备好
JZRECEIVE;没有,等待
MOVDX,IO8251A
INAL,DX;准备好,接收
MOVDL,AL
MOVAH,02;将接收到的字符显示在屏幕上
INT21H
MOVBUF[SI],DL
MOVAH,40H;接收到的字符写入文件
LEADX,BUF
ADDDX,SI
MOVBX,FCODE
MOVCX,1
INT21H
INCSI
REPT45
NOP
ENDM
JMPSEND
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
DATASEGMENT
INT0BDW2DUP(?
)
IMRDB?
P_ADDW298H
TABDB'0123456789ABCDEF'
DATAENDS
SSEGMENTSTACK'STACK'
DB128DUP(?
)
SENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
S
MAINPROCPAR
MOVAX,DATA
MOVDS,AX
CLI
;修改中断向量表
PUSHES
PUSHBX
MOVAH,35H;保护原中断向量
MOVAL,0BH
INT21H
MOVINT0B,ES
MOVINT0B+2,BX
POPBX
POPES
PUSHDS
PUSHDX
MOVDX,OFFSETDISP;设置新的中断向量
PUSHBX
MOVBX,SEGDISP
MOVDS,BX
POPBX
MOVAX,250BH
INT21H
POPDX
POPDS
;8259清除0BH号中断屏蔽位
INAL,21H
MOVIMR,AL
ANDAL,0F7H
OUT21H,AL
;启动AD转换
NEXT:
MOVDX,P_AD
MOVAL,0
OUTDX,AL
;等待中断,并检测是否有按键
PUSHCX
MOVCX,100
LOOP$
POPCX
STI
MOVAH,1
INT16H
JZNEXT
;恢复8259中断屏蔽位
CLI
MOVAL,IMR
OUT21H,AL
;恢复中断向量表
PUSHDX
PUSHDS
MOVDX,INT0B
MOVDS,DX
MOVDX,INT0B+2
MOVAX,250BH
INT21H
POPDS
POPDX
MOVAX,4C00H
INT21H
MAINENDP
DISPPROCFAR
PUSHAX
PUSHDX
MOVDX,P_AD;读入AD转换结果
INAL,DX
MOVAH,0;AH中为低位,AL中为高位
SHLAX,4
SHRAL,4
PUSHAX;输出高位
MOVAL,AH
LEABX,TAB
XLATB
MOVDL,AL
MOVAH,2
INT21H
POPAX
LEABX,TAB;输出低位
XLATB
MOVDL,AL
MOVAH,2
INT21H
MOVDL,0DH;输出回车
MOVAH,2
INT21H
MOVDL,0AH;输出回车
MOVAH,2
INT21H
MOVAL,20H
OUT20H,AL
POPDX
POPAX
IRET
DISPENDP
CODEENDS
ENDMAIN
DATASEGMENT
ADD_DADW290H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVDX,ADD_DA
MOVAL,0
NEXT:
OUTDX,AL;向DA送数据
ADDAL,10
MOVCX,5;延时
LOOP$
MOVAH,1;检测按键
INT16H
JZNEXT
MOVAH,4CH
INT21H
MAINENDP
CODEENDS
ENDMAIN
DATASEGMENT
ADD_DADW290H
LENDB32
DATA_INDB80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db80h,66h,4eh,38h,25h,15h,09h,04h
db00h,04h,09h,15h,25h,38h,4eh,66h
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVDX,ADD_DA
BEGIN:
MOVBH,LEN
LEASI,DATA_IN
NEXT:
MOVAL,[SI]
OUTDX,AL;向DA送数据
INCSI
DECBH
MOVCX,1;延时
LOOP$
CMPBH,0;一个周期已完成
JZBEGIN
MOVAH,1;检测按键
INT16H
JZNEXT
MOVAH,4CH
INT21H
MAINENDP
CODEENDS
ENDMAIN