8086出租车计价器
绝世美人儿
929次浏览
2020年07月29日 10:21
最佳经验
本文由作者推荐
曾的部首-对付
ASSUME CS:CODE
COUNTD_DAY DB 02 初始化白天单价
COUNTD_NIGHT DB 03 初始化夜晚单价
COUNTG DB 00 初始化里程
TIME_HIGH DB 11
TIME_LOW DB 58
BAIWEID DB ?
SHIWEID DB ?
GEWEID DB ?
BAIWEIG DB ?
SHIWEIG DB ?
GEWEIG DB ?
QIANWEIT DB ?
BAIWEIT DB ?
SHIWEIT DB ?
GEWEIT DB ?
SEGTAB DB 3FH,06H,5BH,4FH,66H 数字0-9的码制转换
DB 6DH,7DH,07H,7FH,6FH
IOA0 EQU 20H 设置端口的端口号,8255A0的PA口
IOB0 EQU 22H 8255A0的PB口
IOC0 EQU 24H 8255A0的PC口
IOCON0 EQU 26H 8255A0的控制口
IOA1 EQU 28H 8255A1的PA口
IOB1 EQU 2AH 8255A1的PB口
IOC1 EQU 2CH 8255A1的PC口
IOCON1 EQU 2EH 8255A1的控制口
IOA2 EQU 30H 8255A2的PA口
IOB2 EQU 32H 8255A2的PB口
IOC2 EQU 34H 8255A2的PC口
IOCON2 EQU 36H 8255A2的控制口
START:
MOV AL,90H 设置8255A的控制字,并送往控制口
MOV DX,IOCON0
OUT DX,AL 将控制字送往8255A0,8255A0的PB口用来显示单价
MOV DX,IOCON1
OUT DX,AL 将控制字送往8255A1,8255A1的PB口用来显示里程
MOV DX,IOCON2
OUT DX,AL 将控制字送往8255A2,8255A2的PB口用来显示总价
;初始化8253,端口地址为38H,3AH,3CH,3EH
MOV AL,00110101B
OUT 3EH,AL
MOV AL,01110101B
OUT 3EH,AL
MOV AL,00H
OUT 38H,AL
MOV AL,50H
OUT 38H,AL
MOV AL,00H 设置5秒
OUT 3AH,AL
MOV AL,10H
OUT 3AH,AL
START1: 检测8255A0的PA口的开关0(单价加)是否有按键的行为
MOV DX,IOA0
IN AL,DX 读入PA口的状态
NOT AL
AND AL,01H 判断PA口是否有脉冲
CMP AL,0
JZ START2
MOV AL,TIME_HIGH
CMP AL,19
JNC COUNT_NIGHT
MOV AL,COUNTD_DAY 有按键则应使计算加2
ADD AL,2
MOV COUNTD_DAY,AL
JMP START2
COUNT_NIGHT:
MOV AL,COUNTD_NIGHT 有按键则应使计算加2
ADD AL,3
MOV COUNTD_NIGHT,ALt
START2: 检测8255A2的PA口的开关2(时间加)是否有按键的行为
MOV DX,IOA2
IN AL,DX 读入PA口的状态
NOT AL
AND AL,01H 判断PA口是否有按键
CMP AL,0
JZ START3 无按键则跳转至start3
MOV AL,TIME_LOW 有按键则使计算减1
CMP AL,59
JE JINWEI
ADD AL,1
MOV CX,75h
DELY15: t
LOOP DELY15t
MOV TIME_LOW,AL
JMP START3
JINWEI:
MOV AL,00
MOV TIME_LOW,AL
MOV AL,TIME_HIGH
ADD AL,1
MOV TIME_HIGH,AL
START3: 检测8255A1的PA口开关2(里程加)是否有按键的行为
MOV DX,IOA1
IN AL,DX 读入PA口的状态
NOT AL
AND AL,01H 判断PA口是否有按键
CMP AL
,0
JZ FENJIE 无按键则跳转至fenjie
MOV AL,COUNTG
ADD AL,1 有按键则使公路数加1
MOV CX,80h
DELY13: t
LOOP DELY13t
MOV COUNTG,AL
FENJIE: 价格的分解
MOV AL,TIME_HIGH
CMP AL,19
JNC NIGHT
MOV AL,COUNTD_DAY
MOV AH,0 计算值为8位看,故将高八位清零
MOV CL,10
DIV CL 将单价计算值除以10
MOV GEWEID,AH 余数为单价的个位
MOV AH,0
DIV CL 将上次相除的商再次除以10
MOV SHIWEID,AH 得到的余数为单价的十位
MOV BAIWEID,AL 得到的商为单价的百位
JMP FENJIE1
NIGHT:
MOV AL,COUNTD_NIGHT
MOV AH,0 计算值为8位看,故将高八位清零
MOV CL,10
DIV CL 将单价计算值除以10
MOV GEWEID,AH 余数为单价的个位
MOV AH,0
DIV CL 将上次相除的商再次除以10
MOV SHIWEID,AH 得到的余数为单价的十位
MOV BAIWEID,AL 得到的商为单价的百位
FENJIE1: 里程的分解
MOV AL,COUNTG
MOV AH,0 计算值为八位,故将高八位清零
MOV CL,10
DIV CL 将里程计算值除以10
MOV GEWEIG,AH 得到的余数为里程的个位
MOV AH,0
DIV CL 将上次得到的商除以10
MOV SHIWEIG,AH 得到的余数为里程的十位
MOV BAIWEIG,AL 得到的商为里程的百位
FENJIE2: 时间的分解
MOV AL,TIME_LOW 将时间存入AX中
MOV CL,10
DIV CL 分解时间,将时间除以10
MOV GEWEIT,AH 得到的余数为时间的个位
MOV AH,0
DIV CL 再将上次得到的商除以10
MOV SHIWEIT,AH 得到的余数为时间的十位
MOV BAIWEIT,AL 得到的余数为时间的百位
FENJIE3:
XOR AX,AX 时间的分解
MOV AL,TIME_HIGH 将时间存入AX中
MOV CL,10
DIV CL 分解时间,将时间除以10
MOV BAIWEIT,AH 得到的余数为时间的百位
MOV AH,0
DIV CL 再将上次得到的商除以10
MOV QIANWEIT,AH 得到的余数为时间的千位
DISP: 三个值的显示程序
MOV AL,00011110B 设置PC口的控制字
MOV DX,IOC0
OUT DX,AL 写入8255A0PC口
MOV DX,IOC1
OUT DX,AL 写入8255A1PC口
MOV DX,IOC2
OUT DX,AL 写入8255A2PC口
;显示时间千位
MOV AL,00011100B 设置8255A2的PC口的显示控制字
MOV DX,IOC2
OUT DX,AL 将8255A2的PC口的控制字送到PC口
XOR AX,AX
MOV AL,QIANWEIT 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IO
B2
OUT DX,AL
MOV CX,80h
DELY9:
LOOP DELY9 把将要显示的数据送到8255A2的PB口
MOV AL,00011110B 设置PC口的控制字
MOV DX,IOC0
OUT DX,AL 写入8255A0PC口
MOV DX,IOC1
OUT DX,AL 写入8255A1PC口
MOV DX,IOC2
OUT DX,AL 写入8255A2PC口
;显示价格百位
MOV AL,00011010B 设置8255A0的PC口的显示控制字
MOV DX,IOC0
OUT DX,AL 将8255A0的PC口的控制字送到PC口
MOV DX,IOC1
OUT DX,AL 将控制字送往8255A1,8255A0的PB口用来显示单价
XOR AX,AX
MOV AL,BAIWEID 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB0
OUT DX,AL 把将要显示的数据送到8255A0的PB口
MOV CX,80h
DELY1: t
LOOP DELY1
;里程的百位
MOV AL,00011010B 设置8255A1的PC口的显示控制字
MOV DX,IOC1
OUT DX,AL 将8255A1的PC口的控制字送到PC口
XOR AX,AX
MOV AL,BAIWEIG 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB1
OUT DX,AL
MOV CX,50h
DELY4:
LOOP DELY4 把将要显示的数据送到8255A1的PB
;显示时间百位
MOV AL,00011010B 设置8255A2的PC口的显示控制字
MOV DX,IOC2
OUT DX,AL 将8255A2的PC口的控制字送到PC口
XOR AX,AX
MOV AL,BAIWEIT 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB2
OUT DX,AL
MOV CX,80h
DELY6: t
LOOP DELY6 把将要显示的数据送到8255A2的PB口
;显示后继续全部关闭
MOV AL,00011110B 再设置一次PC口的控制字,并送往各个端口
MOV DX,IOC0
OUT DX,AL
MOV DX,IOC1
OUT DX,AL
MOV DX,IOC2
OUT DX,ALt
;显示价格十位
MOV AL,00010110B 设置8255A0的PC口的显示控制字
MOV DX,IOC0
OUT DX,AL 将8255A0的PC口的控制字送到PC口
XOR AX,AX
MOV AL,SHIWEID 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB0
OUT DX,AL 把将要显示的数据送到8255A0的PB口
MOV CX,80h
DELY2:
LOOP DELY2
;里程的十位
MOV AL,00010110B 设置8255A1的PC口的显示控制字
MOV DX,IOC1
OUT DX,AL 将8255A1的PC口的控制字送到PC口
XOR AX,AX
MOV AL,SHIWEIG 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB1
OUT DX,AL
MOV CX,80h
DELY5:
LOOP DELY5 把将要显示的数据送到8255A1的PB口
;显示时间十位
MOV AL,00010110B 设置8255A2的PC口的显示控制字
MOV DX,IOC2
OUT DX,AL 将8255A2的PC口的控制字送到PC口
XOR AX,AX
MOV AL,SHIWEIT 取出总价十位
M
OV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB2
OUT DX,AL
MOV CX,80h
DELY7: t
LOOP DELY7 把将要显示的数据送到8255A2的PB口
;显示后继续全部关闭
MOV AL,00011110B 再设置一次PC口的控制字,并送往各个端口
MOV DX,IOC0
OUT DX,AL
MOV DX,IOC1
OUT DX,AL
MOV DX,IOC2
OUT DX,AL
;显示价格个位
MOV AL,00001110B 设置8255A0的PC口的显示控制字
MOV DX,IOC0
OUT DX,AL 将8255A0的PC口的控制字送到PC口
XOR AX,AX
MOV AL,GEWEID 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB0
OUT DX,AL 把将要显示的数据送到8255A0的PB口
MOV CX,80h
DELY3: t
LOOP DELY3
;里程的个位
MOV AL,00001110B 设置8255A1的PC口的显示控制字
MOV DX,IOC1
OUT DX,AL 将8255A1的PC口的控制字送到PC口
XOR AX,AX
MOV AL,GEWEIG 取出百位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB1
OUT DX,AL
MOV CX,80h
DELY14:t
LOOP DELY14 把将要显示的数据送到8255A1的PB口
;显示时间个位
MOV AL,00001110B 设置8255A2C口的显示控制字
MOV DX,IOC2
OUT DX,AL 将8255A2C口的控制字送到PC口
XOR AX,AX
MOV AL,GEWEIT 取出总价个位
MOV BX,OFFSET SEGTAB
XLAT SEGTAB
MOV DX,IOB2
OUT DX,AL 把将要显示的数据送到8255A2B口
MOV CX,80h
DELY8: t
LOOP DELY8
JMP START1
CODE ENDS
END START