📄 lcd1602_ds1302.asm
字号:
;**********************************
IO_DATA BIT P1.0
SCLK BIT P1.1
RST BIT P1.2
RS EQU P1.5
RW EQU P1.6
EP EQU P1.7
cS_SMD EQU 0f000H ;显示段地址
CS_SMW EQU 0c000H ;显示位地址
CS_KEY EQU 0B000H ;键盘行地址
TT0_FLAG BIT 02H ;标志位,定时器中断
;**********************************
BitCnt DATA 30H ; 数据位计数器
ByteCnt DATA 31H ; 数据字节计数器
Command DATA 32H ; 命令字节地址
RcvDat DATA 40H ; 接收数据缓冲区
XmtDat DATA 50H ; 发送数据缓冲区
SHUJU DATA 60H ;传送过来的数据暂存区
BCD4A EQU 22H ;数据高位
BCD4B EQU 23H ;数据低位
;*****************************
ORG 0000H
JMP START
ORG 000BH ;定时程序起始
LJMP TT0 ;至定时
ORG 0030H
START: MOV SP,#67H
;*********************设置时钟****************************
Write_Enable:
CLR P1.7
MOV Command,#8Eh ;命令字节为8E ;WR控制器
MOV ByteCnt,#1 ;单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#00h ;数据内容为0 写入允许
LCALL Send_Byte ;调用写入数据子程序
;*******************************当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始
MOV Command,#80h ; 命令字节为80 ;写SEC寄存器
MOV ByteCnt,#1 ; 单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#00h ;数据内容为0 振荡器工作允许
LCALL Send_Byte ;调用写入数据子程序
;******************************************
Write_Multiplebyte:
MOV Command,#0BEh ;命令字节为BEh
MOV ByteCnt,#8 ;多字节写入模式此模块为8 个
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat, #59h ;秒单元内容为59h
MOV XmtDat+1,#50h ;分单元内容为59h
MOV XmtDat+2,#12h ;时单元内容为13h
MOV XmtDat+3,#20h ;日期单元内容为08h
MOV XmtDat+4,#07h ;月单元内容为08h
MOV XmtDat+5,#07h ;星期单元内容为05h
MOV XmtDat+6,#08h ;年单元内容为08h
MOV XmtDat+7,#0 ;写保护单元内容为00h
LCALL Send_Byte ;调用写入数据子程序
;**********************************************
LCALL LCD_INIT ; 初始化LCD
MOV A,#15
LCALL DELAY_MS ;延时15*255
MOV TMOD ,#01H ;定时器方式1
MOV TH0 ,#0D8H ;赋初值,定时10MS
MOV TL0 ,#0F0H
SETB TR0 ;打开定时器TO
SETB ET0
SETB EA
LOOP:
LCALL TIME ;显示
LCALL KEYSCAN
JZ LOOP
LCALL TIME
LCALL KEYSCAN
JZ LOOP
LCALL KEYGET
CJNE A,#0FFH,LOOP1
SJMP LOOP
LOOP1: MOV B,A
LOOP2: LCALL TIME
LCALL KEYSCAN
JNZ LOOP2
MOV A,B
RL A
MOV DPTR,#KEYFUN
JMP @A+DPTR
SJMP LOOP
;**********************************************
TIME:
MOV Command,#85h ; 命令字节为85h 读出的是‘小时’
MOV ByteCnt,#1 ; 单字节传送模式
MOV R1,#RcvDat ;数据地址覆给R1
LCALL Receive_Byte ;调用读出数据子程序
MOV A,RcvDat
MOV SHUJU,A ;将接收到的数据放入暂存区
LCALL BCD
MOV A,#01H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第2个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#02H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第3个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#03H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第3个字符
MOV A,#0AH
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
;**********************************************
MOV Command,#83h ;83H 读出的是'分钟'
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
MOV A,RcvDat
MOV SHUJU+1,A ;将接收到的数据放入暂存区
LCALL BCD
MOV A,#04H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第5个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#05H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第6个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#06H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第3个字符
MOV A,#0AH
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
;**********************************************
MOV Command,#81h ;81H 读出的是'秒'
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
MOV A,RcvDat
MOV SHUJU+2,A ;将接收到的数据放入暂存区
LCALL BCD
MOV A,#07H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第8个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#08H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第9个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
;**********************************************
MOV Command,#8Bh ;8BH 读出的是'星期'
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
MOV A,RcvDat
MOV SHUJU+3,A ;将接收到的数据放入暂存区
LCALL BCD
MOV A,#0AH ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第11个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#0BH ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第12个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
;**********************************************
DATA1: MOV Command,#8Dh ;8DH 读出的是'年'
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
MOV A,RcvDat
MOV SHUJU+4,A ;将接收到的数据放入暂存区
LCALL BCD
MOV A,#41H ; 在第二行显示
LCALL SET_LCD_POS ; 设置LCD光标到第二行的第2个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#42H ; 在第二行显示
LCALL SET_LCD_POS ; 设置LCD光标到第二行的第2个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
;**********************************************
MOV Command,#89h ;89H 读出的是'月份'
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
MOV A,RcvDat
MOV SHUJU+5,A ;将接收到的数据放入暂存区
LCALL BCD
MOV A,#44H ; 在第二行显示
LCALL SET_LCD_POS ; 设置LCD光标到第二行的第5个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#45H ; 在第二行显示
LCALL SET_LCD_POS ; 设置LCD光标到第二行的第5个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
;**********************************************
MOV Command,#87h ;8DH 读出的是'日'
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
MOV A,RcvDat
MOV SHUJU+6,A ;将接收到的数据放入暂存区
LCALL BCD
MOV A,#47H ; 在第二行显示
LCALL SET_LCD_POS ; 设置LCD光标到第二行的第8个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#48H ; 在第二行显示
LCALL SET_LCD_POS ; 设置LCD光标到第二行的第8个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
NOP
RET
;**********************************
KEYGET: MOV A,#0FFH ;关显示
MOV DPTR,#CS_SMD
MOVX @DPTR,A
MOV R3,#0FEH
MOV R2,#04H
MOV R4,#0
KEYG1: MOV A,R3
MOV DPTR,#CS_SMW
MOVX @DPTR,A
MOV DPTR,#CS_KEY
MOVX A,@DPTR
JB ACC.0,KEYL1
MOV A,#00H
SJMP KEYG2
KEYL1: JB ACC.1,KEYL2
MOV A,#04H
SJMP KEYG2
KEYL2: JB ACC.2,KEYL3
MOV A,#08H
SJMP KEYG2
KEYL3: JB ACC.3,KEYC1
MOV A,#0CH
SJMP KEYG2
KEYC1: MOV A,R3
RL A
MOV R3,A
INC R4
DJNZ R2,KEYG1
MOV A,#0FFH
SJMP KEY_EXIT
KEYG2: ADD A,R4
KEY_EXIT:RET
KEYSCAN:MOV A,#0FFH ;关显示
MOV DPTR,#CS_SMD
MOVX @DPTR,A
MOV A,#00H
MOV DPTR,#CS_SMW
MOVX @DPTR,A
MOV DPTR,#CS_KEY
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET
KEYFUN: AJMP KEY_SET
AJMP KEY_INC_ZZ ;控制指针
AJMP KEY_INC
AJMP KEY_RUN
;**********************************
KEY_INC_ZZ:
RET
;**********************************
KEY_INC:
RET
;**********************************
KEY_SET:
LCALL LCD_INIT ; 初始化LCD
MOV A,#15
LCALL DELAY_MS ;延时15*255
DDD: MOV A,SHUJU ;将暂存区数据显示
MOV RcvDat,A
LCALL BCD
MOV A,#01H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第2个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#02H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第3个字符
MOV A,BCD4B
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#03H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第3个字符
MOV A,#0AH
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
;**********************************************
MOV A,SHUJU+1 ;将暂存区数据显示
MOV RcvDat,A
LCALL BCD
MOV A,#04H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第5个字符
MOV A,BCD4A
MOV DPTR,#TAB_MATH
MOVC A,@A+DPTR
LCALL LCD_WRITE_DATA
MOV A,#05H ; 在第一行显示
LCALL SET_LCD_POS ; 设置LCD光标到第一行的第6个字符
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -