📄 lcd.asm
字号:
RS EQU P1.1
RW EQU P1.2
E EQU P1.3
PSB EQU P1.4
RST EQU P1.6
COM EQU 20H
DAT EQU 21H
;********************LCD接口定义
TEMP EQU 22H ;存放键盘信息
REC EQU 23H ;收到的DIDA信息23H-2AH
AL EQU 2BH ;存放转换后的二进制DIDA信息
CNT EQU 2CH ;计数信息,得到AL对应的字母
CHAR1 EQU 2DH ;存放汉字码的第一个8位
CHAR2 EQU 2EH ;存放汉字码的第二个8位
WEIZHI0 EQU 30H ;存放DIDA的LCD显示座标
WEIZHIA EQU 31H ;存放字母的LCD显示座标
WEIZHIC EQU 32H ;存放汉字的LCD显示座标
;********************接口定义
ORG 0000H
SJMP INIT ;初始化
ORG 0030
INIT: MOV WEIZHI0,#80H ;将#80H给WEIZHI0
MOV WEIZHIA,#90H ;将#90H给WEIZHIA
MOV WEIZHIC,#88H ;将#88H给WEIZHIC
MOV R0,#REC ;将REC的地址给R0
MOV AL,#01H ;初始化MORSE码00000001B
MOV CHAR1,#00H
MOV CHAR2,#00H ;清零汉字码
;*********************************
DISP: CLR PSB
ACALL DELAY
SETB PSB
LCALL DELAY
MOV COM,#30H ;功能设置-8bit控制界面
ACALL WRI ;写指令
LCALL DELAY
MOV COM,#0CH
ACALL WRI
LCALL DELAY
MOV COM,#02H
ACALL WRI
LCALL DELAY
MOV COM,#06H
ACALL WRI
LCALL DELAY
;*************************LCD模块初始化
START: LCALL SCAN
SJMP START
;******************************以下为键盘扫描程序
SCAN: MOV P2,#0FFH
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,ZAILAI
RET
ZAILAI: ACALL DELAY5
MOV P2,#0FFH
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,ANJIAN
RET ;键盘去抖动
ANJIAN: MOV TEMP,A
CJNE A,#00001110B,XX1
MOV @R0,#00H ;按键为0,显示点
ACALL XIANSHI
INC R0
MOV A,AL
RL A
MOV AL,A ;更新MORSE码
RET
XX1: MOV A,TEMP
CJNE A,#00001101B,XX2
MOV @R0,#01H ;按键为1,显示划
ACALL XIANSHI
INC R0
MOV A,AL
RL A
INC A
MOV AL,A ;更新MORSE码
RET
XX2: MOV A,TEMP
CJNE A,#00001011B,XX3
MOV R2,#16 ;按键为3,清除点划信息
MOV R0,#REC
MOV COM,#WEIZHI0
LCALL WRI ;LCD点划座标复位
CLEAR: MOV @R0,#02H
ACALL XIANSHI
;ACALL DELAY
;ACALL DELAY
INC R0
DJNZ R2,CLEAR
MOV R0,#REC ;R0复位为REC地址,等待下一个点划信息
LCALL D2A ;调用DIGIT-TO-ALPHABETA子程序,转化为字母数字
MOV AL,#00H
MOV COM,#WEIZHI0 ;LCD点划座标复位
LCALL WRI
XX3: RET
;***************************************
D2A: MOV CNT,#00H ;初始化CNT
LOOP: MOV DPTR,#TABLEAM ;读入字母-MORSE表
MOV A,CNT ;将CNT读入A
MOVC A,@A+DPTR ;将第CNT个表元读入A
CJNE A,AL,NEXT ;不相等则判断下一个表元
MOV A,WEIZHIA ;否则读入WEIZHIA信息,准备显示
CJNE A,#97H,JIXU ;不为末位则JIXU
MOV WEIZHIA,#90H ;初始化WEIZHIA
MOV A,WEIZHIA
JIXU: MOV COM,A ;
LCALL WRI ;设置字母LCD显示座标
MOV DPTR,#TABLEA ;读入字母LCD表
MOV A,CNT
MOVC A,@A+DPTR ;读入第CNT个码元
ACALL DISP5A ;将字母显示
;
;将CNT放入CHAR
INC WEIZHIA ;WEIZHIA指向下一位
RET
NEXT: INC CNT ;CNT加1
SJMP LOOP
;***************************************
XIANSHI:MOV A,@R0
MOV DPTR,#TABLE0
MOVC A,@A+DPTR
DISP5A: MOV DAT,A
ACALL WRD
;***********************写入半角字符
RET
;*************************************
DISPLAYC:
MOV R2,#64
MOV R1,#0DEH
MOV COM,#80H
ACALL WRI
DISP5: MOV DAT,#0B4H
ACALL WRD
MOV DAT,R1
ACALL WRD
INC R1
DJNZ R2,DISP5
;***********************写入全角字符
RET
;**********************一下为写指令子程序
WRI: PUSH ACC
CLR RS
SETB RW
WRI1: MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
JB ACC.7,WRI1
CLR RW
MOV P0,COM
SETB E
CLR E
POP ACC
RET
;************************一下为写数据子程序
WRD: PUSH ACC
CLR RS
SETB RW
WRD1: MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
JB ACC.7,WRD1
SETB RS
CLR RW
MOV P0,DAT
SETB E
CLR E
POP ACC
RET
;*****************************************
DELAY: MOV R7,#0FFH
DELAY4: MOV R6,#0FFH
LOOP2: DJNZ R6,LOOP2
DJNZ R7,DELAY4
RET
DELAY5: MOV R4,#02H
DELAY15: MOV R7,#0FFH
DELAY45: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DELAY45
DJNZ R4,DELAY15
RET
TABLE0: DB 07H,2DH,20H
TABLEA: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H,47H,48H
DB 49H,4AH,4BH,4CH,4DH,4EH,4FH,50H,51H,52H,53H,54H,55H,56H,57H,58H,59H,5AH
TABLEAM: DB 101111B,100111B,100011B,100001B,100000B,110000B,111000B,111100B,111110B,111111B ;0-9
DB 101B,11000B,11010B,1100B,10B,10010B,1110B,10000B,100B,10111B,1101B,10100B,111B ;A-M
DB 110B,1111B,10110B,11101B,1010B,1000B,11B,1001B,10001B,1011B,11001B,11011B,11100B ;N-Z
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -