北邮微机原理与接口技术2Word下载.docx
《北邮微机原理与接口技术2Word下载.docx》由会员分享,可在线阅读,更多相关《北邮微机原理与接口技术2Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
![北邮微机原理与接口技术2Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/28/77cc917a-e11e-43bc-aaef-ae9db8897246/77cc917a-e11e-43bc-aaef-ae9db88972461.gif)
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
myDigitOut(WARNING:
myDigitOutMACROportAddr,data
PUSHBX
MOVBX,OFFSETSegLut
MOVAL,data
XLATSegLut
POPBX
myIn(WARNING:
myInMACROportAddr,data
INAL,DX
MOVdata,AL
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
PUSHCX
PUSHSI
MOVBX,OFFSETContent
MOVCL,01H;
initialize
makeCL=00000001B,whichmeansenabletheleftmostdigit
MOVSI,0
nextDigit:
myOutPortB,CL;
selecttubes
MOVAL,BYTEPTR[BX+SI];
myDigitOutPortA,AL;
selectsegments
POPCX
ROLCL,1;
displaytheleftdigitnexttocurrentone
INCSI;
nextletter
CALLDelay
CALLCheckAndQuit
CMPSI,6
JNZnextDigit
POPSI
RET
ShowENDP
DelayPROC
MOVCX,0F000H
loopLabel:
NOP
LOOPloopLabel
DelayENDP
checkAndQuitPROC
MOVAH,0BH;
checkwhetheruserinputsomethingfromkeyboard
INT21H
ORAL,AL;
ifhedoes,thenreturntoDos
JZexitCheckAndQuit
myOutPortA,0;
myOutPortB,0;
MOVAX,4C00H
exitCheckAndQuit:
POPAX
checkAndQuitENDP
CodeENDS
ENDMain
经编译、连接、运行,显示正常,且能够成功返回DOS。
图8静态显示学号
2.2.2.动态显示HELLO
要求在数码管电路1-6位数码管上按下图所示的规律,动态显示字符串HELLO,当主机键盘按下任意键时结束。
利用实验一读入端口的功能,控制动态显示的速度。
第一屏
第二屏
第三屏
第四屏
第五屏
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)
Hello.asm
displayHelloonseventubesarray
USAGE:
S0:
UPstill,DOWNmove
S1:
UPslow,DOWNfast
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-'
slow,'
fast
ViewIndexDB0
animation:
CALLReadSwState
TESTSwState,02H
JZfast
MOVCX,0500H
fast:
MOVCX,0200H
LOOPview
CALLUpdateViewIndex
JMPanimation
MOVBX,POINT
makeCL=00000001B,whichmeansenabletherightmostdigit
MOVCL,BYTEPTR[BX+SI];
myOutPortA,CL;
MOVCX,2000H
myOutPortA,00H
myOutPortB,00H
UpdateViewIndexPROC
TESTSwState,01H
JNZstillMode
INCPOINT
INCViewIndex
CMPViewIndex,7
JNZexitUpdateViewIndex
MOVPOINT,OFFSETMESG
MOVViewIndex,0
JMPexitUpdateViewIndex
stillMode:
MOVViewIndex,5
ADDPOINT,5
exitUpdateViewIndex:
RET
UpdateViewIndexENDP
ReadSwStatePROC
myInPortSw,SwState
POPAX
ReadSwStateENDP
经过编译、连接、运行,可以正常运行。
图11HELLO显示
2.2.3.回显小键盘输入
检测行时,往控制口(0EE03H)写控制字88H,使C口(0EE02H)低八位(列)输出,高八位(行)输入。
检测列时,往控制口(0EE03H)写控制字81H,使C口(0EE02H)高八位(行)输出,低八位(列)输入。
首先,我利用debug,获得了每个按键对应的比特,制成了下表。
根据下表,综合行值和列值,就可以知道按下了哪个键。
表3检测到的二进制数与按钮值对应表
测得键值
****0111
****1011
****1101
****1110
1110****
1101****
1011****
B
0111****
D
在本程序中,设置了防抖动功能和防重复识别功能。
当按下一个键后,一般情况下只会接收到一个值。
但是,如果长按一个键,就会收到下一个值。
这和普通PC键盘的体验相同,贴近广大用户的使用习惯。
CODE(recur.asm)
recur.asm
displayseventubesarrayaccordingtoinput
testAndSet(WARNING:
refNumandincNumshouldbeINSTANTnumber)
testAndSetMACROsrcData,refNum,incNum
LOCALexitTestAndSet
TESTsrcData,refNum
JNZexitTestAndSet
ORbuttonIndex,incNum
ORbuttonPressed,0FFH
exitTestAndSet:
NOP
SegLutDB0EDH,21H,0F4H,0F1H,39H;
DB7DH,9DH,0CCH,0B5H,0DCH,5CH;
DB3DH,8CH,00H;
'
H'
(10H)'
L'
(11H)'
(12H)
ContentDB12H,12H,12H,12H,12H,12H
buttonPressedDB0;
0FFHforpressed,00Hfornot.
buttonRowDB0
buttonColDB0
buttonIndexDB0
buttonEnableDW0000H
CHigh--o