现在的位置: 首页 > 综合 > 正文

8255实现秒表

2017年06月15日 ⁄ 综合 ⁄ 共 2975字 ⁄ 字号 评论关闭

我们做的是秒表

下面是我们的代码:

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定时功能另加(这里只是使用了简单的模拟延时函数,不准确),开关功能需另加。

资料:

DOS和BIOS功能调用

可编程并行接口芯片8255A及其应用

可编程定时/计数器8254及其应用

Tdpit实验室做汇编实验时用到的软件

ISIS7 Professional一个模拟硬件环境的软件

其他一些书籍,就有劳各位自己查找

抱歉!评论已关闭.