实验报告:计数器

实  验  报  告

班    级          学号        姓  名      同组人            

实验日期            室温        大气压        成  绩       

 

第二篇:倒计数器实验报告

<1>编程使用四位LED同时显示5A7C

(要求将5A7C设在数据段并用XLAT译码显示)

程序如下:

COMA EQU 60H

COMB EQU 61H

COMC EQU 62H

COMMODE EQU 63H

STACK SEGMENT STACK

DW 64 DUP(?)

STACK ENDS

DATA SEGMENT

DMTABLE DB 3FH,06H,5BH,4FH,66H,6DH

DB 7DH,07H,7FH,6FH

DB 77H,7CH,39H,5EH,79H,71H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:MOV AX,DATA

MOV DS,AX

MOV AL,89H ;方式0,A口、B口输出,C口输入

OUT COMMODE,AL

MOV SI,3000H ;建立缓冲区,存放要显示的键值

MOV [SI],05H

MOV [SI+1],0AH

MOV [SI+2],07H

MOV [SI+3],0CH

MOV DI,3004H

BEGIN:

CALL DIS ;显示刷新

CALL CLEAR ;清屏

JNZ BEGIN

DIS PROC NEAR ;显示子程序

PUSH AX

MOV SI,3000H

MOV DL,7FH

MOV AL,DL

AGAIN:

OUT COMB,AL

MOV AL,[SI]

MOV BX,OFFSET DMTABLE

XLAT DMTABLE

OUT COMA,AL

CALL DALLY

INC SI

MOV AL,DL

TEST AL,0EFH

JZ OUT1

ROL AL,1

MOV DL,AL

JMP AGAIN

OUT1:

POP AX

RET

DIS ENDP

CLEAR PROC NEAR ;清除数码管显示子程序

MOV AL,00H

OUT COMA,AL

RET

CLEAR ENDP

DALLY PROC NEAR ;延时子程序

PUSH CX

MOV CX,0009H

A1: MOV AX,0030H

A2: DEC AX

JNZ A2

LOOP A1

POP CX

RET

DALLY ENDP

CODE ENDS

END START

实验结果:数码管上显示5A7C,按键无效

实验三:

<2>编程使键盘为:上行:5C7F 下行:E0A4 ,并能左移显示

<3>在<2>的基础上,按动A显示ABCD,按动5显示0123,按动C显示98EF

<3>的程序如下:

COMA EQU 60H

COMB EQU 61H

COMC EQU 62H

COMMODE EQU 63H

STACK SEGMENT STACK

DW 64 DUP(?)

STACK ENDS

DATA SEGMENT

DMTABLE DB 79H,3FH,77H,66H

DB 6DH,39H,07H,71H

DB 3FH,06H,5BH,4FH

DB 77H,7CH,39H,5EH

DB 6FH,7FH,79H,71H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:MOV AX,DATA

MOV DS,AX

MOV AL,89H ;方式0,A口、B口输出,C口输入

OUT COMMODE,AL

MOV SI,3000H ;建立缓冲区,存放要显示的键值

MOV [SI],01H

MOV [SI+1],01H

MOV [SI+2],01H

MOV [SI+3],01H

MOV DI,3004H

BEGIN:CALL DIS ;显示刷新

CALL CLEAR ;清屏

CALL CCSCAN ;扫描按键

JNZ INK1 ;有按键按下,则跳转

JMP BEGIN

INK1: CALL DIS ;消抖

CALL DALLY

CALL DALLY

CALL CLEAR

CALL CCSCAN

JNZ INK2

JMP BEGIN

INK2: MOV CH,7FH

MOV CL,00H

COLUM:MOV AL,CH ;键盘扫描

OUT COMB,AL

IN AL,COMC

L1: TEST AL,20H

JNZ L2

MOV AL,00H

JMP KCODE

L2: TEST AL,10H

JNZ NEXT

MOV AL,04H

KCODE:ADD AL,CL ;AL为按键键值

MOV SI,3000H ;判断按键是否为A,5,C

CMP AL,04H

JZ DIS0123

CMP AL,02H

JZ DISABCD

CMP AL,05H

JZ DIS98EF

CALL PUTBUF ;保存按键值

CALL UNPRESS ;松手检测

NEXT: INC CL ;检测下一列

MOV AL,CH

TEST AL,10H

JZ KERR

ROR AL,1

MOV CH,AL

JMP COLUM

KERR: JMP BEGIN

DIS0123:MOV [SI],08H

MOV [SI+1],09H

MOV [SI+2],0AH

MOV [SI+3],0BH

JMP BEGIN

DISABCD:MOV [SI],0CH

MOV [SI+1],0DH

MOV [SI+2],0EH

MOV [SI+3],0FH

JMP BEGIN

DIS98EF:MOV [SI],10H

MOV [SI+1],11H

MOV [SI+2],12H

MOV [SI+3],13H

JMP BEGIN

CCSCAN PROC NEAR ;扫描按键是否按下

MOV AL,00H

OUT COMB,AL

IN AL,COMC

NOT AL

