📄 16x1.asm
字号:
;*************************************
;* 伪定义 *
;*************************************
RS BIT P1.2 ;液晶
R_W BIT P1.1
ENABLE BIT P1.0
RST BIT P2.4 ;DS1302
IO BIT P2.0
SCLK BIT P2.1
DB0_DB7 DATA P3
KEY1 BIT P0.7 ;键盘
KEY2 BIT P0.6
KEY3 BIT P0.5
KEY4 BIT P0.4
SEC EQU 60H ;存放读取DS1302的时间值单元分配
MIN EQU 61H
HOUR EQU 62H
DATE EQU 63H
MONTH EQU 64H
WEEK EQU 65H
YEAR EQU 66H
SEC_H EQU 67H ;存放待显示的时间值单元分配
SEC_L EQU 68H
MIN_H EQU 69H
MIN_L EQU 6AH
HOUR_H EQU 6BH
HOUR_L EQU 6CH
DATE_H EQU 6DH
DATE_L EQU 6EH
MONTH_H EQU 6FH
MONTH_L EQU 70H
WEEK_H EQU 71H
WEEK_L EQU 72H
YEAR_H EQU 73H
YEAR_L EQU 74H
;*************************************
;* 中断入口 *
;*************************************
ORG 0000H
LJMP STRAT
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 0030H
;*************************************
;* 主程序 *
;*************************************
STRAT: MOV SP,#50H
LCALL INITIAL ;液晶初使化
LCALL CLS ;清屏
LCALL SPTIME ;初使化时间为2000年1月1日,星期6,00:00:00 24小时模式
MAIN: MOV R0,#SEC
LCALL GETTIME ;获取时间
LCALL CTIME ;时间转换,用于显示
LCALL SHOW ;显示
LCALL KEY
CJNE A,#0FFH,BB ;有按键跳到BB
LJMP MAIN
BB: CJNE A,#10,MAIN ;判断是不是*,不是跳出
MOV A,#00001111B
LCALL WRITE_INSTRUCTION ;写指令
MOV A,#10000000B ;第一行第6个位置
LCALL WRITE_INSTRUCTION ;写指令
CC: LCALL KEY
CJNE A,#10,CC
MOV A,#10000001B ;第一行第7个位置
LCALL WRITE_INSTRUCTION ;写指令
DD: LCALL KEY
CJNE A,#10,DD
MOV A,#10000011B ;第一行第9个位置
LCALL WRITE_INSTRUCTION ;写指令
EE: LCALL KEY
CJNE A,#10,EE
MOV A,#10000100B ;第一行第10个位置
LCALL WRITE_INSTRUCTION ;写指令
FF: LCALL KEY
CJNE A,#10,FF
MOV A,#10000110B ;第一行第12个位置
LCALL WRITE_INSTRUCTION ;写指令
GG: LCALL KEY
CJNE A,#10,GG
MOV A,#11000000B ;第一行第6个位置
LCALL WRITE_INSTRUCTION ;写指令
HH: LCALL KEY
CJNE A,#10,HH
MOV A,#11000001B ;第二行第6个位置
LCALL WRITE_INSTRUCTION ;写指令
II: LCALL KEY
CJNE A,#10,II
MOV A,#11000011B ;第二行第8个位置
LCALL WRITE_INSTRUCTION ;写指令
JJ: LCALL KEY
CJNE A,#10,JJ
MOV A,#11000100B ;第二行第9个位置
LCALL WRITE_INSTRUCTION ;写指令
KK: LCALL KEY
CJNE A,#10,KK
MOV A,#11000110B ;第二行第11个位置
LCALL WRITE_INSTRUCTION ;写指令
LL: LCALL KEY
CJNE A,#10,LL
MOV A,#11000111B ;第二行第12个位置
LCALL WRITE_INSTRUCTION ;写指令
MM: LCALL KEY
CJNE A,#10,MM
MOV A,#00001100B ;第二行第12个位置
LCALL WRITE_INSTRUCTION ;写指令
LJMP MAIN
;*************************************
;* 显示部分 *
;*************************************
SHOW: MOV A,#10000000B ;第一行第9个位置 月
LCALL WRITE_INSTRUCTION ;写指令
MOV R1,#MONTH_H
LCALL PR_R1 ;显示
MOV A,#10000010B ;第一行第11个位置 -
LCALL WRITE_INSTRUCTION ;写指令
MOV DPTR,#LINE2
LCALL PR_DPTR ;显示
MOV A,#10000011B ;第一行第12个位置 日
LCALL WRITE_INSTRUCTION ;写指令
MOV R1,#DATE_H
LCALL PR_R1 ;显示
MOV A,#10000110B ;第一行第6个位置 周
LCALL WRITE_INSTRUCTION ;写指令
MOV R1,#WEEK_L
LCALL PR_R2 ;显示
MOV A,#11000000B ;第一行第8个位置 时
LCALL WRITE_INSTRUCTION ;写指令
MOV R1,#HOUR_H
LCALL PR_R1 ;显示
MOV A,#11000010B ;第一行第10个位置 :
LCALL WRITE_INSTRUCTION ;写指令
MOV DPTR,#LINE4
LCALL PR_DPTR ;显示
MOV A,#11000011B ;第一行第11个位置 分
LCALL WRITE_INSTRUCTION ;写指令
MOV R1,#MIN_H
LCALL PR_R1 ;显示
MOV A,#11000101B ;第一行第13个位置 :
LCALL WRITE_INSTRUCTION ;写指令
MOV DPTR,#LINE4
LCALL PR_DPTR ;显示
MOV A,#11000110B ;第一行第14个位置 秒
LCALL WRITE_INSTRUCTION ;写指令
MOV R1,#SEC_H
LCALL PR_R1 ;显示
RET
;*************************************
;* 时间初使用化 *
;*************************************
;2000年1月1日,星期6,00:00:00 24小时模式
SPTIME: MOV SEC,#55H
MOV MIN,#59H
MOV HOUR,#23H
MOV DATE,#31H
MOV MONTH,#12H
MOV WEEK,#07H
MOV YEAR,#03H
MOV R0,#SEC
LCALL SETTIME
RET
;*************************************
;* 时间转换 *
;*************************************
CTIME: MOV R0,#SEC
MOV R1,#SEC_H
MOV R3,#07H ;
CL: MOV A,@R0
SWAP A ;高4位转入低4位
SETB 01H ;标致位(高4位转完?)
CH: ANL A,#0FH ;屏蔽高4位
ADD A,#30H ;转换成ASCII码
MOV @R1,A ;存入显示单元
INC R1
CPL 01H
MOV A,@R0
JNB 01H,CH
INC R0
DJNZ R3,CL
RET
;****************************************************************************
;**********************************液晶显示驱动******************************
;****************************************************************************
;
;*************************************
;* 清屏 *
;*************************************
CLS: MOV A,#01H
LCALL WRITE_INSTRUCTION
RET
;*************************************
;* 初使化 *
;*************************************
;Initial子程式
;设定LCM使用8BITS汇流排、显示两行、使用
;5*7字型、显示器要显示、不要光标
Initial:MOV A,#00111000B
LCALL WRITE_INSTRUCTION
MOV A,#00001100B
LCALL WRITE_INSTRUCTION
MOV A,#00000110B
LCALL WRITE_INSTRUCTION
RET
;*************************************
;*CheckBusy子程式 *
;*************************************
;等待LCM有空可以执行下一个命令
CheckBusy: PUSH ACC
CheckBusyLOOP: CLR ENABLE
SETB R_W
CLR RS
SETB ENABLE
MOV A,DB0_DB7
CLR ENABLE
JB ACC.7,CheckBusyLOOP
POP ACC
LCALL DL250US
RET
;*************************************
;* Write_Instruction子程式 *
;*************************************
;将ACC内的资料输入到LCM的IR寄存器
Write_Instruction:LCALL CHECKBUSY
CLR ENABLE
CLR R_W
CLR RS
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*************************************
;* writelcddata子程式 *
;*************************************
;将ACC内的资料输入到LCM的DR寄存器
WriteLCDData: LCALL CHECKBUSY
CLR ENABLE
CLR R_W
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -