微机原理.docx
《微机原理.docx》由会员分享,可在线阅读,更多相关《微机原理.docx(19页珍藏版)》请在冰豆网上搜索。
微机原理
;6264.asm
;1
codesegment'code'
assumecs:
code
start:
movax,1000h
movds,ax
movbx,0000h
movdl,40h?
?
rep1:
incdl
movds:
[bx],dl
incbx
cmpdl,5ah
jnzrepl
movdl,0
mov[bx],dl
movax,ds
moves,ax
movbp,0
movah,4
int14h
xorcx,cx
loop$
int20h?
?
codeends
end
;simpleIO.asm
;2
mainprocfar;与程序结尾处的“mainendp”一起定义一个过程
codesegment'code';定义代码段,段名“code”
assumecs:
code;指定代码段和段寄存器cs之间的联系
begin:
movbl,0
start:
movdx,8h
inal,dx;从244读入开关状态(地址08h)
testal,0ffh;
jzflash;判断是否全0,若是,二极管闪烁
movdx,10h;10h是377的地址
notal
outdx,al;将读入的开关状态求反后送377输出,对应发光二极管显示
jmpstart
flash:
notbl;闪烁程序段
movdx,10h
moval,bl
notal
outdx,al;将全0送二极管显示
movcx,0bfffh;延时200ms。
0bffh=3071(D),
loop$;延时时间=49151*33(时钟周期)/8000000(CPU工作频率)≈200ms
notbl;又一次求反bl,即将全1送二极管显示
moval,bl
notal
outdx,al
movcx,0bfffh
loop$;延时200ms。
jmpstart
codeends
mainendp
endbegin
;中断控制器8259的使用
;8259.asm
;IRQ1INTERRUPT
;
C8259EQU20H;8259地址,通过硬件译码电路已设好
CODESEGMENT
MAINPROCFAR;与程序结尾处的“mainendp”一起定义一个过程
ASSUMECS:
CODE
Start:
XORAX,AX;AX=0
MOVDS,AX;中断向量表在内存0000h~03ffh
LEAAX,IRQ1;IRQ1是中服程序地址,送AX,见下文中服程序
MOVDS:
24H,AX;装入IP(以下几条,向中断向量表装入中服入口地址,24h=09h*4
MOVAX,CS
MOVDS:
26H,AX;装入CS
MOVDX,C8259;8259地址
MOVAL,00010011B;初始化字ICW1,边沿触发,单片,写入ICW4
OUTDX,AL
INCDX
MOVAL,00001000B;ICW2,设置中断类型号08h~0fh,不严格,intel规定0~4是专用中
;断,5~31是为将来扩展或特殊用途保留的中断,32~255是用户可使用的
OUTDX,AL
MOVAL,00001101B;中断方式字ICW4,普通嵌套,缓冲方式,主片,非自动中断结束,16位CPU
OUTDX,AL
MOVAL,11111101B;屏蔽命令字OCW1,只允许IRQ1中断请求
OUTDX,AL
MOVAL,20H;中断结束字OCW2(EOI),00100000B,普通EOI,优先权固定
OUT20H,AL
MOVBL,'0';设置初始发送字符为“0”
MOVAL,BL
MOVAH,1
INT14H;BIOS异步通信功能调用,通过串口将AL指定字符发送到上位机显示
STI;开中断
JMP$;死循环,等待外部中断触发信号
IRQ1:
CLI;以下是中服程序,开中断
INCBL;下一个输出字符
MOVAL,BL
MOVAH,1
INT14H;输出字符
MOVAL,20H;
OUT20H,AL;中断结束字
STI;开中断
IRET;中断返回
MAINENDP
CODEENDS;代码段结束
END
定时控制器8253的使用
;03E8=0000001111101000==1000D,0.001s,
;8253.asm
;8253waveoutput
;
CODESEGMENT;SEGMENT与ENDS构成一完整的代码段
MAINPROCFAR;PROC和ENDP定义完整的过程,过程属性为FAR,过程可以被
;其它代码段的程序调用(p81)
ASSUMECS:
CODE;建立段与段寄存器的关系
STARTMOVDX,43H;控制字寄存器端口地址
MOVAL,01110110B;计数器1,2进制,方式3,读16位计数值
OUTDX,AL
MOVDX,41H;计数器1地址
MOVAL,0E8H
OUTDX,AL;写计数值高8位
MOVAL,03H
OUTDX,AL;计数值低8位
MOVDX,43H
MOVAL,10110100B;计数器2,2进制,方式2,读16位计数值
OUTDX,AL;写计数器2控制字
MOVDX,42H
MOVAL,0FH;00001111B
OUTDX,AL
MOVAL,0H
OUTDX,AL;计数器2预置计数值000fh
INT20H;20h中断调用,结束程序运行
MAINENDP
CODEENDS
END
;8255.asm
;test8255io
;readfromportb
;outputtoporta
porta=8h
portb=9h
portc=0bh
;
mainprocfar
dcons=10h;延时常数
cgsegment'code'
assumecs:
cg
;
begin:
movdx,portc;8255初始化
moval,82h
outdx,al
movah,0ffh
movbl,0
lp:
movdx,portb;B口读入开关状态
inal,dx
testal,ah
jzshift
movdx,porta;A口输出开关状态
notal
outdx,al
jmplp
shift:
moval,bl
movdx,porta
notal
outdx,al
calldelay;延时
shlbl,1;移位
testbl,ah
jnzlp
movbl,1
jmplp
back:
retf
;
delayprocnear
pushcx
movcx,0
delay1:
orcx,cx
orcx,cx
loopdelay1
popcx
retn
delayendp
;
mainendp
cgends
endbegin
;8255lamp.asm
;用8255控制模拟十字路口交通灯的控制情况
;8255trafficlamp
;
portaEQU8H
portbEQU9H
controlEQU0bH
;
dsegsegment
timedb?
valuedb?
donedb0
intmaskdb?
dsegends
;
csegsegment
assumecs:
cseg,ds:
dseg
start:
moval,80h
movdx,control
outdx,al;8255初始化
sw:
moval,11h
movdx,porta
notal
outdx,al;ALLREDLIGHT
incdx
notal
outdx,al
movcx,3
cp1:
calldelay
loopcp1
lamp:
moval,14h
movdx,porta
notal
outdx,al
moval,41h
incdx
notal
outdx,al
movcx,6
cp2:
calldelay
loopcp2
movvalue,5
flash:
;GREENFLASH
moval,10h;绿灯闪烁,0.5秒亮,0.5秒灭
movdx,porta
notal
outdx,al
movAL,1h
incdx
notal
outdx,al
movcx,1
cp3:
calldelay
loopcp3
moval,14h
movdx,porta
notal
outdx,al
moval,41h
incdx
notal
outdx,al
movcx,1
cp4:
calldelay
loopcp4
decvalue
jneflash;重复5次
;黄灯1秒钟
moval,12h
movdx,porta
notal
outdx,al
moval,21h
incdx
notal
outdx,al
movcx,2
cpa:
calldelay
loopcpa
;绿灯6秒钟
moval,41h
movdx,porta
notal
outdx,al
moval,14h
incdx
notal
outdx,al
movcx,6
cp5:
calldelay
loopcp5
movvalue,5
flass:
;GREENFLASH
moval,1h;绿灯闪烁,0.5秒亮,0.5秒灭
movdx,porta
notal
outdx,al
moval,10h
incdx
notal
outdx,al
movcx,1
cp6:
calldelay
loopcp6
moval,41h
movdx,porta
notal
outdx,al
moval,14H
incdx
notal
outdx,al
movcx,1
cp7:
calldelay
loopcp7
decvalue
jnzflass
;黄灯1秒钟
moval,21h
movdx,porta
notal
outdx,al
moval,12h
incdx
notal
outdx,al
movcx,2
cpb:
calldelay
loopcpb
jmplamp
;
back:
int20h
;
delayprocnear
pushds
pushax
pushcx
xorcx,cx
loop$
popcx
popax
popds
retn
delayendp
;
csegends
endstart
;
;8255led.asm
;用8255的A口和B口分别作4个共阴数码管的段码端口和位选端口,
;在4个数码管上循环显示4个数码字符0-3
;8255addressis10h~13h(连接JJ11-2)
;portAconnecttoledsegment
;portb0-3connecttoledcolumn
;
portaequ10h
portbequ11h
controlequ13h
;
mainprocfar
codesegment'code'
assumecs:
code,ds:
code
movax,cs
movds,ax
moval,80h
movdx,control
outdx,al;初始化,所有的端口设为输出
moval,0ffh
movdx,porta
outdx,al;A口送全1,关闭数码管显示
incdx;B口地址
outdx,al;B口送全1,各位数码管全不选中
movbx,0e00h;bh=00001110(位选),bl=00000000(指示位显示内容)
disp:
movsi,offsetsegtab
pushbx
movbh,0
addsi,bx;si指向segtab的元素
popbx;bx仍等于0e00h
moval,[si];首次al=“0”的七段代码
notal;因为JB输入低电平,经74ls40反相,对应段亮
movdx,porta
outdx,al;
moval,bh
incdx
outdx,al;首次选中最低位数码管,对应数码管亮
movcx,01ffh
loop$;延时
shlbh,1
orbh,1;到此bh=00011101B
incbl;
cmpbl,04;bl若加到4,则使bh=00001110,bl=00000000,即重新从0开始显示
jnedisp1
movbh,0eh;
disp1:
andbl,3;
jmpdisp
segtab:
db3fh,06h,5bh,4fh,66h,6dh,7dh,7,7fh,6fh;0-9的7段译码
codeends
mainendp
end
;8255key.asm
pa55equ10h
pb55equ11h
p55ctlequ13h
codesegment
mainprocfar
assumecs:
code
start:
movax,cs
movds,ax
scan:
callkey;getacharin(dl)anddisplayit
jmpscan
mainendp
keyprocnear
moval,82h
movdx,p55ctl
outdx,al;setcommandwordof8255a
;portaforoutput,portbforinput
wait1:
moval,00
movdx,pa55
outdx,al;portaoutput00
movdx,pb55
inal,dx;getcoldata
andal,0fh
cmpal,0fh
jnzkey1;nokeyisclosed,wait
retn
key1:
pushax;savethecoldata
pushax
movcx,1000h;delayforamoment
loop$
movdx,p55ctl
moval,90h;setcommandwordof8255a
outdx,al;portaforinput,portbforoutput
movdx,pb55
popax
outdx,al;outputcoldatafromportb
movdx,pa55
inal,dx;(al)isrowdata
popbx
movah,bl;(ah)iscoldata
notax
andax,0f0fh
movsi,offsettable
movdi,offsetchar
movcx,24
tt:
cmpax,[si];cmp(col,row)witheveryword
jznn;inthetable
deccx
jnzkey2
retn
key2:
addsi,2
incdi
jmptt
nn:
moval,[di]
movah,1
int14h
pushdx
moval,82h
movdx,p55ctl
outdx,al;setcommandwordof8255a
;portaforoutput,portbforinput
wait2:
moval,00
movdx,pa55
outdx,al;portaoutput00
movdx,pb55
inal,dx;getcoldata
andal,0fh
cmpal,0fh
jnzwait2;waituntilthekeyisup
popdx
retn
keyendp
tabledw0101h,0102h,0104h,0108h
dw0201h,0202h,0204h,0208h
dw0401h,0402h,0404h,0408h
dw0801h,0802h,0804h,0808h
chardb'048C159D26AE37BF'
codeends
endstart