AND AL,30H

RET

CCSCAN ENDP

CLEAR PROC NEAR ;清除数码管显示子程序

MOV AL,00H

OUT COMA,AL

RET

CLEAR ENDP

DIS PROC NEAR ;显示键值子程序

PUSH AX

PUSH CX

PUSH DX

MOV SI,3000H

MOV DL,7FH

MOV AL,DL

AGAIN:

OUT COMB,AL

MOV AL,[SI]

XOR AH,AH

MOV BX,OFFSET DMTABLE

ADD AX,BX

MOV DI,AX

MOV AL,[DI]

OUT COMA,AL

CALL DALLY

INC SI

MOV AL,DL

TEST AL,10H

JZ OUT1

ROR AL,1

MOV DL,AL

JMP AGAIN

OUT1:

POP DX

POP CX

POP AX

RET

DIS ENDP

PUTBUF PROC NEAR ;保存键值并左移子程序

PUSH BX

MOV SI,3000H

MOV BL,[SI+1]

MOV [SI],BL

MOV BL,[SI+2]

MOV [SI+1],BL

MOV BL,[SI+3]

MOV [SI+2],BL

MOV [SI+3],AL

POP BX

RET

PUTBUF ENDP

UNPRESS PROC NEAR ;松手检测

PUSH AX

KON: CALL DIS

CALL CLEAR

CALL CCSCAN

JNZ KON

POP AX

RET

UNPRESS ENDP

DALLY PROC NEAR ;延时子程序

PUSH CX

PUSH AX

MOV CX,0009H

A1: MOV AX,0030H

A2: DEC AX

JNZ A2

LOOP A1

POP AX

POP CX

RET

DALLY ENDP

CODE ENDS

END START

实验结果:按动A,数码管显示ABCD,按动5显示0123,按动C显示98EF,按动

其他键,数码管显示相应键值,并左移显示。

实验四:

3.要求实现:

a)定义键盘按键,5个为数字键2、3、4、5、9,3个功能键:设置SET、清零 CLR、开始START;

b)显示器上的四位显示为秒(两位)、10毫秒(两位);

c)通过键盘的按键SET,可以设置倒计数器初始时间(最大为55秒);

d)按START键启动倒计数直到计到零停止,或松开START键停止计数,按CLR 键清零。

程序如下:

COMA EQU 60H

COMB EQU 61H

COMC EQU 62H

COMMODE EQU 63H

STACK SEGMENT STACK

DW 64 DUP(?)

STACK ENDS

DATA SEGMENT

DMTABLE DB 3FH,06H,5BH,4FH,66H,6DH

DB 7DH,07H,7FH,6FH,00H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:MOV AX,DATA

MOV DS,AX

MOV AL,89H ;方式0,A口、B口输出,C口输入

OUT COMMODE,AL

ZERO1:MOV SI,3000H ;建立缓冲区,存放要显示的键值

XOR AL,AL

MOV [SI],AL

MOV [SI+1],AL

MOV [SI+2],AL

MOV [SI+3],AL

MOV DI,3004H

BEGIN:CALL DIS ;显示刷新

CALL CLEAR ;清屏

CALL CCSCAN ;扫描按键

JNZ INK1 ;有按键按下,则跳转

JMP BEGIN

INK1: CALL DIS ;消抖

CALL DALLY

CALL DALLY

CALL CLEAR

CALL CCSCAN

JNZ INK2

JMP BEGIN

INK2: MOV CH,7FH

MOV CL,00H

COLUM:MOV AL,CH ;键盘扫描

OUT COMB,AL

IN AL,COMC

L1: TEST AL,20H

JNZ L2

MOV AL,02H

JMP KCODE

L2: TEST AL,10H

JNZ NEXT

MOV AL,06H

KCODE:ADD AL,CL ;AL为按键键值

CMP AL,08H ;判断是否为功能键

JZ SET

CMP AL,06H

JZ BEGIN

CMP AL,07H

JZ ZERO1

JMP BEGIN

CALL UNPRESS ;松手检测

NEXT: INC CL ;检测下一列

MOV AL,CH

TEST AL,10H

JZ KERR

ROR AL,1

MOV CH,AL

JMP COLUM

KERR: JMP BEGIN

SET: MOV SI,3000H ;功能键设置入口

XOR AL,AL

MOV [SI],AL

MOV [SI+1],AL

MOV [SI+2],AL

MOV [SI+3],AL

CALL UNPRESS

CALL INPUT ;等待输入

CALL UNPRESS

CMP AL,06H

JZ START1

CMP AL,07H

JZ SET

CMP AL,08H

JZ SET

MOV SI,3000H

MOV [SI+1],AL

CALL INPUT

CMP AL,06H

JZ START1

CMP AL,07H

JZ SET

CMP AL,08H

JZ SET

CMP AL,05H ;判断是否大于55

JS X2

MOV AL,[SI+1]

CMP AL,09H

JNZ X1

MOV AL,05H

MOV [SI+1],AL

X1: MOV AL,05H

X2: MOV SI,3000H

MOV [SI],AL

