ToC
实验内容
使七段共阴极数码管显示如下内容:
- 从右到左逐位显示移动的数字
0~9
。即一开始是0
从右到左移动,然后是1
,然后是2
,以此类推。最后在9
移动完后返回0
,继续循环。 - 使六位数码管从左到右显示稳定的数字
123456
。
实验接线
照着书上连就可以了。在这个实验中,PC
甚至可以不连(笑)
代码
数字滚动
1A8255 EQU 0600H2B8255 EQU 0602H3C8255 EQU 0604H4CON8255 EQU 0606H5
6SSEG SEGMENT STACK7 DW 0, 0, 0, 08SSEG ENDS9
10DATA SEGMENT11 TBL:12 DB 3FH ;; 013 DB 06H ;; 114 DB 5BH ;; 215 DB 4FH ;; 316 DB 66H ;; 417 DB 6DH ;; 518 DB 7DH ;; 619 DB 07H ;; 720 DB 7FH ;; 821 DB 6FH ;; 922 SEQ:23 DB 00011111B ;; POS 024 DB 00101111B ;; POS 125 DB 00110111B ;; POS 226 DB 00111011B ;; POS 327 DB 00111101B ;; POS 428 DB 00111110B ;; POS 529DATA ENDS30
31CODE SEGMENT32ASSUME CS:CODE, DS:DATA, SS:SSEG33START PROC34 MOV AX, DATA35 MOV DS, AX36
37 MOV AL, 10001001B ;; A B OUT, C IN38 MOV DX, CON825539 OUT DX, AL40
41 MOV AX, 0000H42LO:43 CALL PUT44 CALL DELAY45 INC AL46 CMP AL, 647 JNE LO48 MOV AL, 049 INC AH50 CMP AH, 1051 JNE LO52 MOV AH, 053 JMP LO54
55 MOV AX, 4C00H56 INT 21H57START ENDP58
59;; NUM: AH60;; POS: AL61PUT PROC62 PUSH AX63
64 ;; SELECT POS65 LEA BX, SEQ66 PUSH AX67 MOV AH, 068 MOV SI, AX69
70 ;; OUTPUT POS71 MOV DX, A825572 MOV AL, [BX+SI]73 OUT DX, AL74 POP AX75
76 ;; SELECT NUM77 LEA BX, TBL78 MOV AL, AH79 MOV AH, 080 MOV SI, AX81
82 ;; OUTPUT DATA83 MOV DX, B825584 MOV AL, [BX+SI]85 OUT DX, AL86
87 POP AX88 RET89PUT ENDP90
91DELAY PROC92 MOV CX, 0FFFFH93 LOOP $94
95 MOV CX, 0FFFFH96 LOOP $97 RET98DELAY ENDP99
100CODE ENDS101END START
持久显示
1A8255 EQU 0600H2B8255 EQU 0602H3C8255 EQU 0604H4CON8255 EQU 0606H5
6SSEG SEGMENT STACK7 DW 0, 0, 0, 08SSEG ENDS9
10DATA SEGMENT11 TBL:12 DB 3FH ;; 013 DB 06H ;; 114 DB 5BH ;; 215 DB 4FH ;; 316 DB 66H ;; 417 DB 6DH ;; 518 DB 7DH ;; 619 DB 07H ;; 720 DB 7FH ;; 821 DB 6FH ;; 922 SEQ:23 DB 00011111B ;; POS 024 DB 00101111B ;; POS 125 DB 00110111B ;; POS 226 DB 00111011B ;; POS 327 DB 00111101B ;; POS 428 DB 00111110B ;; POS 529DATA ENDS30
31CODE SEGMENT32ASSUME CS:CODE, DS:DATA, SS:SSEG33START PROC34 MOV AX, DATA35 MOV DS, AX36
37 MOV AL, 10001001B ;; A B OUT, C IN38 MOV DX, CON825539 OUT DX, AL40
41 MOV AX, 0000H42LO:43 MOV AX, 0105H44 CALL PUT45 CALL DELAY46
47 MOV AX, 0204H48 CALL PUT49 CALL DELAY50
51 MOV AX, 0303H52 CALL PUT53 CALL DELAY54
55 MOV AX, 0402H56 CALL PUT57 CALL DELAY58
59 MOV AX, 0501H60 CALL PUT61 CALL DELAY62
63 MOV AX, 0600H64 CALL PUT65 CALL DELAY66 JMP LO67
68 MOV AX, 4C00H69 INT 21H70START ENDP71
72;; NUM: AH73;; POS: AL74PUT PROC75 PUSH AX76
77 ;; SELECT POS78 LEA BX, SEQ79 PUSH AX80 MOV AH, 081 MOV SI, AX82
83 ;; OUTPUT POS84 MOV DX, A825585 MOV AL, [BX+SI]86 OUT DX, AL87 POP AX88
89 ;; SELECT NUM90 LEA BX, TBL91 MOV AL, AH92 MOV AH, 093 MOV SI, AX94
95 ;; OUTPUT DATA96 MOV DX, B825597 MOV AL, [BX+SI]98 OUT DX, AL99
100 POP AX101 RET102PUT ENDP103
104DELAY PROC105 MOV CX, 0FFH106 LOOP $107 RET108DELAY ENDP109
110CODE ENDS111END START
实验效果
这里就只展示数字滚动的效果好了(
选做实验
选做实验 1-2
说明
编写显示子程序,实现一个或多个数码管的稳定显示。使用入口参数定义拟显示的位置和显示的内容。
利用(1)实现的子程序,重新完成基本实验 1)和 2)。
实现
这部分其实在上面的实验里已经实现了,就是这个 PUT
函数。它可以将 AH
的数字显示在 AL
的位置上。
1;; NUM: AH2;; POS: AL3PUT PROC4 PUSH AX5
6 ;; SELECT POS7 LEA BX, SEQ8 PUSH AX9 MOV AH, 010 MOV SI, AX11
12 ;; OUTPUT POS13 MOV DX, A825514 MOV AL, [BX+SI]15 OUT DX, AL16 POP AX17
18 ;; SELECT NUM19 LEA BX, TBL20 MOV AL, AH21 MOV AH, 022 MOV SI, AX23
24 ;; OUTPUT DATA25 MOV DX, B825526 MOV AL, [BX+SI]27 OUT DX, AL28
29 POP AX30 RET31PUT ENDP
选做实验 3
说明
在数码管上显示学号后 6
位,并使用 6
个开关控制对应数码管的亮灭。
实现
通过开关控制就可以了,只需要多连一个 8255
即可。
1A8255 EQU 0600H2B8255 EQU 0602H3C8255 EQU 0604H4CON8255 EQU 0606H5
6SSEG SEGMENT STACK7 DW 0, 0, 0, 08SSEG ENDS9
10DATA SEGMENT11 TBL:12 DB 3FH ;; 013 DB 06H ;; 114 DB 5BH ;; 215 DB 4FH ;; 316 DB 66H ;; 417 DB 6DH ;; 518 DB 7DH ;; 619 DB 07H ;; 720 DB 7FH ;; 821 DB 6FH ;; 922 SEQ:23 DB 00011111B ;; POS 024 DB 00101111B ;; POS 125 DB 00110111B ;; POS 226 DB 00111011B ;; POS 327 DB 00111101B ;; POS 428 DB 00111110B ;; POS 529DATA ENDS30
31CODE SEGMENT32ASSUME CS:CODE, DS:DATA, SS:SSEG33START PROC34 MOV AX, DATA35 MOV DS, AX36
37 MOV AL, 10001001B ;; A B OUT, C IN38 MOV DX, CON825539 OUT DX, AL40
41 MOV AX, 0000H42 ;; DISPLAY 18111743LO:44 MOV AX, 0105H45 CALL PUT_COND46
47 MOV AX, 0804H48 CALL PUT_COND49
50 MOV AX, 0103H51 CALL PUT_COND52
53 MOV AX, 0102H54 CALL PUT_COND55
56 MOV AX, 0101H57 CALL PUT_COND58
59 MOV AX, 0700H60 CALL PUT_COND61 JMP LO62
63 MOV AX, 4C00H64 INT 21H65START ENDP66
67;; NUM: AH68;; POS: AL69PUT_COND PROC70 PUSH AX71
72 MOV BX, 173 MOV CL, AL74 SHL BL, CL75
76 MOV DX, C825577 IN AL, DX78
79 TEST BL, AL80 JZ PUT_EXIT81 POP AX82 PUSH AX83 CALL PUT84 CALL DELAY85
86PUT_EXIT:87 POP AX88 RET89PUT_COND ENDP90
91;; NUM: AH92;; POS: AL93PUT PROC94 PUSH AX95
96 ;; SELECT POS97 LEA BX, SEQ98 PUSH AX99 MOV AH, 0100 MOV SI, AX101
102 ;; OUTPUT POS103 MOV DX, A8255104 MOV AL, [BX+SI]105 OUT DX, AL106 POP AX107
108 ;; SELECT NUM109 LEA BX, TBL110 MOV AL, AH111 MOV AH, 0112 MOV SI, AX113
114 ;; OUTPUT DATA115 MOV DX, B8255116 MOV AL, [BX+SI]117 OUT DX, AL118
119 POP AX120 RET121PUT ENDP122
123DELAY PROC124 MOV CX, 0FFH125 LOOP $126 RET127DELAY ENDP128
129CODE ENDS130END START
效果
注意左下角的开关(
选做实验 4
说明
在左侧的三个数码管上显示 123
,每隔 1
秒钟向右移动一位(循环)。
实现
这里用到的是 8254
延时,不过实验的时候 8254
好像出了什么状况不大行。因此以下代码仅供参考。
1A8255 EQU 0600H2B8255 EQU 0602H3C8255 EQU 0604H4CON8255 EQU 0606H5
6C008254 EQU 0640H7C018254 EQU 0642H8C028254 EQU 0644H9CON8254 EQU 0646H10
11SSEG SEGMENT STACK12 DW 0, 0, 0, 013SSEG ENDS14
15DATA SEGMENT16 TBL:17 DB 3FH ;; 018 DB 06H ;; 119 DB 5BH ;; 220 DB 4FH ;; 321 DB 66H ;; 422 DB 6DH ;; 523 DB 7DH ;; 624 DB 07H ;; 725 DB 7FH ;; 826 DB 6FH ;; 927 SEQ:28 DB 00011111B ;; POS 029 DB 00101111B ;; POS 130 DB 00110111B ;; POS 231 DB 00111011B ;; POS 332 DB 00111101B ;; POS 433 DB 00111110B ;; POS 534 POS DB 0535DATA ENDS36
37CODE SEGMENT38ASSUME CS:CODE, DS:DATA, SS:SSEG39START PROC40 ;; INIT 825541 MOV AL, 10001001B42 MOV DX, CON825543 OUT DX, AL44
45 ;; MIR646 MOV AX, OFFSET MIR647 MOV SI, 38H48 MOV [SI], AX49 MOV AX, CS50 MOV SI, 3AH51 MOV [SI], AX52
53 MOV AX, DATA54 MOV DS, AX55
56 ;; INIT 825957 CLI58 MOV AL, 11H59 OUT 20H, AL60 MOV AL, 08H61 OUT 21H, AL62 MOV AL, 04H63 OUT 21H, AL64 MOV AL, 07H65 OUT 21H, AL66 MOV AL, 2FH67 OUT 21H, AL68 STI69
70 ;; INIT 825471 MOV DX, CON825472 MOV AL, 00110110B73 OUT DX, AL74 MOV DX, C00825475 MOV AL, 00H76 OUT DX, AL77 MOV AL, 48H78 OUT DX, AL79
80 MOV AX, 0000H81LO:82 MOV AH, 01H83 MOV AL, POS84 CALL PUT_PRE85 CALL PUT86 CALL DELAY87
88 INC AH89 DEC AL90 CALL PUT_PRE91 CALL PUT92 CALL DELAY93
94 INC AH95 DEC AL96 CALL PUT_PRE97 CALL PUT98 CALL DELAY99
100 JMP LO101
102 MOV AX, 4C00H103 INT 21H104START ENDP105
106MIR6:107 DEC AX108 DEC POS109 CMP POS, 0110 JGE MIR6_END111 ADD POS, 6112MIR6_END:113 IRET114
115PUT_PRE PROC116 CMP AH, 0117 JGE SKIP_AH118 ADD AH, 10119SKIP_AH:120 CMP AL, 0121 JGE FIN_PRE122 ADD AL, 6123FIN_PRE:124 RET125PUT_PRE ENDP126
127;; NUM: AH128;; POS: AL129PUT PROC130 PUSH AX131
132 ;; SELECT POS133 LEA BX, SEQ134 PUSH AX135 MOV AH, 0136 MOV SI, AX137
138 ;; OUTPUT POS139 MOV DX, A8255140 MOV AL, [BX+SI]141 OUT DX, AL142 POP AX143
144 ;; SELECT NUM145 LEA BX, TBL146 MOV AL, AH147 MOV AH, 0148 MOV SI, AX149
150 ;; OUTPUT DATA151 MOV DX, B8255152 MOV AL, [BX+SI]153 OUT DX, AL154
155 POP AX156 RET157PUT ENDP158
159DELAY PROC160 MOV CX, 0FFH161 LOOP $162 RET163DELAY ENDP164
165DELAY_LONG PROC166 MOV CX, 0FFFFH167 LOOP $168 MOV CX, 0FFFFH169 LOOP $170 MOV CX, 0FFFFH171 LOOP $172 MOV CX, 0FFFFH173 LOOP $174 RET175DELAY_LONG ENDP176
177CODE ENDS178END START