我们做的是秒表
下面是我们的代码:
LWLC.ASM
<span style="font-size:18px">DATA SEGMENT ;8255各个端口地址 IO8255A EQU 1460H IO8255B EQU 1461H IO8255C EQU 1462H IO8255K EQU 1463H ;8254各个端口地址 IO82540 EQU 1440H IO82541 EQU 1441H IO82542 EQU 1442H IO8254K EQU 1443H LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段码0---9 COUNT DW ? ;交替显示次数 COUNTIN DW ? ;延迟函数内循环循环次数 NUMA DB ? ;十位数 NUMB DB ? ;个位数 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: ;初始化DS MOV AX,DATA MOV DS,AX ;初始化8255 ;8255写入控制字98H---->10011000B ;PB,PC0--PC3口均输出,A口,PC4----PC7为输入 MOV AL,98H ;10011000B MOV DX,IO8255K OUT DX,AL MOV NUMA,00H MOV NUMB,00H DISPLY: MOV COUNT, 500 MOV BX, OFFSET LED MOV BP,COUNT ;交替显示十位(A)和个位(B) SHOW: ;显示十位数 MOV AL, NUMA XLAT ;查表 MOV DX, IO8255B OUT DX, AL ;将该数的LED数码管字形代码送到B口 MOV DX, IO8255C ;接通8段代码管的第一位,在LED上显示十位数 MOV AL, 11111011B OUT DX, AL CALL DELAY CALL DECIDE ;显示个位数 MOV AL, NUMB XLAT MOV DX, IO8255B OUT DX, AL MOV DX, IO8255C MOV AL, 11111101B OUT DX, AL CALL DELAY CALL DECIDE DEC COUNT JZ SHOW JMP CHANGEB ;该数字显示完,对其+1 ;B+1操作的代码段为: CHANGEB: INC NUMB ;个位自加 CMP NUMB, 09H ;个位与9比较 JG CHANGEB ;如果个位大于9,那么进入改变十位(CHANGEA)代码段 JMP DISPLY ;否则,显示数字 ;A+1操作的代码段为: CHANGEA: MOV NUMB,00H ;个位置0 INC NUMA ;十位自加 CMP NUMA,09H ;十位与9比较 JG RESET JMP DISPLY ;否则,显示数字 ;A,B置数为0 RESET: MOV NUMA,00H JMP DISPLY ;软延时函数为: DELAY PROC NEAR MOV CX, 5000 ;上次过程次数缓存 DELAY0: MOV COUNTIN, 5 DELAY1: DEC COUNTIN JNZ DELAY1 LOOP DELAY0 RET DELAY ENDP ;Press any key to exit DECIDE PROC MOV AH, 0BH ;11号功能判断是否有键按下 INT 21H CMP AL, 0FFH JE EXIT RET EXIT: MOV AH,4CH INT 21H DECIDE ENDP CODE ENDS END START </span>
<span style="font-size:18px">DATA SEGMENT ;8255各个端口地址 IO8255A EQU 1460H IO8255B EQU 1461H IO8255C EQU 1462H IO8255K EQU 1463H ;8254各个端口地址 IO82540 EQU 1440H IO82541 EQU 1441H IO82542 EQU 1442H IO8254K EQU 1443H LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段码0---9 COUNT DW ? ;交替显示次数 COUNTIN DW ? ;延迟函数内循环循环次数 NUMA DB ? ;十位数 NUMB DB ? ;个位数 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: ;初始化DS MOV AX,DATA MOV DS,AX ;初始化8255 ;8255写入控制字98H---->10011000B ;PB,PC0--PC3口均输出,A口,PC4----PC7为输入 MOV AL,98H ;10011000B MOV DX,IO8255K OUT DX,AL MOV NUMA,00H MOV NUMB,00H DISPLY: MOV COUNT, 500 MOV BX, OFFSET LED MOV BP,COUNT ;交替显示十位(A)和个位(B) SHOW: ;显示十位数 MOV AL, NUMA XLAT ;查表 MOV DX, IO8255B OUT DX, AL ;将该数的LED数码管字形代码送到B口 MOV DX, IO8255C ;接通8段代码管的第一位,在LED上显示十位数 MOV AL, 11111011B OUT DX, AL CALL DELAY CALL DECIDE ;显示个位数 MOV AL, NUMB XLAT MOV DX, IO8255B OUT DX, AL MOV DX, IO8255C MOV AL, 11111101B OUT DX, AL CALL DELAY CALL DECIDE DEC COUNT JZ SHOW JMP CHANGEB ;该数字显示完,对其+1 ;B+1操作的代码段为: CHANGEB: INC NUMB ;个位自加 CMP NUMB, 09H ;个位与9比较 JG CHANGEB ;如果个位大于9,那么进入改变十位(CHANGEA)代码段 JMP DISPLY ;否则,显示数字 ;A+1操作的代码段为: CHANGEA: MOV NUMB,00H ;个位置0 INC NUMA ;十位自加 CMP NUMA,09H ;十位与9比较 JG RESET JMP DISPLY ;否则,显示数字 ;A,B置数为0 RESET: MOV NUMA,00H JMP DISPLY ;软延时函数为: DELAY PROC NEAR MOV CX, 5000 ;上次过程次数缓存 DELAY0: MOV COUNTIN, 5 DELAY1: DEC COUNTIN JNZ DELAY1 LOOP DELAY0 RET DELAY ENDP ;Press any key to exit DECIDE PROC MOV AH, 0BH ;11号功能判断是否有键按下 INT 21H CMP AL, 0FFH JE EXIT RET EXIT: MOV AH,4CH INT 21H DECIDE ENDP CODE ENDS END START </span>
电路图:
额,之所以命名为LWLC.ASM,是因为这是我的小伙伴们自己亲自完成的,很有纪念,于是用我们的首字母来命名。细心阅读代码和电路图的同学,肯定注意到,电路图上连接的某些元件并没有用上,是的,你没有看错,当然,我也没错。只是我的代码并没写完全(故意的),你只要在自己的理解上进行添加就行,当然,就这样用的话,也不会出问题,只要注意下端口地址就行了。
提示:端口地址需要根据实际情况修改,不过还好(使用了宏),8254定时功能另加(这里只是使用了简单的模拟延时函数,不准确),开关功能需另加。
资料:
其他一些书籍,就有劳各位自己查找