实验一设计数码管电子表 无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
实验一设计数码管电子表 无82班王一舟981070 JNE EXITCHG NE EXITCHG MOV DHO MOV CH O MOV AL. CL EXITCHG: MOV SIOFFSET TIME ADD AL, I MOV ISI, CH MOV ISI+I, CL MOV CL, AL MOVISI+2,DH CMP CL, 60H POP SI JNE EXITCHG POP DX MOV CLO POP CX MOV AL. CH POP AX ADD AL. I RET CHANGE TIME ENDP MOV CHAL CSEG ENDS CMP CH 24H END START 五实验总结: 1.由于与本实验相关的程序上学期编过(在屏幕上显示时间),所以这次实验我的程 序中的主要部分是用的以前的,添加了将时间显示在数码管上的程序。上学期编的 那个程序中,我用三个字节来存储时分秒,这次仍然沿用这个习惯。但这个习惯使 我在编将时间显示在数码管上的子程序( DISPLAY)的时候遇到了困难,因为一个 字节代表的是数码管上的两个位置,所以编查表程序时必须把那个字节的信息拆分 为两个字节再进行査表,这使程序繁琐,可读性降低。如果用六个字节分别存储时 的十位,时的个位,分的十位,分的个位,秒的十位,秒的个位,那么在编显示程 序时确实方便了许多,但是在编改变时间的程序时却会更复杂一些。因此这两种方 法各有利弊 2.在程序的结束 RESET函数中一定要屏蔽用户中断,否则下一次调用程序时就不会 响应中断,这个问题让我耗费了很多时间。 实验二:小键盘按键识另 实验要求 本次实验的要求与前一实验类似但仅要求识别小键盘0~9数字键将小键盘键入的任意 长的0~9数字串,采用左移位动态显示的方法显示在数码管电路上,当小键盘按下”R”时 停止演示 二.程序框图 预置:A口为方式0输出 B口为方式0输入 0C>PA7------PAO PB2----PBO AH Y无键闭合 AH=7?
实验一 设计数码管电子表 无 82 班 王一舟 981070 6 JNE EXITCHG MOV DH,0 MOV AL,CL ADD AL,1 DAA MOV CL,AL CMP CL,60H JNE EXITCHG MOV CL,0 MOV AL,CH ADD AL,1 DAA MOV CH,AL CMP CH,24H JNE EXITCHG MOV CH,0 EXITCHG: MOV SI,OFFSET TIME MOV [SI],CH MOV [SI+1],CL MOV [SI+2],DH POP SI POP DX POP CX POP AX RET CHANGE_TIME ENDP CSEG ENDS END START 五.实验总结: 1. 由于与本实验相关的程序上学期编过(在屏幕上显示时间),所以这次实验我的程 序中的主要部分是用的以前的,添加了将时间显示在数码管上的程序。上学期编的 那个程序中,我用三个字节来存储时分秒,这次仍然沿用这个习惯。但这个习惯使 我在编将时间显示在数码管上的子程序(DISPLAY)的时候遇到了困难,因为一个 字节代表的是数码管上的两个位置,所以编查表程序时必须把那个字节的信息拆分 为两个字节再进行查表,这使程序繁琐,可读性降低。如果用六个字节分别存储时 的十位,时的个位,分的十位,分的个位,秒的十位,秒的个位,那么在编显示程 序时确实方便了许多,但是在编改变时间的程序时却会更复杂一些。因此这两种方 法各有利弊。 2. 在程序的结束 RESET 函数中一定要屏蔽用户中断,否则下一次调用程序时就不会 响应中断,这个问题让我耗费了很多时间。 实验二:小键盘按键识别 一.实验要求: 本次实验的要求与前一实验类似,但仅要求识别小键盘0~9数字键,将小键盘键入的任意 长的 0~9 数字串,采用左移位动态显示的方法显示在数码管电路上,当小键盘按下”R”时 停止演示. 二.程序框图: Y 无键闭合 预置:A 口为方式 0 输出 B 口为方式 0 输入 0 PA7-------PA0 PB2----PB0 AH AH=7?
实验一设计数码管电子表 无82班王一舟981070 N:AH为闭合键“列值” 延时20ms 预置:B口为方式0输出 A口为方式0输入 列值少PB2-PB0 PA7-PAO 根据AX内容,查找键值表,显 示相应的键值 是R? 结束演示 实验电路图: 1 ) 数 码管显示电路 四.8255方式选择控制字
实验一 设计数码管电子表 无 82 班 王一舟 981070 7 N:AH 为闭合键“列值” Y 三.实验电路图: 四.8255 方式选择控制字 延时 20ms 预置:B 口为方式 0 输出 A 口为方式 0 输入 列值 PB2-PB0 PA7-PA0 AL 根据 AX 内容,查找键值表,显 示相应的键值。 是 R? 结束演示
实验一设计数码管电子表 无82班王一舟981070 D6 D5 D4 D3 D2 DI DO 式 选择 A组方式 控制 0=方式0A口1OC上半B组方式 C下半口 B口IO: 01=方式11=输入口O:0=方式01=输入 1=输入 1X=方式20=输出1=输入1=方式10=输出 0=输出 0=输出 五.源程序: TITLE LITTLEKEYBOARD AGAIN SSEG SEGMENT PARA STACK ' STACK CALL DISPLAY DB 256 DUP(O) MOV DX. A 8255 SSEG ENDS MOV AL, O DSEG SEGMENT OUT DX. AL (0->PA7---PAO) A 8255 EQU 210H MOV DX. B 8255 B 8255 EQU 21lH IN AL DX CON 8255 EQU 213H AND AL,000001B(取出PB0—PB2 BUFFER DB 6 DUP(O) CMP AL. 00000111B HANG DB LIE DB MOV LIE,AL(将列值保存) NEWHANG DB CALL DELAY1(延时20m NEWLIE DB MOV DX. CON 8255 TABLE DB MOAL,10010000B 3FH,06H, 5BH, 4FH,66H, 6DH, 7DH,07H 7FH OUT DXAL 6FH (预置A口方式0输入,B口方式0输入) DSEG ENDS MOV DX. A 8255 CSEG SEGMENT NAL DX ASSUME CS: CSEG. DS: DSEG. SS: SSEG MOV HANG,AL(将行值保存) START PROC NEAR CALL GETINPUT MOV AX DSEG ( GETINPUT函数通过行值和列值查出输 MOV DS.AX 入的键值,并将它保存在AL中,如果输入 CALL CLOSEALL 是R则AL赋值为FFH:如果输入非法字符, (关掉数码管,防止因为最初数码管有显示则AL赋值为0AH。) 而使程序执行不正常。) CMP AL, OAH CMPAGAIN JE CMPAGAIN CALL DISPLAY (如果是非法字符则跳回) ( DISPLAY函数用来将 BUFFER中的键值显 CMP AL. OFFH 示在数码管上。) JNE CONTINUE MOV DX. CON 8255 (如果是R则退出程序.) MOV AL,10000010B CALL CLOSEALL OUT DX,AL MOV AH.4CH (设定A口方式0输出B口方式0输入) INT 21H
实验一 设计数码管电子表 无 82 班 王一舟 981070 8 1 D6 D5 D4 D3 D2 D1 D0 五.源程序: TITLE LITTLEKEYBOARD SSEG SEGMENT PARA STACK 'STACK' DB 256 DUP (0) SSEG ENDS DSEG SEGMENT A_8255 EQU 210H B_8255 EQU 211H CON_8255 EQU 213H BUFFER DB 6 DUP(0) HANG DB ? LIE DB ? NEWHANG DB ? NEWLIE DB ? TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH, 6FH, DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG,SS:SSEG START PROC NEAR MOV AX,DSEG MOV DS,AX CALL CLOSEALL (关掉数码管,防止因为最初数码管有显示 而使程序执行不正常。) CMPAGAIN: CALL DISPLAY (DISPLAY函数用来将BUFFER中的键值显 示在数码管上。) MOV DX,CON_8255 MOV AL,10000010B OUT DX,AL (设定 A 口方式 0 输出,B 口方式 0 输入) AGAIN: CALL DISPLAY MOV DX,A_8255 MOV AL,0 OUT DX,AL (0->PA7---PA0) MOV DX,B_8255 IN AL,DX AND AL,00000111B (取出 PB0-PB2 CMP AL,00000111B JE AGAIN MOV LIE,AL(将列值保存) CALL DELAY1(延时 20ms) MOV DX,CON_8255 MOV AL,10010000B OUT DX,AL (预置 A 口方式 0 输入,B 口方式 0 输入) MOV DX,A_8255 IN AL,DX MOV HANG,AL(将行值保存) CALL GETINPUT (GETINPUT 函数通过行值和列值查出输 入的键值,并将它保存在 AL 中,如果输入 是R,则AL赋值为FFH;如果输入非法字符, 则 AL 赋值为 0AH。) CMP AL,0AH JE CMPAGAIN (如果是非法字符则跳回) CMP AL,0FFH JNE CONTINUE (如果是 R 则退出程序.) CALL CLOSEALL MOV AH,4CH INT 21H 方 式 选 择 控 制 字 标 志 A 组方式: 00=方式 0 01=方式 1 1X=方式 2 A 口 IO 1=输入 0=输出 C 上 半 口 IO: 1=输入 0=输出 B 组方式: 0=方式 0 1=方式 1 B 口 IO: 1=输入 0=输出 C 下半口 IO: 1=输入 0=输出
实验一设计数码管电子表 无82班王一舟981070 CONTINUE. CMP LIE. 00000101B CALL CHANGE ( CHANGE函数用来改变 BUFFER中保存的 CMP LIE,00000011B 键值) JE LIE2 MOV DX. CON 8255 MOV AL, OAH MOAL10000010B RET OUT DX, AL LIE2 CMP HANG 00010000B (设定A口方式0输出,B口方式0输入) JE NEXT LLLI MOV ALOAH CALL DISPLAY RET MOV DX, B 8255 NEXT:: MOV AL, OFFH IN AL, DX AND AL, 0000O1lIB LIEO: CMP HANG.O11lll1lB (取出PBO-PB2) JE KEYs CMP AL, 0000O11lB CMP HANG.I011111lB JNE LLL JE KEY J MP CMPAGAIN MOV AL, OAH (不断扫描,如果不松开按键,那么就循环等 RET 待:直到按键松开就跳回。) KEY8: MOV AL, 8 RET RET START ENDP KEY9: MOV AL 9 RET (此函数用以延时20MS) LIEl: CMP HANG.O11l1l1lB DELAY I PROC NEAR JE KEYO PUSH AX CMP HANG.10111111B PUSH CX JE KEYI PUSH DX CMP HANG11011111B MOV AH.86H JE KEY2 MOV CX. O CMP HANG11101111B MOV DX 20000 JE KEY3 INT 15H CMP HANG11110111B POP DX JE KEY4 POP CX CMP HANG.11111011B POP AX JE KEYS RET CMP HANG.11111101B DELAYI ENDP JE KEY6 *水水客水***客**称水*水***客水*****客客*幸 CMP HANG 11111110B ( GETINPUT函数通过行值和列值查出输 JE KEY7 入的键值,并将它保存在AL中,如果输入 MOV AL, OAH 是R则AL赋值为FFH:如果输入非法字符, RET 则AL赋值为0AH。) KEYO: MOV AL, O ETINPUT PROC NEAR RET CMP LIE. 00000110B KEYI: MOV AL I JE LIEO RET
实验一 设计数码管电子表 无 82 班 王一舟 981070 9 CONTINUE: CALL CHANGE (CHANGE 函数用来改变BUFFER中保存的 键值) MOV DX,CON_8255 MOV AL,10000010B OUT DX,AL (设定 A 口方式 0 输出,B 口方式 0 输入) LLL: CALL DISPLAY MOV DX,B_8255 IN AL,DX AND AL,00000111B (取出 PB0-PB2) CMP AL,00000111B JNE LLL JMP CMPAGAIN (不断扫描,如果不松开按键,那么就循环等 待;直到按键松开就跳回。) RET START ENDP ;********************************* (此函数用以延时 20MS) DELAY1 PROC NEAR PUSH AX PUSH CX PUSH DX MOV AH,86H MOV CX,0 MOV DX,20000 INT 15H POP DX POP CX POP AX RET DELAY1 ENDP ;******************************** (GETINPUT 函数通过行值和列值查出输 入的键值,并将它保存在 AL 中,如果输入 是R,则AL赋值为FFH;如果输入非法字符, 则 AL 赋值为 0AH。) GETINPUT PROC NEAR CMP LIE,00000110B JE LIE0 CMP LIE,00000101B JE LIE1 CMP LIE,00000011B JE LIE2 MOV AL,0AH RET LIE2:CMP HANG,00010000B JE NEXT MOV AL,0AH RET NEXT:MOV AL,0FFH RET LIE0:CMP HANG,01111111B JE KEY8 CMP HANG,10111111B JE KEY9 MOV AL,0AH RET KEY8:MOV AL,8 RET KEY9:MOV AL,9 RET LIE1:CMP HANG,01111111B JE KEY0 CMP HANG,10111111B JE KEY1 CMP HANG,11011111B JE KEY2 CMP HANG,11101111B JE KEY3 CMP HANG,11110111B JE KEY4 CMP HANG,11111011B JE KEY5 CMP HANG,11111101B JE KEY6 CMP HANG,11111110B JE KEY7 MOV AL,0AH RET KEY0:MOV AL,0 RET KEY1:MOV AL,1 RET
实验一设计数码管电子表 无82班王一舟981070 KEY2: MOV AL, 2 PUSH SI RET MOV BX OFFSET TABLE KEY3: MOV AL, 3 MOV SLOFFSET BUFFER RET MOV CL. KEY4: MOV AL. 4 KUNHUAN: RE MOV AL,SI KEYS: MOV AL, 5 RET MOV DX. 201H KEY6: MOV AL. 6 OUT DXAL RET MOV DX. 200H KEY7: MOV AL. 7 MOV AL, CL RE OUT DXAL GETINPUT ENDP MOV AL, O ( CHANGE函数用来改变 BUFFER中保存的 OUT DXAL 键值,将 BUFFER中的键值移位,最后 位加入AL中的新键值。) SHL CL. CHANGE PROC NEAR CMP CL 40H PUSHAX JNE XUNHUAN PUSH SI POP SI MOV SLOFFSET BUFFER POP DX MOV AH,SI+1I POP CX MOV ISILAH POP BX MOV AH,SI+2I POPAX MOV ISI+ILAH RET MOV AH,SI+3 DISPLAY ENDP MOV [SI+2,AH k常客水*涂*水*客水客客水容水*称水*水客 MOV AH,SI+4 (此函数用在退出程序时将数码管关闭.) MOV [SI+3,AH CLOSEALL PROC NEAR MOV AH, SI+5I PUSHAX MOV ISI+4L,AH PUSH CX MOV [SI+5,AL PUSH DX POP SI MOV CL. POP AX XUNHUANI RET MOV DX 200H CHANGE ENDP MOV AL, CI 本水客水本客*客*水*客市客布水*称布宗*布客客客 OUT DX.AL ( DISPLAY函数用来将 BUFFER中的键值显 MOV AL, O 示在数码管上。 OUT DXAL DISPLAY PROC NEAR SHL CL. PUSH AX CMP CL 20H PUSH BX JNE XUNHUANI PUSH POP DX PUSH DX POP CX
实验一 设计数码管电子表 无 82 班 王一舟 981070 10 KEY2:MOV AL,2 RET KEY3:MOV AL,3 RET KEY4:MOV AL,4 RET KEY5:MOV AL,5 RET KEY6:MOV AL,6 RET KEY7:MOV AL,7 RET GETINPUT ENDP ;********************************** (CHANGE 函数用来改变BUFFER中保存的 键值,将 BUFFER 中的键值移位,最后一 位加入 AL 中的新键值。) CHANGE PROC NEAR PUSH AX PUSH SI MOV SI,OFFSET BUFFER MOV AH,[SI+1] MOV [SI],AH MOV AH,[SI+2] MOV [SI+1],AH MOV AH,[SI+3] MOV [SI+2],AH MOV AH,[SI+4] MOV [SI+3],AH MOV AH,[SI+5] MOV [SI+4],AH MOV [SI+5],AL POP SI POP AX RET CHANGE ENDP ;********************************** (DISPLAY函数用来将BUFFER中的键值显 示在数码管上。) DISPLAY PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV BX,OFFSET TABLE MOV SI,OFFSET BUFFER MOV CL,1 XUNHUAN: MOV AL,[SI] XLAT MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,CL OUT DX,AL MOV DX,200H MOV AL,0 OUT DX,AL INC SI SHL CL,1 CMP CL,40H JNE XUNHUAN POP SI POP DX POP CX POP BX POP AX RET DISPLAY ENDP ;********************************* (此函数用在退出程序时将数码管关闭.) CLOSEALL PROC NEAR PUSH AX PUSH CX PUSH DX MOV CL,1 XUNHUAN1: MOV DX,200H MOV AL,CL OUT DX,AL MOV AL,0 OUT DX,AL SHL CL,1 CMP CL,20H JNE XUNHUAN1 POP DX POP CX