微机原理实验8255Word文档下载推荐.doc
《微机原理实验8255Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《微机原理实验8255Word文档下载推荐.doc(10页珍藏版)》请在冰豆网上搜索。
8255B口←AL
有按键?
结束
Y
N
程序代码及注释:
CS0EQU3000H;
片选CS0对应的端口始地址
MY8255_AEQUCS0+00H;
8255的A口地址
MY8255_BEQUCS0+01H;
8255的B口地址
MY8255_CEQUCS0+02H;
8255的C口地址
MY8255_MODEEQUCS0+03H;
8255的控制寄存器地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE
START:
MOVDX,MY8255_MODE;
初始化8255工作方式
MOVAL,82H;
工作方式0,A口输出,B口输入
OUTDX,AL
LOOP1:
MOVDX,MY8255_B;
读B口
INAL,DX
MOVDX,MY8255_A;
写A口
MOVAH,1;
判断是否有按键按下
INT16H
JZLOOP1;
无按键则跳回继续循环,有则退出
QUIT:
MOVAX,4C00H;
结束程序退出
INT21H
CODEENDS
ENDSTART
实验步骤
(1).设计实验线路图,将PCI总线扩展卡上总线与仿真ISA总线进行连接。
(2).编写程序。
(3).打开实验箱电源,运行程序,拨动开关组,观察数据灯的显示。
实验现象:
拨动开关,每个开关对应的数据灯随着开关的开与关而亮灭。
2、流水线指示灯显示实验:
首先分别将A口和B口写入7FH和FEH,然后分别将该数右移和左移一位,在送到端口上,这样循环下去,从而实现流水灯的显示。
8255流水灯显示实验参考接线图如图所示。
8255B口方式0输出
AL←7FH
循环左移AL
延时
DATASEGMENT
LADB?
;
定义数据变量
LBDB?
DATAENDS
CODE,DS:
DATA
MOVAX,DATA
MOVDS,AX
MOVDX,MY8255_MODE;
定义8255工作方式
MOVAL,80H;
工作方式0,A口和B口为输出
写A口发出的起始数据
MOVAL,80H
MOVLA,AL
MOVDX,MY8255_B;
写B口发出的起始数据
MOVAL,01H
MOVLB,AL
CALLDALLY
MOVAL,LA;
将A口起始数据右移再写入A口
RORAL,1
MOVDX,MY8255_A
MOVAL,LB;
将B口起始数据左移再写入B口
ROLAL,1
MOVDX,MY8255_B
DALLYPROCNEAR;
软件延时子程序
PUSHCX
PUSHAX
MOVCX,0FFFH
D1:
MOVAX,0FFFFH
D2:
DECAX
JNZD2
LOOPD1
POPAX
POPCX
RET
DALLYENDP
(3).打开实验箱电源,运行程序,观察数据灯的显示。
数据灯从右向左依次亮成流线型,并始终保持在同一时间只有一个灯亮着。
3.键盘及显示实验
实验要求将8255单元与LED-KEYBOARD单元连接,编写程序,扫描键盘输入,并将扫描结果送数码块显示。
8255键盘及显示实验参考接线图如图3-6所示。
图3-68255键盘及显示实验参考接线图
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATAENDS;
键值表,0~F对应的7段数码管的段位值
MOVSI,3000H;
建立缓冲区,存放要显示的键值
MOVAL,00H;
先初始化键值为0
MOV[SI],AL
MOV[SI+1],AL
MOV[SI+2],AL
MOV[SI+3],AL
MOV[SI+4],AL
MOV[SI+5],AL
MOVDI,3005H
MOVAL,81H;
方式0,A口、B口输出,C口低4位输入
BEGIN:
CALLDIS;
显示刷新
CALLCLEAR;
清屏
CALLCCSCAN;
扫描按键
JNZGETKEY1;
有键按下则跳置GETKEY1
判断PC键盘是否有按键按下
JZBEGIN;
返回到DOS
GETKEY1:
CALLDIS;
CALLDALLY
再次扫描按键
JNZGETKEY2;
有键按下则跳置GETKEY2
JMPBEGIN;
否则跳回开始继续循环
GETKEY2:
MOVCH,0FEH
MOVCL,00H;
设置当前检测的是第几列
COLUM:
MOVAL,CH;
选取一列,将X1~X4中一个置0
MOVDX,MY8255_C;
读Y1~Y4,用于判断是哪一行按键闭合
L1:
TESTAL,01H;
是否为第1行
JNZL2;
不是则继续判断
设置第1行第1列的对应的键值
JMPKCODE
L2:
TESTAL,02H;
是否为第2行
JNZL3;
MOVAL,04H;
设置第2行第1列的对应的键值
L3:
TESTAL,04H;
是否为第3行
JNZL4;
MOVAL,08H;
设置第3行第1列的对应的键值
L4:
TESTAL,08H;
是否为第4行
JNZNEXT;
MOVAL,0CH;
设置第4行第1列的对应的键值
KCODE:
ADDAL,CL;
将第1列的值加上当前列数,确定按键值
CALLPUTBUF;
保存按键值
KON:
扫描按键,判断按键是否弹起
JNZKON;
未弹起则继续循环等待弹起
NEXT:
INCCL;
当前检测的列数递增
MOVAL,CH
TESTAL,08H;
检测是否扫描到第4列
JZKERR;
是则跳回到开始处
ROLAL,1;
没检测到第4列则准备检测下一列
MOVCH,AL
JMPCOLUM
KERR:
JMPBEGIN
CCSCANPROCNEAR;
扫描是否有按键闭合子程序
MOVAL,00H
将4列全选通,X1~X4置0
MOVDX,MY8255_C
INAL,DX;
读Y1~Y4
NOTAL
ANDAL,0FH;
取出Y1~Y4的反值
CCSCANENDP
CLEARPROCNEAR;
清除数码管显示子程序
段位置0即可清除数码管显示
CLEARENDP
DISPROCNEAR;
显示键值子程序
PUSHAX;
以缓冲区存放的键值为键值表偏移找到键值并显示
MOVSI,3000H
MOVDL,0DFH
MOVAL,DL
AGAIN:
PUSHDX
OUTDX,AL;
设置X1~X4,选通一个数码管
MOVAL,[SI];
取出缓冲区中存放键值
MOVBX,OFFSETDTABLE
ANDAX,00FFH
ADDBX,AX
MOVAL,