计算机硬件课程设计 出租车计价器代码
萌到你眼炸
571次浏览
2020年07月29日 10:22
最佳经验
本文由作者推荐
无可奈何意思-钟头
PORT_8253_0 EQU 280H 8253和8255a端口定义
PORT_8253_CTL EQU 283H
PORT_8255_A EQU 288H
PORT_8255_B EQU 289H
PORT_8255_C EQU 28AH
PORT_8255_CTL EQU 28BH
DATA SEGMENT LCD显示字符内码
TABLE1 DW 0BCC6H,0B3CCH,0A3BAH
; 计 程 :
DW ?,?
DW 0A3AEH,0A3B0H,0A3EBH
; . 0 km
DW 0BDF0H,0B6EEH,0A3BAH
; 金 额 :
DW ?,?
DW 0A3AEH,0A3B0H,0D4AAH
; . 0 元
HZ_ADR DB ? 存放显示行起始端口地址
NUMBER DW 0A3B0H,0A3B1H,0A3B2H,0A3B3H,0A3B4H,0A3B5H,0A3B6H,0A3B7H,0A3B8H,0A3B9H
; 0 1 2 3 4 5 6 7 8 9
TEMP1 DB ? 路程十位
TEMP2 DB ? 路程个位
TEMP3 DB ? 金额十位
TEMP4 DB ? 金额个位
DIS DW 0 里程初始为0km
PAY DW 8 白天起步价8元
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
;初始化8255,A口输出,B口输入,C口输出,A口、B口方式0
MOV DX,PORT_8255_CTL
MOV AL,10000010B
OUT DX,AL
;初始化8253,通道0,先低后高,方式3,BCD计数
MOV DX,PORT_8253_CTL
MOV AL,00110111B
OUT DX,AL
MOV DX,PORT_8253_0
MOV AL,00H 每1000个脉冲代表一公里
OUT DX,AL
MOV AL,10H
OUT DX,AL
;从8255读取脉冲信息
JUDGE: MOV DX,PORT_8255_B
IN AL,DX
AND AL,0F0H
TEST AL,10H 判断是否为高电平
JNZ JUDGE 若为高电平,继续检测
PERSON:MOV DX,PORT_8255_B
IN AL,DX
TEST AL,20Htt;判断是否有人
JZ PERSON
INC DIS 若不是高电平了,即有一个脉冲,路程加1km
;设置晚上起步价(在路程为1km时将起步价在原基础上加2)
CMP DIS,1 判断是否超过1km
JA A
IN AL,DX
AND AL,0FH
TEST AL,01H 判断开关状态,闭合高电平表示晚上
JZ A 若最低位为低电平,表示白天
ADD PAY,02H 否则是晚上,起步价由8元变成10元,故加2
;判断是否超过起步里程3km
A: CMP DIS,3 与起步里程比较,判断是否超过3km
JBE TRANS 小于3km则金额仍为起步价,转去求路程和金额的个位和十位
IN AL,DX
AND AL,0FH
TEST AL,01H 检查是否为晚上
JZ DAY 白天
INC PAY 晚上一公里三元
;白天一公里两元
DAY: ADD PAY,02H
;利用除法求十进制的个位和十位
TRANS: MOV AX,DIS
MOV BL,10
DIV BL
MOV TEMP2,AH 路程个位
MOV TEMP1,AL 路程十位
MOV AX,PAY
MOV BL,10
DIV BL
MOV TEMP4,AH 金额个位
MOV TEMP3,AL 金额十位
;将金额、路程的个位、十位分别转换为LCD上显示的内码
LEA BX,NUMBER
ADD BL,TEMP1
ADD BL,TEMP1
MOV AX,[BX]
LEA DI,TABLE1
MOV WORD PTR[DI+6],AX 路程十位
LEA BX,NUMBER
ADD BL,TEMP2
ADD BL,TEMP2
MOV AX,[BX]
LEA DI,TABLE1
MOV WORD PTR[DI+8],AX 路程个位
LEA BX,NUMBER
ADD BL,TEMP3
ADD BL,TEMP3
MOV AX,[BX]
LEA DI,TABLE1
MOV WORD PTR[DI+22],AX 金额十位
LEA BX,NUMBER
ADD BL,TEMP4
ADD BL,TEMP4
MOV AX,[BX]
LEA DI,TABLE1
MOV WORD PTR[DI+24],AX 金额个位
;路程价格输出
SHOW: CALL CLEAR LCD 清除
LEA BX,TABLE1
MOV CH,2 显示第2行信息
CALL LCD_DISP
LEA BX, TABLE1
MOV CH,3 显示第3行信息
CALL LCD_DISP
TT: JMP START TT
CLEAR PROC
MOV AL,0CH
MOV DX, PORT_8255_A
OUT DX,AL 设置CLEAR命令
CALL CMD_SETUP 启动LCD执行命令
RET
CLEAR ENDP
FUNCUP PROC
MOV AL, 34H LCD显示状态命令
OUT DX, AL
CALL CMD_SETUP
RET
FUNCUP ENDP
LCD_DISP PROC
LEA BX, TABLE1
CMP CH, 2
JZ DISP_SEC
MOV BYTE PTR HZ_ADR, 88H 第三行起始端口地址
ADD BX,16 指向第二行信息
JMP NEXT
DISP_SEC:MOV BYTE PTR HZ_ADR,90H
NEXT: MOV CL,8
CONTINUE:PUSH CX
MOV AL,HZ_ADR
MOV DX, PORT_8255_A
OUT DX, AL
CALL CMD_SETUP 设定DDRAM地址命令
MOV AX,[BX]
PUSH AX
MOV AL,AH 先送汉字编码高位
MOV DX,PORT_8255_A
OUT DX,AL
CALL DATA_SETUP 输出汉字编码高字节
CALL DELAY 延迟
POP AX
MOV DX,PORT_8255_A
OUT DX, AL
CALL DATA_SETUP 输出汉字编码低字节
CALL DELAY
INC BX
INC BX 修改显示内码缓冲区指针
INC BYTE PTR HZ_ADR 修改LCD显示端口地址
POP CX
DEC CL
JNZ CONTINUE
RET
LCD_DISP ENDP
CMD_SETUP PROC
MOV DX,PORT_8255_A 指向8255端口控制端口
ADD DX,2
NOP
MOV AL,00000000B PC1置0,pc0置0 (LCD I端=0,W端=0)
OUT DX, AL
CALL DELAY
NOP
MO
V AL,00000100B PC2置1 (LCD E端=1)
OUT DX, AL
NOP
CALL DELAY
MOV AL, 00000000B PC2置0,(LCD E端置0)
OUT DX, AL
CALL DELAY
RET
CMD_SETUP ENDP
DATA_SETUP PROC
MOV DX,PORT_8255_A 指向8255控制端口
ADD DX,2
MOV AL,00000001B PC1置0,PC0=1 (LCD I端=1)
OUT DX, AL
NOP
CALL DELAY
MOV AL,00000101B PC2置1 (LCD E端=1)
OUT DX, AL
NOP
CALL DELAY
MOV AL, 00000001B PC2置0,(LCD E端=0)
OUT DX, AL
NOP
CALL DELAY
RET
DATA_SETUP ENDP
DELAY PROC
PUSH CX
PUSH DX
MOV CX, 0FFFH
X1: LOOP X1
POP DX
POP CX
RET
DELAY ENDP
JMP JUDGE
CODE ENDS
END START