⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8255a0-4.asm

📁 这是接口课程设计时做的一个控制电机转动的程序
💻 ASM
字号:
;-------------------------------------------------------
;                    程序说明
;实现功能:通过8255A(方式0)实现对输入最大值在数码管上从0
;开始递增显示到最大值,并循环。按小写字母a,暂停,再按继续,
;按回车程序退回DOS
;本程序在显示上有不足,高位数码管总有闪动。
;
;测试专用,仅供参考,适用于唐都TD-PIT实验箱	胖大海
;-------------------------------------------------------
DATA SEGMENT
        IBUF DB 5,0,5 DUP(?)					;输入缓冲区
	D_TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH	;段码表
	W_TABLE DB 1111B,1110B,1101B,1011B,0111B		;位码表
        INFOR1 DB "Please input circle (1~9999):$"		;提示信息
        INFOR2 DB 10,13,"$"
        MAXVALUE DW ?						;记录循环最大值
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
        DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
        ASSUME CS:CODE,DS:DATA,SS:STACK
START:
	MOV AX,DATA
	MOV DS,AX
        MOV AX,STACK
        MOV SS,AX

DSTRING MACRO MESSAGE 		;显示提示信息的宏
	PUSH DX
	PUSH AX
	MOV DX,OFFSET MESSAGE
	MOV AH,09H
	INT 21H
	POP AX
	POP DX
	ENDM

        MOV DX,1043H		;定义控制器端口地址
	MOV AL,10000000B	;定义方式字,方式0、B口输出段码(PB0-PB7对应接A-Dp)、
				;C口低4位输出位码(PC0-PC3对应接数码管的低位-高位)、
				;A口没用到,随便设,这里定义的是输出

	OUT DX,AL		;送方式字	
	
	MOV DI,0FFH		;初始化DI(判断是否为暂停的参数)。值为00FF循环,FF00暂停

        DSTRING INFOR1          ;显示输入数字的提示,范围1~9999
	CALL DTOB		;将键盘输入的十进制数转换为二进制数存于MAXVALUE中
        MOV BX,0		;计数从0开始,BX用来记录当前的计数值

        MOV CX,0FH
LOOPR:  CALL SHOWME             ;将二进制数通过8255A显示到数码管上
        LOOP LOOPR
        
IF_STOP:CMP DI,0FFH		;根据DI的内容判断是否暂停循环
	JNE LOOPN	
	INC BX
        CMP BX,MAXVALUE         ;如果计数值超过定义的最大值,从0开始重新计数
        JBE LOOPN
	MOV BX,0
	
LOOPN:	MOV AH,11		;调用DOS的11号功能,判断是否有按键按下
	INT 21H
	CMP AL,0		;如果没按键则功能调用返回值AL=0,所以将AL和0比较一下
	JE LOOPR		;相等则继续循环显示,反之退出
	
	MOV AH,8		;如果按键,如果是字母a则DI值右循环8位
	INT 21H
        CMP AL,61H
	JNE CHECK_K
	MOV CL,8
	ROL DI,CL
	JMP IF_STOP

        MOV CX,01H
CHECK_K:CMP AL,13		;如果是回车则停止计算,其它按键不理
	JNE LOOPR

        MOV AL,0FH            	;将数码管关掉,节约电力
        MOV DX,1042H    
        OUT DX,AL		
	
	MOV AH,4CH
	INT 21H

;-----------------------------------------------------------------
;将键盘输入的十进制数转换为二进制数的子程序DTOB
DTOB	PROC NEAR 
	PUSHF
	PUSH AX
        PUSH CX
	PUSH DX
	PUSH SI
	MOV DX,OFFSET IBUF
	MOV AH,0AH
	INT 21H
	
	MOV CL,IBUF+1
	MOV CH,0
	MOV SI,OFFSET IBUF+2
	MOV AX,0
AGAIN:	MOV DX,10
	MUL DX
	AND BYTE PTR[SI],0FH
	ADD AL,[SI]
	ADC AH,0
	INC SI
	LOOP AGAIN
        MOV MAXVALUE,AX
	POP SI
	POP DX
        POP CX
	POP AX
	POPF
	RET
DTOB	ENDP
;-----------------------------------------------------------------

;-----------------------------------------------------------------
;将转换后的数字显示在数码管上
;按求十进制的方法从个位开始依次求出当前计数值各位的值,并显示出来
;每位的显示间有延迟
SHOWME	PROC NEAR 
        PUSH AX
        PUSH BX
        PUSH CX
        PUSH DX
        PUSH SI
	MOV SI,1
        MOV AX,BX
	MOV CX,10
LOOP4:	MOV DX,0
	DIV CX
	
	PUSH AX
	PUSH BX

	MOV BX,OFFSET D_TABLE	;先送段码到B口
	MOV AL,DL
	XLAT D_TABLE
	MOV DX,1041H
	OUT DX,AL


	MOV BX,OFFSET W_TABLE	;再送位码到C口
	MOV AX,SI
	XLAT W_TABLE
	MOV DX,1042H
        OUT DX,AL
        
        MOV BX,0FffFH           ;这是通过循环实现延迟
WAIT1:  DEC BX
        CMP BX,0
        JNE WAIT1
        
	POP BX
	POP AX
	INC SI
	OR AX,AX
	JNZ LOOP4

        POP SI
        POP DX
        POP CX
        POP BX
        POP AX
	RET
SHOWME	ENDP
;-----------------------------------------------------------------
CODE ENDS
	END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -