实验一设计数码管电子表 无82班王一舟981070 实验一设计数码管电子表 实验要求: 使用8253的两个计数器串连,作为微机系统的外扩定时源,以数码管电路 作为外扩输出设备,采用中断方式编程,实现数码管电子表“具体要求如 下 六位数码管分别显示时,分,秒 2.初始时间由主机键盘输入。 3.主机按任意键停止计时返回DOS 二:实验电路 GANH0D7D与计算机数据线相连 GATEI OUTO 208H-20FH OUTI 接B4端子 OUT2 S10D A(+5V Al CLKO 2*393 B(8MHz) CLKI IOR- WR 8253 数码管电路 IO地址译码器 CS200H-207H (*注意:A1,A0用来选择8253内部三个计数器中的一个,它们分别与计算机地址线的低两 位相连。RD,WR用来控制8253的读写,它们分别与计算机的IOR,IOW相连) 电路分析: 从Q2出来的时钟频率为1MHZ,为实现一秒钟调用一次中断,必须要每100000时钟调 用一次中断。我们同时将计数器0和计数器1的初值都设为1000并将计数器0的输出OUT0 作为计数器1的时钟,并将计数器1的输出OUTl连到B4端子上,这样就实现了每1000 ×1000=100000次时钟调用一次中断 三.8253控制字格式 D7 D6 D5 D4 D2 DI DO SCI SC2 RLI T RLO M2 MI I M0 BCD] 通道选择 操作类型 方式选择 计数方式 00=计数器000=计数器锁存 000=方式0 0=二进制计数 01=计数器1 01=读/写低字节 001=方式1 1=BCD码计数 10=计数器210=读/写高字节 X10=方式 1l=非法 l1=读/写16位字 Xl=方式 先低字节,后高字节 100=方式 101=方式5
实验一 设计数码管电子表 无 82 班 王一舟 981070 1 实验一 设计数码管电子表 一. 实验要求: 使用 8253 的两个计数器串连,作为微机系统的外扩定时源,以数码管电路 作为外扩输出设备,采用中断方式编程,实现数码管电子表“具体要求如 下: 1.六位数码管分别显示时,分,秒。 2.初始时间由主机键盘输入。 3.主机按任意键停止计时返回 DOS。 二:实验电路 +5V 与计算机数据线相连 208H-20FH 接 B4 端子 A(+5V) A1 Q2 B(8MHZ) A0 IOR IOW 8253 CS 200H-207H (*注意:A1,A0 用来选择 8253 内部三个计数器中的一个,它们分别与计算机地址线的低两 位相连。RD,WR 用来控制 8253 的读写,它们分别与计算机的 IOR,IOW 相连) 电路分析: 从 Q2 出来的时钟频率为 1MHZ,为实现一秒钟调用一次中断,必须要每 1000000 次时钟调 用一次中断。我们同时将计数器 0 和计数器 1 的初值都设为 1000,并将计数器 0 的输出 OUT0 作为计数器 1 的时钟,并将计数器 1 的输出 OUT1 连到 B4 端子上,这样就实现了每 1000 ×1000=1000000 次时钟调用一次中断。 三.8253 控制字格式 D7 D6 D5 D4 D3 D2 D1 D0 SC1 SC2 RL1 RL0 M2 M1 M0 BCD GATE0 D7-D0 GATE1 OUT0 OUT1 CS OUT2 A1 CLK0 A0 CLK1 RD CLK2 WR 2*393 数码管电路 IO 地址译码器 通道选择: 00=计数器 0 01=计数器 1 10=计数器 2 11=非法 操作类型: 00=计数器锁存 01=读/写低字节 10=读/写高字节 11=读/写 16 位字, 先低字节,后高字节 方式选择: 000=方式 0 001=方式 1 X10=方式 2 X11=方式 3 100=方式 4 101=方式 5 计数方式: 0=二进制计数 1=BCD 码计数
实验一设计数码管电子表 无82班王一舟981070 四.程序清单 TITLE DISPTIME 就不断调用 DISPLAY显示TME变量中的 DSEG SEGMENT 时间) INPUT TIM DB 'Please input the current t MOV AH ime:,13,10, INT 16H SHOW TIM DB Time is as the JZ ROTATE follow. Press Ctr-C to exit. 1310'S (按键输入后退出。) BAD DATA DB 'Digits mush be between CALL RESET 0and9,13.10. MOV AH. 4CH BAd HRS DB Hour must be between o INT 2IH and23,13,10,$ RET BAD MINS DB 'Minutes mush beSTART ENDP between 0 and 59 . 13.10'S BAD SECS DB 'Seconds mush be( SERVICE为新的中断程序 between 0 and 59.13.10.S SERVICE PROC NEAR CRLF DB 13.10 S PUSHAX ASK HRS DB Hour(0-23) S PUSH DS ASK MINS DB 'Minute(0-59): S MOVAX DSEG ASK SECS DB 'Second(0-59): S MOV DS.AX USER DB 3, 3 DUP(?) CALL CHANGE TIME TIME DB 3 DUP(?) (函数 CHANGE TIME用以将时间 COUNT DW I 增加一秒) OLDOA DD MOV AL, 20H TABLE OUT2OH,AL(送应答信号) 3FH,06H, 5BH, 4FH, 66H, 6DH, 7DH,07H, 7FH POP DS 6FH77H 7CH39H.5EH. 79H71H POPAX DSEG ENDS RET SSEG SEGMENT STACK STACK SERVICE ENDP DB 256 DUP(?) 客水客客*客水*客涂*客水*客*客 SSEG ENDS (此函数将保存在TME变量中的时间显示 CSEG SEGMENT 在数码管上。) ASSUME DISPLAY PROC NEAR CS: CSEG.SS: SSEG, DS: DSEGES: DSEG PUSHAX START PROC FAR PUSH BX MOV AX DSEG PUSH CX MOV DS.AX PUSH DX CALL GET TIME MOV SIOFFSET TIME CALL18253(初始化8253) MOV BX OFFSET TABLE CALL18259(初始化8259) MOV CL, 4 CALL RDOA MOV AL,[SI (读入原0A中断向量) MOVAHAL CALL WROA(写入新中断向量) SARAL CL ROTATE: CALL DISPLAY(只要不按键 AND AH. OOO01111B 2
实验一 设计数码管电子表 无 82 班 王一舟 981070 2 四.程序清单: TITLE DISPTIME DSEG SEGMENT INPUT_TIM DB 'Please input the current t ime.',13,10,'$' SHOW_TIM DB 'Time is as the follow.Press Ctr-C to exit.',13,10,'$' BAD_DATA DB 'Digits mush be between 0 and 9',13,10,'$' BAD_HRS DB 'Hour must be between 0 and 23',13,10,'$' BAD_MINS DB 'Minutes mush be between 0 and 59',13,10,'$' BAD_SECS DB 'Seconds mush be between 0 and 59',13,10,'$' CRLF DB 13,10,'$' ASK_HRS DB 'Hour(0-23):$' ASK_MINS DB 'Minute(0-59):$' ASK_SECS DB 'Second(0-59):$' USER DB 3,3 DUP(?) TIME DB 3 DUP(?) COUNT DW 1 OLD0A DD ? TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH, 6FH,77H,7CH,39H,5EH,79H,71H DSEG ENDS SSEG SEGMENT STACK 'STACK' DB 256 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:DSEG START PROC FAR MOV AX,DSEG MOV DS,AX CALL GET_TIME CLI CALL I8253 (初始化 8253) CALL I8259 (初始化 8259) CALL RD0A (读入原 0A 中断向量) CALL WR0A(写入新中断向量) ROTATE: CALL DISPLAY(只要不按键, 就不断调用 DISPLAY 显示 TIME 变量中的 时间) MOV AH,1 INT 16H JZ ROTATE (按键输入后退出。) CALL RESET MOV AH,4CH INT 21H RET START ENDP ;************************************ (SERVICE 为新的中断程序) SERVICE PROC NEAR PUSH AX PUSH DS MOV AX,DSEG MOV DS,AX CALL CHANGE_TIME (函数 CHANGE_TIME 用以将时间 增加一秒) MOV AL,20H OUT 20H,AL(送应答信号) POP DS POP AX IRET SERVICE ENDP ;************************************ (此函数将保存在 TIME 变量中的时间显示 在数码管上。) DISPLAY PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV SI,OFFSET TIME MOV BX,OFFSET TABLE MOV CL,4 MOV AL,[SI] MOV AH,AL SAR AL,CL AND AH,00001111B
实验一设计数码管电子表 无82班王一舟981070 XLAT MOV DX.201H MOV DX. 201H OUT DX.AL OUT DX.AL MOV DX. 200H MOV DX. 200H MOV AL,OIH MOVAL 10H OUTDX.AL OUT DX.AL MOVAL O MOV AL, O OUTDX.AL OUT DXAL MOV AL, AH MOV AL, AH XLAT MOV DX.201H MOV DX. 201H OUT DX.AL OUT DX.AL MOV DX. 200H MOV DX. 200H MOVAL 02H MOV AL. 20H OUTDX.AL OUTDXAL MOV AL,O OUTDX.AL OUT DXAL MOV AL,[SI+1l POP SI MOVAHAL POP DX SARAL CL POP CX AND 00001111B POP BX XLAT POPAX MOV DX. 201H RET OUTDX.AL DISPLAY ENDP MOV DX. 200H ,水客**客**客水*客水客凇客水幸客水客水*称水*客客 MOV AL,04H 18253 PROC NEAR OUT DX.AL MOVAL,00110100B MOV AL, O MOV DX. 20BH OUT DX.AL OUT DX.AL MOV AL, AH (设定8253的计算器0,写入时先低字节后 XLAT 高字节,方式2,二进制计数) MOV DX. 201H MOV AX 1000 OUT DX. AL MOV DX. 208H MOV DX. 200H OUT DX.AL MOV AL, 08H MOV AL.AH OUTDX.AL OUT DX.AL MOVAL,O (计数器0的初值设为1000。) OUT DX.AL MOV AL, O1110100B MOV DX. 20BH MOⅤAL[SI+2] OUT DX.AL MOVAHAL (设定8253的计算器1,入时先低字节后高 SARALCL 字节,方式2,二进制计数) ANDAHOOOOII1IB MOVAX 1000
实验一 设计数码管电子表 无 82 班 王一舟 981070 3 XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,01H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,AH XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,02H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,[SI+1] MOV AH,AL SAR AL,CL AND AH,00001111B XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,04H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,AH XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,08H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,[SI+2] MOV AH,AL SAR AL,CL AND AH,00001111B XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,10H OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,AH XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,20H OUT DX,AL MOV AL,0 OUT DX,AL POP SI POP DX POP CX POP BX POP AX RET DISPLAY ENDP ;************************************ I8253 PROC NEAR MOV AL,00110100B MOV DX,20BH OUT DX,AL (设定 8253 的计算器 0,写入时先低字节后 高字节,方式 2,二进制计数) MOV AX,1000 MOV DX,208H OUT DX,AL MOV AL,AH OUT DX,AL (计数器 0 的初值设为 1000。) MOV AL,01110100B MOV DX,20BH OUT DX,AL (设定 8253 的计算器 1,入时先低字节后高 字节,方式 2,二进制计数) MOV AX,1000
实验一设计数码管电子表 无82班王一舟981070 MOV DX. 209H OUT0AHAL(屏蔽用户中断) OUTDX. AL RET RESETENDP OUT DX.AL (计数器1初值设为1000。) (函数 GET TIME的作用是接受用户输入 RET 的时间,并把它保存在6字节变量TME中 18253 ENDP 为了保证程序的严谨,如果输入的时间非 *客客*水*本幸***水本本客幸*容本水*水水幸* 法,则显示出错信息并要求重输。) 18259 PROC NEAR GET TIME PROC NEAR IN AL 21H LEA DX INPUT TIM AND AL.1111101lB MOV AH.9 OUT2IHAL INT2H(提示输入时间) IN AL,OAlH HOUR: LEA DX. ASK HRS AND AL. 11111101B MOV AH.9 OUT OAIHAL INT2H(提示输入小时) RET CALL INPUT TIME 18259 ENDP (函数 INPUT TIME的功能是把用户输入 水*客水*称*水*客水**客水*水客水水*客*水水*水*客 的字符转化为时间值并存放在BL中如果输 RDOA PROC NEAR 入的不是数字,那么让标志寄存器CF=1) MOVAX. 350AH JC HOUR(输入不是数字,重输) INT 21H CMP BL, 23H MOV WORD PTR OLDOA BX NAHRS2 MOV WORD PTR OLDOA+2.ES (如果输入的数字比24小,那么跳到HRS2 RET 去执行下面的内容:如果输入的数字大于等 RDOA ENDP 于24,那么要求重输。对于分,秒的输入也 按照此法处理。) WROA PROC NEAR LEA DX BAD HRS PUSH DS MOV AH MOV AX CSEG MOV DS.AX JMP HOUR MOVDⅹ, OFFSET SERVICE HRS2 PUSH BX MOV AX. 250AH MIN: LEA DX. ASK MINS INT 21H MOV AH.9 POP DS INT 21H RET CALL INPUT TIME WROA ENDP JC MIN CMP BL, 59H RESET PROC NEAR NA MIN2 MOV DX WORD PTR OLDOA LEA DX. BAD MINS MOV DS. WORD PTR OLDOA+2 MOV AH MOV AX. 250AH INT 21H INT21H(恢复原来的中断向量) JMP MIN IN AL,OAlH MIN2 PUSH BX OR AL. 00000010B SEC. LEA DX ASK SECS
实验一 设计数码管电子表 无 82 班 王一舟 981070 4 MOV DX,209H OUT DX,AL MOV AL,AH OUT DX,AL (计数器 1 初值设为 1000。) RET I8253 ENDP ;********************************** I8259 PROC NEAR IN AL,21H AND AL,11111011B OUT 21H,AL IN AL,0A1H AND AL,11111101B OUT 0A1H,AL RET I8259 ENDP ;******************************** RD0A PROC NEAR MOV AX,350AH INT 21H MOV WORD PTR OLD0A,BX MOV WORD PTR OLD0A+2,ES RET RD0A ENDP WR0A PROC NEAR PUSH DS MOV AX,CSEG MOV DS,AX MOV DX,OFFSET SERVICE MOV AX,250AH INT 21H POP DS RET WR0A ENDP ;******************************** RESET PROC NEAR MOV DX,WORD PTR OLD0A MOV DS,WORD PTR OLD0A+2 MOV AX,250AH INT 21H (恢复原来的中断向量) IN AL,0A1H OR AL,00000010B OUT 0A1H,AL (屏蔽用户中断) RET RESET ENDP ;*********************************** (函数 GET_TIME 的作用是接受用户输入 的时间,并把它保存在 6 字节变量 TIME 中。 为了保证程序的严谨,如果输入的时间非 法,则显示出错信息并要求重输。) GET_TIME PROC NEAR LEA DX,INPUT_TIM MOV AH,9 INT 21H (提示输入时间) HOUR: LEA DX,ASK_HRS MOV AH,9 INT 21H (提示输入小时) CALL INPUT_TIME (函数INPUT_TIME 的功能是把用户输入 的字符转化为时间值并存放在 BL 中如果输 入的不是数字,那么让标志寄存器 CF=1) JC HOUR (输入不是数字,重输) CMP BL,23H JNA HRS2 (如果输入的数字比 24 小,那么跳到 HRS2 去执行下面的内容;如果输入的数字大于等 于 24,那么要求重输。对于分,秒的输入也 按照此法处理。) LEA DX,BAD_HRS MOV AH,9 INT 21H JMP HOUR HRS2: PUSH BX MIN: LEA DX,ASK_MINS MOV AH,9 INT 21H CALL INPUT_TIME JC MIN CMP BL,59H JNA MIN2 LEA DX,BAD_MINS MOV AH,9 INT 21H JMP MIN MIN2: PUSH BX SEC: LEA DX,ASK_SECS
实验一设计数码管电子表 无82班王一舟981070 MOV AH.9 SHL BL, CL INT 21H MOV AL USER+3 CALL INPUT TIME CALL CHECK CMP BL 59H AND AL. OFH JNA SEC2 OR BL, LEA DX. BAD SECS CLR CF: CLC MOV AH.9 LEAVE: RET INT 21H INPUT TIME ENDP J MP SEC (以下程序段将输入的的时间保存在 TIME CHECK PROC NEAR 变量中) SEC2: MOV SL OFFSET TIME JB ERROR MOV [SI+21, BL CMP AL, 9 POP BX JA ERROR MOV [SI+I], BL POP BX RET MOV ISI, BL ERROR: LEA DX. BAD DATA RET MOV AH.9 GET TIME ENDP INT2IH (函数 INPUT TIME的功能是把用户输入 的字符转化为时间值并存放在BL中;如果| CHECK ENDP 输入的不是数字,那么让标志寄存器CF (此函数将保存在TME变量中的时间增加 INPUT TIME PROC NEAR 秒) LEA DX. USER CHANGE TIME PROC NEAR MOV AH.OAH PUSH AX INT 21 PUSH CX LEA DX CRLF MOV AH. 9 PUSH SI INT 21H MOV SLOFFSET TIME CMP USER+1. MOV AL,SI JAE CONVERT MOV CHAL MOV BLO MOV AL, SI+1 RET MOV CL AL CONVERT: MOV CL. 4 MOV AL,SI+2 MOV AL, USER+2 MOV DH.AL CALL CHECK (CH:CL:DH=时:分:秒) JC LEAVE MOV AL DH AND AL, OFH ADD AL. MOV BLAL CMP USER+1. 2 MOV DHAL JB CLR CE CMP DH. 6OH
实验一 设计数码管电子表 无 82 班 王一舟 981070 5 MOV AH,9 INT 21H CALL INPUT_TIME JC SEC CMP BL,59H JNA SEC2 LEA DX,BAD_SECS MOV AH,9 INT 21H JMP SEC (以下程序段将输入的的时间保存在 TIME 变量中) SEC2: MOV SI,OFFSET TIME MOV [SI+2],BL POP BX MOV [SI+1],BL POP BX MOV [SI],BL RET GET_TIME ENDP ;************************************ (函数 INPUT_TIME 的功能是把用户输入 的字符转化为时间值并存放在 BL 中;如果 输入的不是数字,那么让标志寄存器 CF= 1) INPUT_TIME PROC NEAR LEA DX,USER MOV AH,0AH INT 21H LEA DX,CRLF MOV AH,9 INT 21H CMP USER+1,1 JAE CONVERT MOV BL,0 RET CONVERT: MOV CL,4 MOV AL,USER+2 CALL CHECK JC LEAVE AND AL,0FH MOV BL,AL CMP USER+1,2 JB CLR_CF SHL BL,CL MOV AL,USER+3 CALL CHECK JC LEAVE AND AL,0FH OR BL,AL CLR_CF: CLC LEAVE: RET INPUT_TIME ENDP ;*********************************** CHECK PROC NEAR CMP AL,'0' JB ERROR CMP AL,'9' JA ERROR CLC RET ERROR: LEA DX,BAD_DATA MOV AH,9 INT 21H STC RET CHECK ENDP ;*********************************** (此函数将保存在 TIME 变量中的时间增加 一秒) CHANGE_TIME PROC NEAR PUSH AX PUSH CX PUSH DX PUSH SI MOV SI,OFFSET TIME MOV AL,[SI] MOV CH,AL MOV AL,[SI+1] MOV CL,AL MOV AL,[SI+2] MOV DH,AL (CH:CL:DH=时:分:秒) MOV AL,DH ADD AL,1 DAA MOV DH,AL CMP DH,60H