北邮微机原理与接口技术2.docx
《北邮微机原理与接口技术2.docx》由会员分享,可在线阅读,更多相关《北邮微机原理与接口技术2.docx(25页珍藏版)》请在冰豆网上搜索。
![北邮微机原理与接口技术2.docx](https://file1.bdocx.com/fileroot1/2023-1/28/77cc917a-e11e-43bc-aaef-ae9db8897246/77cc917a-e11e-43bc-aaef-ae9db88972461.gif)
北邮微机原理与接口技术2
微机原理与接口技术硬件实验报告
目录
2.实验二8255A并行接口应用3
2.1.实验目的3
2.2.实验内容3
2.2.1.静态显示学号3
2.2.2.动态显示HELLO9
2.2.3.回显小键盘输入15
2.3.心得体会21
参考资料22
声明与致谢22
2.实验二8255A并行接口应用
2.1.实验目的
2.1.1.掌握8255A的功能及方式0、1的实现;
2.1.2.熟悉8255A与CPU的接口,以及传输数据的工作原理及编程方法;
2.1.3.了解七段数码管显示数字的原理;
2.1.4.掌握同时显示多位数字的技术。
2.2.实验内容
2.2.1.静态显示学号
在数码管电路上静态地显示6位学号,当主机键盘按下任意键时,停止显示,返回DOS。
首先,我通过debug命令,探索各个段对应的位。
结果如下图:
图6七段数码管
利用这张图,我们可以制作出一些常见符号与段选信号的对应表。
其中,0~9是为了第三个小步骤而列举的。
表2本实验中使用的一些符号对应的数码管表示
符号
二进制代码
十六进制代码
0或O
11101101
ED
1
00100001
21
2
11110100
F4
3
11110001
F1
4
00111001
39
5
11011001
D9
6
11011101
DD
7
01100001
61
8
11111101
FD
9
11111001
F9
A
01111101
7D
b
10011101
9D
C
11001100
CC
d
10110101
B5
E
11011100
DC
F
01011100
5C
H
00111101
3D
L
10001100
8C
多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环依次点亮多个数码管,利用人眼的视觉暂留现象,只要扫描的频率足够大,将看不到闪烁现象。
实验证明,在扫描显示过程中,每一位显示延迟1ms是最佳选择。
在代码中,Show这个过程是来显示数码管的。
主程序流程图:
图7主程序流程图
源代码:
CODE(070141.asm)
;FILENAME:
070141.asm
;AUTHOR:
XIAO,Zhiqing(No.13,Cl.07105)
;DATE:
20091216
;DESCRIPTION:
display070141onseventubesarray
;macro:
myOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myOutMACROportAddr,data
PUSHDX
MOVDX,portAddr
MOVAL,data
OUTDX,AL
POPDX
ENDM
;macro:
myDigitOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myDigitOutMACROportAddr,data
PUSHDX
PUSHBX
MOVBX,OFFSETSegLut
MOVAL,data
XLATSegLut
MOVDX,portAddr
OUTDX,AL
POPBX
POPDX
ENDM
;macro:
myIn(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myInMACROportAddr,data
PUSHDX
MOVDX,portAddr
INAL,DX
MOVdata,AL
POPDX
ENDM
DataSEGMENT
;SegmentLookupTable
SegLutDB0EDH,21H,0F5H,0F1H,39H;"01234"
DB0D9H,0DDH,61H,0FDH,0F9H;"56789"
DB7DH,9DH,0CDH,0D5H,0DCH;"ABCDEF"
DB3DH,8CH;"HL"
;Contentindexarraytoprint
ContentDB00H,07H,00H,01H,04H,01H
;8255
PortAEQU0E800H
PortBEQU0E801H
PortCEQU0E802H
PortControlEQU0E803H
DataENDS
StackSEGMENTSTACK'STACK'
DB100HDUP(?
)
StackENDS
CodeSEGMENT
ASSUMECS:
Code,DS:
Data,SS:
Stack
MainPROC
PUSHDS
XORAX,AX
PUSHAX
MOVAX,Data
MOVDS,AX
myOutPortControl,80H;10000000Bmeans:
;A--mode0,output
;B--mode0,output
;CHigh--output
;CLow--output
view:
CALLShow
JMPview
RET;unreachableinstruction
MainENDP
;procShow
;inputargumentlists:
POINT
ShowPROC
PUSHBX
PUSHCX
PUSHSI
MOVBX,OFFSETContent
MOVCL,01H;initialize
;makeCL=00000001B,whichmeansenabletheleftmostdigit
MOVSI,0
nextDigit:
myOutPortB,CL;selecttubes
PUSHCX
MOVAL,BYTEPTR[BX+SI];
myDigitOutPortA,AL;selectsegments
POPCX
ROLCL,1;displaytheleftdigitnexttocurrentone
INCSI;nextletter
CALLDelay
CALLCheckAndQuit
CMPSI,6
JNZnextDigit
POPSI
POPCX
POPBX
RET
ShowENDP
DelayPROC
PUSHCX
MOVCX,0F000H
loopLabel:
NOP
LOOPloopLabel
POPCX
RET
DelayENDP
checkAndQuitPROC
PUSHAX
MOVAH,0BH;checkwhetheruserinputsomethingfromkeyboard
INT21H
ORAL,AL;ifhedoes,thenreturntoDos
JZexitCheckAndQuit
myOutPortA,0;selecttubes
myOutPortB,0;selecttubes
MOVAX,4C00H
INT21H
exitCheckAndQuit:
POPAX
RET
checkAndQuitENDP
CodeENDS
ENDMain
经编译、连接、运行,显示正常,且能够成功返回DOS。
图8静态显示学号
2.2.2.动态显示HELLO
要求在数码管电路1-6位数码管上按下图所示的规律,动态显示字符串HELLO,当主机键盘按下任意键时结束。
利用实验一读入端口的功能,控制动态显示的速度。
第一屏
H
第二屏
H
E
第三屏
H
E
L
第四屏
H
E
L
L
第五屏
H
E
L
L
O
第六屏
H
E
L
L
O
图9HELLO显示次序
按照我的设计,该程序要像上一个程序(070141.asm)一样,通过更新显示的下标数组Content来改变数码管显示。
但是,实验指导要求使用以下方法:
REQUIREMENT(实验二8255A并行接口应用.pdf)
在数据段,按下列规律设置12个字型码:
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0
POINTDWMESG
……
POINT单元存放MESG单元的有效地址,程序取出POINT单元的内容→BX,然后用BX间址取数送数码管电路,扫描显示6个字符。
每过0.5s将POINT单元的内容加1,再将POINT单元的内容→BX,……。
POINT单元内容加1,使字符串显示的首地址向高地址移动一个单元,从而使6位字符串向“左”移动一位,实现动态显示。
为了满足实验指导书的要求,我改动了程序的结构,不再使用查表的方法。
图10动态显示HELLO流程图
在本程序中,拨码开关S0控制是否移动。
拨码开关往上拨,移动停止在第五屏;否则移动。
拨码开关S1控制移动速度。
拨码开关往上拨,移动变慢;拨码开关往下拨,移动变快。
源代码如下:
CODE(hello.asm)
;FILENAME:
Hello.asm
;AUTHOR:
XIAO,Zhiqing(No.13,Cl.07105)
;DATE:
20091216
;DESCRIPTION:
displayHelloonseventubesarray
;USAGE:
;S0:
UPstill,DOWNmove
;S1:
UPslow,DOWNfast
;macro:
myOut(WARNING:
itmaychangethevalueofAL)
myOutMACROportAddr,data
PUSHDX
MOVDX,portAddr
MOVAL,data
OUTDX,AL
POPDX
ENDM
;macro:
myIn(WARNING:
itmaychangethevalueofAL)
myInMACROportAddr,data
PUSHDX
MOVDX,portAddr
INAL,DX
MOVdata,AL
POPDX
ENDM
DataSEGMENT
MESGDB0,0,0,0,0,0,3DH,0DCH,8CH,8CH,0EDH,0;"HELLO"
POINTDWMESG
;XUE9MODE
PortSwEQU0E8E0H
;JIAO2MODE
;PortSwEQU0EEE0H
SwStateDB0
;switchers:
01H-'1'still,'0'move
;02H-'1'slow,'0'fast
;8255
PortAEQU0E800H
PortBEQU0E801H
PortCEQU0E802H
PortControlEQU0E803H
ViewIndexDB0
DataENDS
StackSEGMENTSTACK'STACK'
DB100HDUP(?
)
StackENDS
CodeSEGMENT
ASSUMECS:
Code,DS:
Data,SS:
Stack
MainPROC
PUSHDS
XORAX,AX
PUSHAX
MOVAX,Data
MOVDS,AX
myOutPortControl,80H;10000000Bmeans:
;A--mode0,output
;B--mode0,output
;CHigh--output
;CLow--output
animation:
CALLReadSwState
TESTSwState,02H
JZfast
MOVCX,0500H
JMPview
fast:
MOVCX,0200H
view:
CALLShow
LOOPview
CALLUpdateViewIndex
JMPanimation
RET;unreachableinstruction
MainENDP
;procShow
;inputargumentlists:
POINT
ShowPROC
PUSHBX
PUSHCX
PUSHSI
MOVBX,POINT
MOVCL,01H;initialize
;makeCL=00000001B,whichmeansenabletherightmostdigit
MOVSI,0
nextDigit:
myOutPortB,CL;selecttubes
PUSHCX
MOVCL,BYTEPTR[BX+SI];
myOutPortA,CL;selectsegments
POPCX
ROLCL,1;displaytheleftdigitnexttocurrentone
INCSI;nextletter
CALLDelay
CALLCheckAndQuit
CMPSI,6
JNZnextDigit
POPSI
POPCX
POPBX
RET
ShowENDP
DelayPROC
PUSHCX
MOVCX,2000H
loopLabel:
NOP
LOOPloopLabel
POPCX
RET
DelayENDP
checkAndQuitPROC
PUSHAX
MOVAH,0BH;checkwhetheruserinputsomethingfromkeyboard
INT21H
ORAL,AL;ifhedoes,thenreturntoDos
JZexitCheckAndQuit
myOutPortA,00H
myOutPortB,00H
MOVAX,4C00H
INT21H
exitCheckAndQuit:
POPAX
RET
checkAndQuitENDP
UpdateViewIndexPROC
CALLReadSwState
TESTSwState,01H
JNZstillMode
INCPOINT
INCViewIndex
CMPViewIndex,7
JNZexitUpdateViewIndex
MOVPOINT,OFFSETMESG
MOVViewIndex,0
JMPexitUpdateViewIndex
stillMode:
MOVViewIndex,5
MOVPOINT,OFFSETMESG
ADDPOINT,5
exitUpdateViewIndex:
RET
UpdateViewIndexENDP
ReadSwStatePROC
PUSHAX
myInPortSw,SwState
POPAX
RET
ReadSwStateENDP
CodeENDS
ENDMain
经过编译、连接、运行,可以正常运行。
图11HELLO显示
2.2.3.回显小键盘输入
检测行时,往控制口(0EE03H)写控制字88H,使C口(0EE02H)低八位(列)输出,高八位(行)输入。
检测列时,往控制口(0EE03H)写控制字81H,使C口(0EE02H)高八位(行)输出,低八位(列)输入。
首先,我利用debug,获得了每个按键对应的比特,制成了下表。
根据下表,综合行值和列值,就可以知道按下了哪个键。
表3检测到的二进制数与按钮值对应表
测得键值
****0111
****1011
****1101
****1110
1110****
0
1
2
3
1101****
4
5
6
7
1011****
8
9
A
B
0111****
C
D
E
F
在本程序中,设置了防抖动功能和防重复识别功能。
当按下一个键后,一般情况下只会接收到一个值。
但是,如果长按一个键,就会收到下一个值。
这和普通PC键盘的体验相同,贴近广大用户的使用习惯。
源代码:
CODE(recur.asm)
;FILENAME:
recur.asm
;AUTHOR:
XIAO,Zhiqing(No.13,Cl.07105)
;DATE:
20091216
;DESCRIPTION:
displayseventubesarrayaccordingtoinput
;macro:
myOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myOutMACROportAddr,data
PUSHDX
MOVDX,portAddr
MOVAL,data
OUTDX,AL
POPDX
ENDM
;macro:
myDigitOut(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myDigitOutMACROportAddr,data
PUSHDX
PUSHBX
MOVBX,OFFSETSegLut
MOVAL,data
XLATSegLut
MOVDX,portAddr
OUTDX,AL
POPBX
POPDX
ENDM
;macro:
myIn(WARNING:
itmaychangethevalueofAL)
;it'sstronglyrecommendedthatdatabeAL
myInMACROportAddr,data
PUSHDX
MOVDX,portAddr
INAL,DX
MOVdata,AL
POPDX
ENDM
;macro:
testAndSet(WARNING:
refNumandincNumshouldbeINSTANTnumber)
testAndSetMACROsrcData,refNum,incNum
LOCALexitTestAndSet
TESTsrcData,refNum
JNZexitTestAndSet
ORbuttonIndex,incNum
ORbuttonPressed,0FFH
exitTestAndSet:
NOP
ENDM
DataSEGMENT
;SegmentLookupTable
SegLutDB0EDH,21H,0F4H,0F1H,39H;"01234"
DB0D9H,0DDH,61H,0FDH,0F9H;"56789"
DB7DH,9DH,0CCH,0B5H,0DCH,5CH;"ABCDEF"
DB3DH,8CH,00H;'H'(10H)'L'(11H)''(12H)
;Contentindexarraytoprint
ContentDB12H,12H,12H,12H,12H,12H
;8255
PortAEQU0E800H
PortBEQU0E801H
PortCEQU0E802H
PortControlEQU0E803H
;
buttonPressedDB0;0FFHforpressed,00Hfornot.
buttonRowDB0
buttonColDB0
buttonIndexDB0
buttonEnableDW0000H
DataENDS
StackSEGMENTSTACK'STACK'
DB100HDUP(?
)
StackENDS
CodeSEGMENT
ASSUMECS:
Code,DS:
Data,SS:
Stack
MainPROC
PUSHDS
XORAX,AX
PUSHAX
MOVAX,Data
MOVDS,AX
myOutPortControl,80H;10000000Bmeans:
;A--mode0,output
;B--mode0,output
;CHigh--o