汇编语言 编写 程序 LED 灯显示

用8255 连接pc机
LED闪烁显示控制
设计要求及方法:
(1) 在C口高4位设置4个按键:Set、 、 、Enter,Set选择两个计数器、 增加时间、减小时间、Enter确定。
(2)设置的时间分别存入两个缓冲单元,按“Enter”键时送两个计数器,计数器采用级连方式,由一个计数器控制LED闪烁。
(3)采用8255的B口和C口低4位驱动2个七段LED数码管,用动态扫描方式显示将发光二极管(LED)点亮的时间(单位:秒,<100秒)

开关控制指示灯显示
MY8255_A EQU 0A860H;8255A口地址
MY8255_B EQU 0A861H;8255B口地址
MY8255_C EQU 0A862H;8255C口地址
MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE
MOV AL,82H
OUT DX,AL ;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1: MOV DX,MY8255_B
IN AL,DX ;读8255 B口内容
MOV DX,MY8255_A
OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容
CALL BREAK ;调用子程序BREAK
JMP A1        ;跳转到A1

BREAK PROC NEAR ;BREAK子程序
MOV AH,1
INT 16H
JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符
MOV AX,4C00H
INT 21H       ;返回DOS 
RETURN:RET

BREAK ENDP

CODE ENDS         
END START  

;流水灯显示
MY8255_A EQU 0b860H;8255A口地址
MY8255_B EQU 0b861H;8255B口地址
MY8255_C EQU 0b862H;8255C口地址
MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT
LA DB ?;留出1个字节
LB DB ?;留出1个字节
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,80H
OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。
MOV DX,MY8255_A
MOV AL,7FH
OUT DX,AL ;将7FH送入A口
MOV LA,AL ;将7FH送入LA存储单元
MOV DX,MY8255_B
MOV AL,0FEH
OUT DX,AL ;将FEH送入B口
MOV LB,AL ;将FEH送入LB存储单元
CALL DALLY
A1: MOV AL,LA
ROR AL,1 ;LA内容循环右移1次
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮
MOV AL,LB
ROL AL,1 ;LB内容循环左移1次
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL ;将循环左移后的LB内容送B口,其目的是让B口连接的LED灯依次向左循环点亮
CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个
CALL BREAK ;调用BREAK子程序,看是否有键按下
JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
RET

BREAK PROC NEAR ;是否有键按下
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN ;若无,则转RETURN
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP

CODE ENDS
END START
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-02
开关控制指示灯显示
MY8255_A EQU 0A860H;8255A口地址
MY8255_B EQU 0A861H;8255B口地址
MY8255_C EQU 0A862H;8255C口地址
MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE
MOV AL,82H
OUT DX,AL ;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1: MOV DX,MY8255_B
IN AL,DX ;读8255 B口内容
MOV DX,MY8255_A
OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容
CALL BREAK ;调用子程序BREAK
JMP A1        ;跳转到A1

BREAK PROC NEAR ;BREAK子程序
MOV AH,1
INT 16H
JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符
MOV AX,4C00H
INT 21H       ;返回DOS 
RETURN:RET

BREAK ENDP

CODE ENDS         
END START  

;流水灯显示
MY8255_A EQU 0b860H;8255A口地址
MY8255_B EQU 0b861H;8255B口地址
MY8255_C EQU 0b862H;8255C口地址
MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT
LA DB ?;留出1个字节
LB DB ?;留出1个字节
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,80H
OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。
MOV DX,MY8255_A
MOV AL,7FH
OUT DX,AL ;将7FH送入A口
MOV LA,AL ;将7FH送入LA存储单元
MOV DX,MY8255_B
MOV AL,0FEH
OUT DX,AL ;将FEH送入B口
MOV LB,AL ;将FEH送入LB存储单元
CALL DALLY
A1: MOV AL,LA
ROR AL,1 ;LA内容循环右移1次
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮
MOV AL,LB
ROL AL,1 ;LB内容循环左移1次
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL ;将循环左移后的LB内容送B口,其目的是让B口连接的LED灯依次向左循环点亮
CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个
CALL BREAK ;调用BREAK子程序,看是否有键按下
JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
RET

BREAK PROC NEAR ;是否有键按下
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN ;若无,则转RETURN
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP

CODE ENDS
END START
第2个回答  2011-07-01
300块,可写。
相似回答