目录
电梯控制器设计
要求:利用8255控制4*4键盘与LCD显示屏,利用8255控制步进电机正、反转,完成电梯上下方向控制,LCD屏显示上行、下行、开门、关门、楼层号显示。
语言环境:汇编
课题的任务与要求
4*4键盘进行楼层的输入,LCD显示电梯运行信息,包括当前楼层、运行方向、开关门状态等,8255进行控制和计算。
电梯控制器系统功能下所示:
- LCD显示开关门以及所在楼层
- LCD显示电梯上下行
- 键盘模拟楼层按键
- 电机模拟电梯上下行过程
利用8255控制4*4键盘与LCD显示屏,利用8255控制步进电机正、反转,完成电梯上下方向控制,LCD屏显示上行、下行、开门、关门、楼层号显示。 学习相关硬件的使用原理,如步进电机,LCD显示器等的工作原理。同时在 PC端搭建开发环境用于相关软件开发。利用步进电机,8255 控制芯片以及 LCD 显示器搭建一套 简单的电梯运行控制系统。
系统的组成及主要工作原理:
扫描键盘获取目标楼层,用目标楼层与当前电梯所在楼层比较,若目标楼层高于当前所在楼层则调用电梯上升程序,用电机转动模拟电梯上升。若目标楼层低于电梯所在楼层则电机反转,模拟电梯下降。若目标楼层等于电梯所在楼层则处于开门状态。每到达一层都要比较一下所在楼层与目标楼层。同时根据比较结果在LCD显示器上显示当前电梯状态。
系统测试表
键盘点击 | 电机状态 | LCD显示结果 |
初始状态 | 静止 | 1 开门 |
1 | 静止 | 1 开门 |
2 | 顺时针转动 | 1 电梯上升 2 开门 |
4 | 顺时针转动 | 2 电梯上升 3 电梯上升 4 开门 |
3 | 逆时针转动 | 4 电梯下降 3 开门 |
界面:
PORT_A equ 280H
PORT_B equ 281H
PORT_C equ 282H
PORT_CON equ 283H
DATA SEGMENT
TABLE1 DW 0770H,0B70H,0D70H,0E70H,07B0H,0BB0H,0DB0H,0EB0H
DW 07D0H,0BD0H,0DD0H,0ED0H,07E0H,0BE0H,0DE0H,0EE0H ;键盘扫描码表
HZ_TAB
DW 0A3B1H,0A3B1H,0A3B1H,0A3B2H,0A3B3H,0A3B4H,0A3B5H,0A3B6H,0A3B7H,0A3B8H
;第一行信息?当前楼层(1~9对应的汉字码)
DW 0BFAAH,0C3C5H,0a1a0h,0a1a0h ;第二行信息 (开门)
DW 0B5E7H,0CCDDH,0C9CFH,0C9FDH ;第三行信息 (电梯上升)
DW 0B5E7H,0CCDDH,0CFC2H,0BDB5H ;第四行信息 (电梯下降)
HZ_ADR DB ? ;存放显示行起始端口地址
BUF DB 0
NUM DB 0;用于存放楼层号
KEYNUM DB 0;;
CHECK DB 0;
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN:
MOV AX,CS
MOV DS,AX
MOV AX,DATA
MOV DS,AX
MOV NUM,01H;初始默认在一楼
MOV KEYNUM,01H
CALL LCDSHOW
START:
MOV DX,PORT_CON ;初始化8255控制字
MOV AL,81H ; ;C口低四位输入
OUT DX,AL
CALL KEY
KEY PROC
KEY_LOOP:
MOV DX,PORT_C;;
MOV AL,0FH
OUT DX,AL
IN AL,DX ;读行扫描值(取列值)
AND AL,0FH
CMP AL,0FH
JZ KEY_LOOP ;未发现有键按下则转
CALL KEYDELAY ;DELAY FOR AMOMENT
MOV AH,AL
MOV DX,PORT_CON
MOV AL,88H ; ;C口高四位输入
OUT DX,AL
MOV DX,PORT_C
MOV AL,AH
OR AL,0F0H
OUT DX,AL
IN AL,DX ;读列扫描值
AND AL,0F0H
CMP AL,0F0H
JZ KEY_LOOP ;未发现有键按下则转
MOV SI,OFFSET TABLE1 ;键盘扫描码表首址
MOV CX,16
KEY_TONEXT:
CMP AX,[SI] ;CMP (COL,ROW) WITH EVERY WORD
JZ NUMCMP ;IN THE TABLE
DEC CX
JZ KEY_LOOP ;未找到对应扫描码
ADD SI,2
INC KEYNUM; ;用于存放键盘点击的楼层号
JMP KEY_TONEXT
NUMCMP:
MOV AL,NUM
CMP AL,KEYNUM
JE KEEPSHOW
CALL LCDSHOW
CALL MOTOR
JMP NUMCMP
KEEPSHOW:
CALL LCDSHOW
MOV KEYNUM,01
JMP START
KEY_WAITUP:
MOV DX,PORT_CON
MOV AL,81H
OUT DX,AL
MOV DX,PORT_C
MOV AL,0FH
OUT DX,AL
IN AL,DX ;读行扫描值
AND AL,0FH
CMP AL,0FH
JNZ KEY_WAITUP ;按键未抬起转
CALL KEYDELAY ;DELAY FOR AMOMENT
RET ;调显示子程序,显示得到的字符
KEY ENDP
KEYDELAY PROC NEAR
PUSH AX
MOV AH,0
INT 1AH
MOV BX,DX
DELAY1:
MOV AH,0
INT 1AH
CMP BX,DX
JZ DELAY1
MOV BX,DX
DELAY2:
MOV AH,0
INT 1AH
CMP BX,DX
JZ DELAY2
POP AX
RET
KEYDELAY ENDP
MOTOR PROC
PUSH AX
PUSH CX
MOV DX,PORT_CON
MOV AL,80H
OUT DX,AL;8255初始化
MOV BUF,33H
MOV CX,40;用来控制移位次数(进而实现一次运转时间)
OUT1:
DEC CX
JZ CK ;等于零就跳出子程序
MOV AL,BUF
MOV DX,PORT_B;;只用了四位
AND AL,0F0H
OUT DX,AL
MOV AL,NUM
CMP AL,KEYNUM
JB CW;;所在楼层小于按键楼层顺时针转
JG ACW;;所在楼层大于按键楼层逆时针转
CW:
MOV CHECK,01H
MOV BL,0FFH
CALL DELAY
MOV AL,BUF
ROL AL,1
MOV BUF,AL
JMP OUT1
ACW:
MOV CHECK,00H
MOV BL,0FFH
CALL DELAY
MOV AL,BUF
ROR AL,1
MOV BUF,AL
JMP OUT1
CK:
MOV AL,01H;
CMP AL,CHECK
JZ UP
JNZ DOWN
UP: ;楼层加一
INC NUM
JMP RETURN
DOWN: ;楼层减一
DEC NUM
JMP RETURN
RETURN:
POP CX
POP AX
RET
MOTOR ENDP
DELAY PROC ; ;NEAR要求子程序与被调程序在同一代码段
PUSH CX ;通用寄存器压栈,不影响外面记录移位次数的CX
DELAY01: MOV CX,0FFFH;05A4H
DELAY02: LOOP DELAY02
DEC BL
JNZ DELAY01
POP CX
RET
DELAY ENDP ;跟PROC成对出现
;CODE ENDS
;END MOTOR
LCDSHOW PROC
PUSH AX
PUSH CX
MOV DX,PORT_CON
MOV AL,80H
OUT DX,AL ;8255初始化
MOV AL,0FFH
MOV DX,300H
OUT DX,AL
CALL CLEAR
LEA BX,HZ_TAB
CALL LCD_DISP
POP CX
POP AX
RET
LCDSHOW ENDP
CLEAR PROC
MOV AL,0CH
MOV DX,PORT_A ;唤醒
OUT DX,AL ;设置CLEAR命令
CALL CMD_SETUP ;启动LCD执行命令
RET
CLEAR ENDP
LCD_DISP PROC
LEA BX,HZ_TAB
MOV BYTE PTR HZ_ADR,80H
CONTINUE1:
PUSH CX
MOV AL,HZ_ADR
MOV DX,PORT_A
OUT DX,AL
CALL CMD_SETUP
MOV AL,NUM
MOV AH,0H
MOV CX,AX
LOOP1:
INC BX
INC BX
LOOP LOOP1
MOV AX,[BX]
PUSH AX
MOV AL,AH
MOV DX,PORT_A
OUT DX,AL;先送高八位
CALL DATA_SETUP
CALL DELAY0
POP AX
MOV DX,PORT_A
OUT DX,AL;;再送低八位
CALL DATA_SETUP
CALL DELAY0
POP CX
MOV AL,NUM
CMP AL,KEYNUM
JZ OPEN2
JG DOWN2
JB UP2
OPEN2:
CALL OPEN1
RET
DOWN2:
CALL DOWN1
RET
UP2:
CALL UP1
RET
LCD_DISP ENDP
OPEN1 PROC
PUSH CX
LEA BX,HZ_TAB
ADD BX,20
MOV BYTE PTR HZ_ADR,90H
MOV CL,4
CONTINUE2:
PUSH CX
MOV AL,HZ_ADR
MOV DX,PORT_A
OUT DX,AL
CALL CMD_SETUP
MOV AX,[BX]
PUSH AX
MOV AL,AH
MOV DX,PORT_A
OUT DX,AL
CALL DATA_SETUP
CALL DELAY0
POP AX
MOV DX,PORT_A
OUT DX,AL
CALL DATA_SETUP
CALL DELAY0
INC BX
INC BX
INC BYTE PTR HZ_ADR
POP CX
DEC CL
JNZ CONTINUE2
POP CX
RET
OPEN1 ENDP
UP1 PROC
LEA BX,HZ_TAB
ADD BX,28
MOV BYTE PTR HZ_ADR,90H
MOV CL,4
CONTINUE3:
PUSH CX
MOV AL,HZ_ADR
MOV DX,PORT_A
OUT DX,AL
CALL CMD_SETUP
MOV AX,[BX]
PUSH AX
MOV AL,AH
MOV DX,PORT_A
OUT DX,AL
CALL DATA_SETUP
CALL DELAY0
POP AX
MOV DX,PORT_A
OUT DX,AL
CALL DATA_SETUP
CALL DELAY0
INC BX
INC BX
INC BYTE PTR HZ_ADR
POP CX
DEC CL
JNZ CONTINUE3
RET
UP1 ENDP
DOWN1 PROC
LEA BX,HZ_TAB
ADD BX,36
MOV BYTE PTR HZ_ADR,90H
MOV CL,4
CONTINUE4:
PUSH CX
MOV AL,HZ_ADR
MOV DX,PORT_A
OUT DX,AL
CALL CMD_SETUP
MOV AX,[BX]
PUSH AX
MOV AL,AH
MOV DX,PORT_A
OUT DX,AL
CALL DATA_SETUP
CALL DELAY0
POP AX
MOV DX,PORT_A
OUT DX,AL
CALL DATA_SETUP
CALL DELAY0
INC BX
INC BX
INC BYTE PTR HZ_ADR
POP CX
DEC CL
JNZ CONTINUE4
RET
DOWN1 ENDP
;RET
;LCD_DISP ENDP
CMD_SETUP PROC
MOV DX,PORT_B ;指向8255端口控制端口
NOP
MOV AL,00000000B ;PB1置0,PB0置0 (LCD I端=0,W端=0)
OUT DX, AL
CALL DELAY0
NOP
MOV AL,00000100B ;PB2置1 (LCD E端=1)
OUT DX, AL
NOP
CALL DELAY0
MOV AL, 00000000B ;PB2置0,(LCD E端置0)
OUT DX, AL
CALL DELAY0
RET
CMD_SETUP ENDP
DATA_SETUP PROC
MOV DX,PORT_B ;指向8255控制端口
MOV AL,00000001B ;PB1置0,PB0=1 (LCD I端=1)
OUT DX, AL
NOP
CALL DELAY0
MOV AL,00000101B ;PB2置1 (LCD E端=1)
OUT DX, AL
NOP
CALL DELAY0
MOV AL, 00000001B ;PB2置0,(LCD E端=0)
OUT DX, AL
NOP
CALL DELAY0
RET
DATA_SETUP ENDP
DELAY0 PROC
PUSH CX
PUSH DX
MOV CX, 0FFFH
X1: LOOP X1
POP DX
POP CX
RET
DELAY0 ENDP
CODE ENDS
END MAIN