汇编源代码
(关键代码和子程序必须有说明)
CT EQU 0E06H ;8255控制口地址
PA EQU 0E00H ;8255A口地址
PB EQU 0E02H ;8255B口地址
PC EQU 0E04H ;8255C口地址
IOW EQU 0F06H ;8255控制口地址
IOA EQU 0F00H ;8255A口地址
IOB EQU 0F02H ;8255B口地址
IOC EQU 0F04H ;8255C口地址
CCT EQU 0D06H ;8253控制口地址
COUNT0 EQU 0D00H ;8253计数器0地址
DATA SEGMENT
SEGMENT_TABLE DB 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 90h, 0CEH, 89H, 0bFH ; 段码表
BUFFER DB 1, 2, 0, 0 ; 10代表'T',11代表'H',12代表数码管灭,0代表关闭
MOTOR_TABLE DB 1, 3, 2, 6, 4, 0CH, 8, 9 ; 电机码表
ZERO DB 0
CHARGE_MINUTES DW 0
CHARGE_HOURS DW 0
FUNCTION_MINUTES DW 0
FUNCTION_HOURS DW 0
DATA ENDS
STACK SEGMENT STACK
DW 1000 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV AL,80H
MOV DX,IOW
OUT DX,AL
MOV DX,CT
MOV AL,92H
OUT DX,AL
MOV AL,30H
MOV DX,CCT
OUT DX,AL
LA:
CALL DISPLAY
MOV DX, PA;读A口
IN AL, DX
TEST AL, 1;标志位是否按下
JZ L0
; 充电模式
MOV AL, 0;关灯
MOV DX, PC
OUT DX, AL
CALL DELAY1S;延时一秒程序
CALL CHARGE_ADJUST;充电调整程序
JMP LA
L0:
MOV DX, PA;读A口
IN AL, DX
TEST AL, 2;判定运行标志位
JNZ LA;未运行跳LL
CALL DELAY1S
CALL USEC
JMP LA ;循环
CHARGE_ADJUST PROC;充时调整子程序
DEC CDMIN;减去1
CMP CDMIN,0FFFFH;判定超限
JNZ C0;跳出
MOV CDMIN,59
DEC CDHOR;FD自减1
CMP CDHOR,0FFFFH
JNZ C0;跳出
MOV CDHOR,0
MOV CDMIN,0;清零单元
JMP C1
C0:INC FDMIN;加上1
CMP FDMIN,60
JNZ C1;跳出
MOV FDMIN,0
INC FDHOR;FD自减1
CMP FDHOR,60
JNZ C1;跳出
MOV FDHOR,60
MOV FDMIN,0;清零单元
C1:RET
CHARGE_ADJUST ENDP
KEY PROC;按键子程序
MOV DX,PA
IN AL,DX;读A口
TEST AL,4;判定自增
JNZ K1;未按下跳K1
INC CDMIN;分钟自增1
CMP CDMIN,60
JNZ KWAIT
MOV CDMIN,0
JMP KWAIT
K1:TEST AL,8;判定自增
JNZ KWAIT;未按下跳K1
INC CDHOR;分钟自增1
CMP CDHOR,60
JNZ KWAIT
MOV CDHOR,0
KWAIT: MOV DX,PA
IN AL,DX;读A口
AND AL,0CH
CMP AL,0CH
JNZ KWAIT;等待抬起
RET
KEY ENDP
DELAY1S PROC;延时子程序
MOV AX,1000;送初值
MOV DX,COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL;定时1秒
WAIT0: MOV DX,PA
IN AL,DX;读开关
TEST AL,1
JNZ Q0;充电模式跳Q0
CMP ZER,0
JZ Q2
JMP Q1
Q2: CALL MOTOR
JMP Q1
Q0: CALL KEY
Q1: CALL DISP
MOV DX,PB
IN AL,DX
TEST AL,2
JNZ Q3
MOV CDMIN,0
MOV CDHOR,0
MOV FDMIN,0
MOV FDHOR,0
Q3:TEST AL,1
JZ WAIT0
RET
DELAY1S ENDP
USEC PROC;时间计算子程序
MOV CL,1;存入绿灯
MOV ZER,0
DEC FDMIN;减去1
CMP FDMIN,0FFFFH;判定超限
JNZ U0;跳出
MOV FDMIN,59
DEC FDHOR;FD自减1
CMP FDHOR,0FFFFH
JNZ U0;跳出
MOV FDHOR,0
MOV FDMIN,0;清零单元
MOV ZER,1
MOV CL,2
U0:MOV DX,PC
MOV AL,CL
OUT DX,AL;点亮灯
RET
USEC ENDP
DISPLAY PROC;显示子程序
PUSH SI
PUSH DI
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DX,PA;读开关
IN AL,DX
TEST AL,1
JZ DI0
MOV AX,CDHOR
MOV BL,10;除10分解
DIV BL
MOV BUF,AL
MOV BUF+1,AH
MOV AX,CDMIN
MOV BL,10;除10分解
DIV BL
MOV BUF+2,AL
MOV BUF+3,AH
JMP DI1
DI0:MOV AX,FDHOR
MOV BL,10;除10分解
DIV BL
MOV BUF,AL
MOV BUF+1,AH
MOV AX,FDMIN
MOV BL,10;除10分解
DIV BL
MOV BUF+2,AL
MOV BUF+3,AH
DI1:LEA SI,BUF ;SI指向显示缓冲区
MOV DI,1 ;DI是位选初值
MOV CX,4 ;循环4次
DDD:MOV AL,[SI] ;取缓冲区的值
LEA BX,TAB
XLAT ;换码
MOV DX,IOA ;送段选
OUT DX,AL
MOV AX,DI ;送位选
MOV DX,IOB
OUT DX,AL
PUSH CX
MOV CX,200 ;延时显示
LOOP $
POP CX
MOV AL,0
OUT DX,AL ;关闭位选
INC SI ;指向下一个缓冲区
SHL DI,1 ;修正位选
LOOP DDD
POP DX
POP CX
POP BX
POP AX
POP DI
POP SI
RET
DISPLAY ENDP
MOTOR PROC;电机控制子程序
LEA SI,MOT;电机码表
MOV CX,8;循环8次
M0:MOV AL,[SI];取数
MOV DX,IOC
OUT DX,AL;送码表
CALL DISP
CALL DISP
CALL DISP;延时
INC SI
LOOP M0
RET
MOTOR ENDP
CODE ENDS
END START
8086设计自行车计时器
需积分: 0 81 浏览量
2024-01-18
18:16:04
上传
评论
收藏 48KB ZIP 举报
m0_66046407
- 粉丝: 0
- 资源: 1