⚠感谢我可爱的室友们在实验考试前的一部分学习资料的提供
⚠感谢SWDL(大佬)、ZYLDL(大佬)、LXQDL(大佬)
⚠捕获一只大佬,同是矿大微机原理与接口技术实验考试https://blog.csdn.net/u011377996/article/details/80957490
⭐实验考试要求:
⚠不必担心箱子有没有坏,老师在考试前都会测一遍箱子,找出没有问题的箱子给大家用,但是不排除在考试中途坏掉了的可能性...
(据说后面考试的班级有出现箱子坏了的状况...)
⚠可带书,可带U盘(一定要带之前写的代码,考试就是前面芯片使用的大杂烩),甚至拿手机也么的问题(毕竟网上没原题)
⚠课程分值占比:20%平时(前三次实验+实验报告)+80%考试
⚠考试时间:2小时(如果2h未完成目标,将抽顺序检查成果)
⚠考试分组:4人/组,特殊情况3人/组或5人/组,大概率按学号顺序组安排(这个是老师安排,不能自由组队)
⚠未完成的情况下:据说考试成绩最高给到75(面对老师的提问回答流畅),然后根据表现酌情减分
⭐考试题目(第7套卷子)
键盘+DAC0832锯齿波+软延时(参考实验二中的第三个 [2-3] 和实验三中的第二个 [3-2] )
实验原理图还要画下217页的图6.20???
实验现象:一通电直流电机一直转,从小键盘输入F后,七段LED显示器显示F,直流电机变成锯齿波效果(转 -> 停 -> 转 -> 停),从键盘输入其他字符,七段LED显示器显示输入的字符,但直流电机一直转
用新箱子注意运行是点开始执行,不是开始调试 -> 连续执行,我们组就被这个问题坑了...
⭐实物图有4张,都是一样的,角度稍有不同
⭐话不多说,上代码!!!
;端口地址
PORT_A EQU 0290H;8255A口地址
PORT_B EQU 0291H;8255B口地址
PORT_C EQU 0292H;8255B口地址
PORT_CTL EQU 0293H;8255控制口地址
;数据段,键盘扫描码表
DATA SEGMENT
; 0 1 2 3 4 5 6 7
TABLE DB 77H, 7BH, 7DH, 7EH, 0B7H, 0BBH, 0BDH, 0BEH
; 8 9 A B C D E F
DB 0D7H, 0DBH, 0DDH, 0DEH, 0E7H, 0EBH, 0EDH, 0EEH
;0~F的七段代码编码,实验箱是共阳极接法
TABLE1 DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
DATA ENDS
;代码段
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX
;初始化8255A,方式0,B口做输入,A口和C口输出
MOV DX,PORT_CTL ;指向控制口
MOV AL,10000010B ;控制字
OUT DX,AL ;写入控制字
;向所有行送0
MOV DX, PORT_A ;A口输出
MOV AL,00H
OUT DX,AL ;向A口各位输出
;读列,查看是否所有键均松开
MOV DX,PORT_B
WAIT_OPEN:IN AL,DX;键盘状态读入B口
AND AL,0FH ;只查低四位(列值)
CMP AL,0FH ;是否都为1?(各键都松开? )
JNE WAIT_OPEN ;否,继续查
;各键均已松开,再查列是否有0,即是否有键按下
WAIT_PRES:IN AL,DX ;读B口
AND AL,0FH;只查低四位
CMP AL,0FH;是否有键按下
JE WAIT_PRES;无,等待
;有键按下,延时20ms,消抖动
MOV CX,16EAH
DELAY: LOOP DELAY ;延时20ms
;再查列,看键是否仍被压着
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES;已松开,转出等待压键
;键仍被压着,确定哪一个键被压下
MOV AL,0FEH;先使D0=0
MOV CL,AL ;CL=1111 1110B
NEXT_ROW:MOV DX,PORT_A;A口
OUT DX,AL ;向一行输出低电平
MOV DX, PORT_B ;B口
IN AL,DX ;读入B口状态
AND AL,0FH ;只截取列值
CMP AL,0FH ;是否均为1?
JNE ENCODE ;否,表示有键按下,转去编码
ROL CL ,01 ;均为1,使下行输出0
MOV AL,CL
JMP NEXT_ROW ;查看下行
;已找到有一列为低电平,对压键的行列值进行编码
ENCODE: MOV BX,000FH ;建立地址指针,先指向F键对应的地址
IN AL,DX ;从B口读入行列值
NEXT_TRY:CMP AL,TABLE[BX] ;读入的行列值与表中查得的相等吗?
JE DONE ;相等,转出
DEC BX ;不等,转向下一个(键值较小者)地址
JNS NEXT_TRY ;若地址尚未减为负值,继续查
MOV AH,01 ;若减为负值,置出错码01->AH中
JMP EXIT ;退出
DONE: MOV DX,PORT_C;C口输出
MOV AL,TABLE1[BX];检查0~F的七段代码表
OUT DX,AL
CMP BX,0FH;看这里看这里看这里啊喂!!!这里做出改变,其余和实验[2-3]代码一致,BX中的值与F作比较
JE DIANJI;看这里看这里看这里啊喂!!!这里做出改变,其余和实验[2-3]代码一致,若输入为F,就跳转电机那段
MOV BX,500H;将500H存入BX中,用于双层循环延时
DELAY1: MOV CX,12346;将12356存入CX
DELAY2: LOOP DELAY2;循环DELAY2,每循环一次,CX自减一次
DEC BX;BX减1
JNZ DELAY1;若BX不为0,则跳至DELAY1
JMP START;循环检测该程序
;直流电机的程序
DIANJI:
;锯齿波
BO: MOV AL,0
AGAIN: INC AL;AL=AL+1
MOV DX,280H
OUT DX,AL;数据打入输入寄存器,启动D/A转换
MOV BX,100
DELAY3: MOV CX,10005;双层循环延时,软延时程序
LOOP1: LOOP LOOP1;CX=CX-1
DEC BX
JNZ DELAY3
CMP AL,0
JNZ AGAIN;AL不为0,继续循环,为零则退出
OUT DX,AL;数据打入输入寄存器
JMP BO;循环检测该代码
EXIT: HLT
CODE ENDS
END START
⭐我猜你是在熬夜看代码(噗哈哈哈哈哈哈哈),或者是考场上现学?
⭐嗷,最好是考前看到这篇文章叭,毕竟下面还有大礼包(5张18级考试真题的图)
⭐晚安,预祝成绩理想!!!加油!!!