📄 ps2.asm
字号:
DB 4CH,4DH,4EH,4FH,50H,51H,52H,53H,54H,55H,56H
DB 57H,58H,59H,5AH ;A-Z
DB 29H,21H,40H,23H,24H,25H,5EH,26H,2AH,28H ;0-9上行键
DB 5CH,5FH,2BH,7CH,20H,7BH,7DH,3AH,22H,3CH,3EH,3FH ;,2EH
DB 30H,31H,32H,33H,34H,35H ;右边数字键
DB 36H,37H,38H,39H ;0-9
;--------------------------------------------------------
;LCD初始化显示子程序
;--------------------------------------------------------
SET_LCD1:
MOV DPTR,#LMESS1 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
RET
SET_LCD2:
MOV DPTR,#LMESS2 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_PRINT
RET
LMESS1:
DB " PS2 KEYBOARD ",0 ;LCD 第一行显示
LMESS2:
DB " DEMO PROGRAM ",0 ;LCD 第二行显示
SET_LCD3:
MOV DPTR,#LMESS3 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
RET
SET_LCD4:
MOV DPTR,#LMESS4 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_PRINT
RET
LMESS3:
DB " WELCOME TO ",0 ;LCD 第一行显示
LMESS4:
DB " WWW.WILLAR.COM ",0 ;LCD 第二行显示
;--------------------------------------------------------
;LCD 初始化子程序
;8位数据传送方式,双行显示,字形5*7点阵。
;开显示,显示光标并闪动。
;--------------------------------------------------------
INIT_LCD:
CALL DELAY5MS ;延时15MS
CALL DELAY5MS
CALL DELAY5MS ;等待LCD电源稳定
MOV A,#38H ;双行显示,字形5*7点阵,8位数据。
CALL WCOM_NC ;不检测忙信号
CALL DELAY5MS
MOV A,#38H ;双行显示,字形5*7点阵
CALL WCOM_NC ;不检测忙信号
CALL DELAY5MS
MOV A,#38H ;双行显示,字形5*7点阵
CALL WCOM_NC ;不检测忙信号
CALL DELAY5MS
MOV A,#38H ;双行显示,字形5*7点阵
CALL WCOM ;检测忙信号
CALL DELAY5MS
MOV A,#0FH ;开显示,显示光标,光标闪烁。
CALL WCOM
CALL DELAY5MS
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY5MS
RET
; ---------------------------------------------------------
;LCD 显示子程序
;
;H_SCAN 行扫描标志
;----------------------------------------------------------
CONV1:
JB H_SCAN,CONV3 ;
CONV2:
MOV B,LCD_X
ACALL LCDP1
INC LCD_X
MOV R0,LCD_X
CJNE R0,#10H,CONV_END ;一行显示完否?
SETB H_SCAN
MOV LCD_X,#00H ;设置显示起始位置
JMP CONV_END
CONV3:
MOV B,LCD_X
ACALL LCDP2
INC LCD_X
MOV R0,LCD_X
CJNE R0,#11H,CONV_END ;一行显示完否
CLR H_SCAN
MOV A,#01H ;清屏
ACALL WCOM
MOV LCD_X,#00H ;设置显示起始位置
CONV_END:
RET
;--------------------------------------------------------
;清屏子程序
;--------------------------------------------------------
;CLR_DISP:
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
RET
;--------------------------------------------------------
;在LCD的第一行显示字符
;--------------------------------------------------------
LCDP1:
PUSH ACC ;入栈保护
MOV A,B ;设置显示地址
ADD A,#80H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;--------------------------------------------------------
;在LCD的第二行显示字符
;--------------------------------------------------------
LCDP2:
PUSH ACC ;入栈保护
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;--------------------------------------------------------
;在LCD的第一行或第二行显示字符
;--------------------------------------------------------
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由信息区取出字符
CJNE A,#00H,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;--------------------------------------------------------
;清除 LCD 指定行的字符
;“空白”的ASCII代码为20H。
;--------------------------------------------------------
CLR_LINE:
MOV R0,#24
CL1: MOV A,#20H ;' '
CALL WDATA
DJNZ R0,CL1
RET
;--------------------------------------------------------
;写控制指令子程序
;写控制指令到LCD
;传入参数: ACC(要写入的指令)
;RS=L,RW=L,E=高脉冲,D0-D7=指令码 。
;--------------------------------------------------------
WCOM:
ACALL CHECKBUSY
WCOM_NC:
MOV P0,A ;写入指令
CLR LCD_EN
NOP
NOP
CLR LCD_RS
CLR LCD_RW
SETB LCD_EN
ACALL DEL_250
CLR LCD_EN
RET
;--------------------------------------------------------
;写数据子程序
;写显示数据到LCD
;传入参数: ACC(要写入的数据)
;RS=H,RW=L,E=高脉冲,D0-D7=数据码 。
;--------------------------------------------------------
WDATA:
ACALL CHECKBUSY
MOV P0,A ;写入数据
CLR LCD_EN
NOP
NOP
SETB LCD_RS
CLR LCD_RW
SETB LCD_EN
CALL DEL_250
CLR LCD_EN
RET
DEL_250:
MOV R7,#125 ;延时250微秒
DJNZ R7,$
RET
;--------------------------------------------------------
;检测LCD控制器忙碌状态
;正常读写操作之前必须检测LCD控制器状态
;BUSY FLAG(P0.7)=1时,忙,不能接收MCU送来的指令和数据。
;BUSY FLAG(P0.7)=0时,闲,能够接收MCU送来的指令和数据。
;读数据时
;RS=L,RW=H,E=H,输出:D0-D7=数据
;--------------------------------------------------------
CHECKBUSY:
PUSH ACC
MOV P0,#0FFH ;置P0口为输入状态
CLR LCD_EN
NOP
NOP
SETB LCD_RW
CLR LCD_RS
SETB LCD_EN
BUSYLOOP:
NOP
JB P0.7,BUSYLOOP
CLR LCD_EN
POP ACC
RET
;---------------------------------------------------------
;延时50MS子程序
;---------------------------------------------------------
DELAY50MS:
MOV R6,#100
DEL2: MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL2
RET
;--------------------------------------------------------
;延时5MS子程序
;--------------------------------------------------------
DELAY5MS:
MOV R6,#25
DEL3: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL3
RET
;===================================================
;
;蜂鸣器响一声子程序
;
;===================================================
BEEP_BL:
MOV R6,#100
BL1: CALL DEX1
CPL BEEP ;P3.7取反
DJNZ R6,BL1
MOV R5,#8 ;修改此参数可以调整键盘响应速度
CALL DELAY
RET
DEX1: MOV R7,#180
DEX2: NOP
DJNZ R7,DEX2
RET
DELAY: ;延时R5*20MS
MOV R6,#50
D1: MOV R7,#200
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;----------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -