微机原理与接口技术
实验报告
实验内容:微机原理综合设计
组别: 姓名:
班级: 学号:
一、实验目的 1.利用所学知识设计简单计算器。 二、实验内容
利用8255控制试验箱上的键盘,实现2位十进制数以内的加减乘除运算,将运算结果通过8250发送到上位机。键盘为10个数字键0-9,六个功能键 +、-、*、/、=、复位。
三、实验方法
1.设计思路
⑴.根据题目要求首先应该实现试验箱上的键盘扫描功能,计算按下键码的键值(键值检测中应该加入相应的延时程序以达到精确扫描的目的)。再进行加减乘除算数运算,通过8250芯片发送到上位机,利用串口小助手实现算数。 2.实验程序流程图。 开始
初始化 按键闭合? N
Y
按键扫描
N
按键恢复?
Y
保存键值
进行算数运算 输出结果
结束
四、实验源程序(必要的文字注释)
1.简单计算器程序。 ASSUME CS:CODE
CODE SEGMENT ORG 100H
START: MOV DX,04A6H ;控制寄存器地址 MOV AX,90H ;设置为A口输入,;B口输出,C输出 OUT DX,AX ;8255初始化
MOV AX,0 MOV DS,AX AAA: MOV DI,2000H MOV CX,10 CCC1: MOV DS:[DI],0 INC DI
LOOP CCC1 MOV DI,2000H
MOV DX,486H
MOV AX,80H OUT DX,AX MOV DX,480H MOV AX,12 OUT DX,AX MOV DX,482H MOV AX,0 OUT DX,AX MOV DX,486H MOV AX,7 OUT DX,AX MOV DX,482H MOV AX,0 OUT DX,AX MOV DX,48AH IN AX,DX
MOV DX,480H IN AX,DX
CHECK0: ;CHECK0检测是否有健被按下
MOV AX,OOH ;C口的PC0、PC1、PC2作为行选择线 MOV DX,04A4H ;C口地址
OUT DX,AX; 写入C口内容00H,即令所有行为低电平
MOV DX,04A0H ;A口地址
IN AX,DX ;读入A口的内容
CMP AL,OFFH ;判定是否有列线为低电平
JE CHECK0 ;没有,无闭合键,则循环等待
MOV CX,05FFH ;延迟常数,可以修改来改变延时时间 DELAY:
LOOP DELAY ;有,则延迟清除抖动,当cx=0时则停止该循环行 扫描键盘和列扫描键盘,确定被按键的行值和列值 MOV CL,3 ;行数 MOV AH,0
MOV AL,0FBH ; 0fbh=1111 1011B
CONTIN: PUSH AL ;将ax的内容(0fbh)入栈保存 MOV DX,04A4H ;C口地址 OUT DX,AL ;写入C口内容0fbh=1111 1011B,即将第三行置为低电平 MOV DX,04A0H ;A口地址 IN AL,DX ;读入A口的内容 MOV AH,AL ;将A口的内容送入ah CMP GH,0FFH ;判断是否有列线为低电平 JNE NEXT ;比较结果不等于0则转移,即有列线为低电平 POP AX ; 比较结果等于0,即没有列线为低电平,(ax)=00fbh ROR AL,1 ; fbh(1111 1011B)循环右移,(al)=1111 1101检测下一行 LOOP CONTIN ;循环扫描下一行,确定行
JMP CHECK0 ;若所有行都没有被按下,则返回check0重新检测 NEXT: MOV CH,CL ;保存行值至ch
MOV CL,7 ;列值从0开始编号0-7
BEGIN0: SHL AH,1 ; ah为A口的内容,逻辑左移1位,末位补0 JNC GOON ;无进位则转移,即可确定列 LOOP BEGIN0 ;继续循环,确定列 JMP CHECK0
GOON: ;计算显示码在discode中的位置:(行数-1)*8 +列值 MOV BL,CL ;保存列值至BL
DEC CH ;行数减1 MOV CL,3
SHL CH,CL ;左移三位即相当于减1之后的行数*8
ADD DL,CH ;确定显示码在discode表中的偏移量,即(行数-1)*8+列值 MOV BH,0
MOV CX,BX ;显示码在discode表中的偏移量送CX
DISPLAY: ;显示输出 MOV SI, OFFSET DISCODE ADD SI,CX ;显示码偏移地址 MOV DX,040AH ;C口地址 MOV AL,0FH OUT DX,AL ;写入C口内容,使位控(LED1)有效
MOV AL,CS:[SI] ; 取被按键的显示字形码送入al MOV DX,04A2H;B口地址
OUT DX,AL ; 将显示字形码送B口输出显示 NOP NOP
CMP AL,3fh JNZ L1 MOV AH,0 JMP NEXT1
L1: ;定义键码子程序L1 CMP AL,06h JNZ L2 MOV AH,1 JMP NEXT1
L2: ;定义键码子程序L2 CMP AL,5bh JNZ L3 MOV AH,2 JMP NEXT1
L3: ;定义键码子程序L3 CMP AL,4fh JNZ L4 MOV AH,3 JMP NEXT1
L4: ;定义键码子程序L4 CMP AL,66h JNZ L5 MOV AH,4 JMP NEXT1
L5: ;定义键码子程序L5 CMP AL,6dh JNZ L6 MOV AH,5 JMP NEXT1
L6: ;定义键码子程序L6 CMP AL,7dh JNZ L7 MOV AH,6 JMP NEXT1 L7:
CMP AL,07h
JNZ L8 MOV AH,7 JMP NEXT1
L8: ;定义键码子程序L8 CMP AL,7fh JNZ L9
JMP NEXT1 L9:
CMP AL,6fh ;AL与6FH比较
JNZ L10 ;若ZF=0则存入L10中 MOV AH,9 JMP NEXT1 L10:
CMP AL,77h JNZ L11 MOV AH,10 JMP NEXT1 L11:
CMP AL,7ch JNZ L12 MOV AH,11 JMP NEXT1 L12:
CMP AL,39h JNZ L13 MOV AH,12 JMP NEXT1 L13:
CMP AL,5eh JNZ L14 MOV AH,13 JMP NEXT1 L14:
CMP AL,79h JNZ L15 JMP NEXT1 L15:
CMP AL,71h JMP AAA
NEXT1:
MOV DS:[DI],AH INC DI
CMP DI,2004H CALL DELAY1 JE ACLT
JMP CHECK0
ACLT: MOV AX,0 MOV DX,0
MOV DI,2000H ;将2000H送入DI
MOV AL,DS:[DI] ;将DS:[DI]的地址送入AL MOV DL,DS:[DI+2] MOV BL,DS:[DI+1] CMP BL,10
JNZ K1
ADD AL,DL
PUSH AX ;将AX压栈
JMP LOOP1 ;转移到LOOP1地址 K1:
CMP BL,11 JNZ K2 SUB AL,DL PUSH AX JMP LOOP1 K2:
CMP BL,12 JNZ K3 MUL DL PUSH AX JMP LOOP1 K3:CMP BL,13 JNZ LOOP1 DIV DL PUSH AX JMP LOOP1
PPP: LOOP1:
CALL DELAY1 CALL SEND
JMP KKK
DELAY1: ;延时子程序 MOV CX,0FFFFH LLL:
LOOP LLL RET
SEND: PUSH AX
MOV DX,48AH SEND1: IN AX,DX JNZ SEND2 JMP SEND1 SEND2: POP AX
MOV DX,480H OUT DX,AL RET KKK:
JMP CHECK0
DISCODE DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h;(0-7) ;定义各键码
DB 7fh,6fh,77h,7ch,39h,5eh,79h,71h ;(8-F) DB 01h,02h,04h,08h,10h,20h,40h,80h;(abcdefgh) ;显示字形码表 CODE ENDS ;代码段结束 END START ;程序段结束 五.实验结果
简单计算器1位十进制实验结果截图。
六.实验中遇到的问题及解决办法。
1.开始的时候自己编写的程序是按照4x4键盘编写,但实验室中所用到的试验箱是3x8的键位分布。原本编写的键盘扫描程序要进行修改。经过第一次的尝试我们失败了。之后我们经过请教同学和自己修改终于让我们看到了希望,程序能过成功的进行键盘扫描。
2.之后的实验结果再一次无情的打击到我,实验并未能按照预期的要求实现2位十进制数的计算而只能进行一位十进制数的计算,两位十进制数无法正常的输入。由于自身知识掌握的不够扎实最后并未成功的解决。
七、心得体会与建议
我的心得真的太多,综合设计实验也让我看清自己的不足,对于这个实验虽然自己花了很多的时间但并未得到预想的结果。微机原理理论课程已经学完了自己真正的学到了多少知识只有自己知道。我一直都是以一种消极的态度对待这门课程而显然我也为自己的愚蠢付出代价。还有最后的宝贵日子希望自己能够好好地把握。同时我觉得自己在编程上很有问题该花更多的时间在编程上。这一次的实验也是对自己的一次清醒认识吧! 感谢老师的殷切教导。
因篇幅问题不能全部显示,请点此查看更多更全内容