X3: CALL INPUT

CMP AL,06H

JZ START1

CMP AL,07H

JZ SET

CMP AL,08H

JZ SET

JMP X3

START1:CALL CCSCAN ;扫描START是否一直按着

JNZ COUNT

JMP BEGIN

ZERO: XOR AL,AL

MOV SI,3000H

MOV [SI],AL

MOV [SI+1],AL

MOV [SI+2],AL

MOV [SI+3],AL

JMP BEGIN

COUNT:CALL DIS ;10毫秒显示减一

MOV SI,3000H

MOV DH,[SI]

MOV DL,[SI+1]

MOV CH,[SI+2]

MOV CL,[SI+3]

DEC CL

CMP CL,0FFH

JNZ X4

MOV CL,09H

DEC CH

X4: CMP CH,0FFH

JNZ X5

MOV CH,09H

DEC DL

X5: CMP DL,0FFH

JNZ X6

MOV DL,09H

DEC DH

X6: CMP DH,0FFH

JZ ZERO

MOV [SI],DH

MOV [SI+1],DL

MOV [SI+2],CH

MOV [SI+3],CL

CALL DELLY

JMP START1

CCSCAN PROC NEAR ;扫描按键是否按下

MOV AL,00H

OUT COMB,AL

IN AL,COMC

NOT AL

AND AL,30H

RET

CCSCAN ENDP

CLEAR PROC NEAR ;清除数码管显示子程序

MOV AL,00H

OUT COMA,AL

RET

CLEAR ENDP

DIS PROC NEAR ;显示键值子程序

PUSH AX

PUSH CX

PUSH DX

MOV SI,3000H

MOV DL,7FH

MOV AL,DL

AGAIN:

OUT COMB,AL

MOV AL,[SI]

XOR AH,AH

MOV BX,OFFSET DMTABLE

ADD AX,BX

MOV DI,AX

MOV AL,[DI]

OUT COMA,AL

CALL DALLY

INC SI

MOV AL,DL

TEST AL,10H

JZ OUT1

ROR AL,1

MOV DL,AL

JMP AGAIN

OUT1:

POP DX

POP CX

POP AX

RET

DIS ENDP

UNPRESS PROC NEAR ;松手检测

PUSH AX

KON: CALL DIS

CALL CLEAR

CALL CCSCAN

JNZ KON

POP AX

RET

UNPRESS ENDP

INPUT PROC NEAR

COLUM1:CALL DIS

MOV CH,7FH

MOV CL,00H

COLUM2:MOV AL,CH

OUT COMB,AL

IN AL,COMC

L3: TEST AL,20H

JNZ L4

MOV AL,02H

JMP KCODE1

L4: TEST AL,10H

JNZ NEXT1

MOV AL,06H

JMP KCODE1

NEXT1:INC CL

MOV AL,CH

TEST AL,10H

JZ COLUM1

ROR AL,1

MOV CH,AL

JMP COLUM2

KCODE1:ADD AL,CL ;AL为按键键值

RET

INPUT ENDP

DALLY PROC NEAR ;延时子程序

PUSH CX

PUSH AX

MOV CX,0009H

A1: MOV AX,0030H

A2: DEC AX

JNZ A2

LOOP A1

POP AX

POP CX

RET

DALLY ENDP

DELLY PROC NEAR ;10毫秒减一延时计数

PUSH CX

PUSH AX

MOV CX,0010H

B1: MOV AX,0014H

B2: DEC AX

JNZ B2

LOOP B1

POP AX

POP CX

RET

DELLY ENDP

CODE ENDS

END START

实验结果:<1>数码管前两位为秒数,后两位为10毫秒数,最大倒计时数为55秒, 设置秒数时,若检测到秒数大于55,则自动将秒数改为55。

<2>按动SET键,可以设置倒计数器初始时间,期间按CLR键可对设 置秒数重新设置,再按START键启动倒计数直到计到零停止,或 松开START键停止计数,按CLR键清零。

设计心得:

此次课程设计收获真的很大。我从中学会了如何系统地设计一个小系统,让它实现你想要的结果。同时也培养了我发现问题,找出问题到最后解决问题的能力。此次课程设计可谓一波三折,主要时间花在调试上面。到了上机验证的时候,我才发现我的设计还存在着这样那样的漏洞。有些东西逻辑上没问题,但物理实现上却很困难,要把这些因素都考虑进去,你的设计才会更加合理。在做倒计数器的时候,因为少加了一个松手检测的程序,按下SET键的时候,已经同时把它送到要输入的时间单元里。刚开始我还以为是等待输入程序的问题,通过单步调试,确定没问题后才恍然大悟。所以,程序的每一步都要仔细考虑清楚,容不得半点马虎。总之,这次难得的上机调试经历给我积累了很多宝贵的经验,更加培养了我对编程的兴趣,是一次很好的学习机会。

参考文献:

微型计算机原理及应用 许立梓 何小敏 陈玮 高明琴 编 机械工业出版社

微型计算机原理及应用——习题解答、实验指导及课程设计

相关推荐