📄 lcd1602_ds1302.asm
字号:
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 A,SHUJU+2 ;将暂存区数据显示
MOV RcvDat,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 A,SHUJU+3 ;将暂存区数据显示
MOV RcvDat,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
;**********************************************
MOV A,SHUJU+4 ;将暂存区数据显示
MOV RcvDat,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 A,SHUJU+5 ;将暂存区数据显示
MOV RcvDat,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 A,SHUJU+6 ;将暂存区数据显示
MOV RcvDat,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
LCALL DDD
;**********************************************
KEY_RUN:
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 ;调用写入数据子程序
MOV Command,#0BEh ;命令字节为BEh
MOV ByteCnt,#8 ;多字节写入模式此模块为8 个
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat, SHUJU+2 ;秒单元内容为59h
MOV XmtDat+1,SHUJU+1 ;分单元内容为59h
MOV XmtDat+2,SHUJU ;时单元内容为13h
MOV XmtDat+3,SHUJU+6 ;日期单元内容为08h
MOV XmtDat+4,SHUJU+5 ;月单元内容为08h
MOV XmtDat+5,SHUJU+3 ;星期单元内容为05h
MOV XmtDat+6,SHUJU+4 ;年单元内容为08h
MOV XmtDat+7,#0 ;写保护单元内容为00h
LCALL Send_Byte ;调用写入数据子程序
RET
;**********************************
; 初始化LCD
LCD_INIT:
; 设置显示格式---
MOV A,#38H ; 38H --- 16*2行显示,5*7点阵,8位数据接口
LCALL LCD_WRITE_COMMAND
MOV A,#1
LCALL DELAY_MS
;开显示
LCALL LCD_TURN_ON
;读写后指针加1
MOV A,#06H ; 06H --- 读写后指针加1
LCALL LCD_WRITE_COMMAND
MOV A,#1
LCALL DELAY_MS
; 清除LCD屏幕
LCALL LCD_CLEAR
RET
;开显示
LCD_TURN_ON:
MOV A,#0CH ; 0CH --- 开显示,无光标
LCALL LCD_WRITE_COMMAND
MOV A,#1
LCALL DELAY_MS
RET
; 关显示
LCD_TURN_OFF:
MOV A,#08H ; 08H --- 关显示
LCALL LCD_WRITE_COMMAND
MOV A,#1
LCALL DELAY_MS
RET
; 清除LCD屏幕
LCD_CLEAR:
MOV A,#01H ; 01H清屏指令
LCALL LCD_WRITE_COMMAND
MOV A,#1
LCALL DELAY_MS
RET
;设置LCD当前光标的位置
SET_LCD_POS:
ORL A,#80H ;
LCALL LCD_WRITE_COMMAND
RET
; 写入控制指令到LCD
; 传入参数: ACC(要写入的命令)
; 返回值: 无
LCD_WRITE_COMMAND:
;LCALL CHECK_LCD_BUSY
CLR RS
CLR RW
CLR EP
NOP
NOP
MOV P0,A ; 写入数据到LCD端口
NOP
NOP
NOP
NOP
SETB EP
NOP
NOP
NOP
NOP
CLR EP
RET
; 写入显示数据到LCD
; 传入参数: ACC(要写入的数据)
; 返回值: 无
LCD_WRITE_DATA:
SETB RS
CLR RW
CLR EP
NOP
NOP
MOV P0,A ; 写入数据到LCD端口
NOP
;NOP
;NOP
;NOP
SETB EP
NOP
NOP
NOP
NOP
CLR EP
RET
; 延时子程序
; 传入参数: ACC(延时时间,单位毫秒)
; 返回值: 无
DELAY_MS:
MOV R7,A
DELAY_LOOP1:
MOV R6,#0FFH
DELAY_LOOP2:
NOP
NOP
DJNZ R6,DELAY_LOOP2
DJNZ R7,DELAY_LOOP1
RET
;*********************************
BCD:
MOV R7,#04H
MOV A,RcvDat
RR1:
CLR C
RRC A
DJNZ R7,RR1
MOV BCD4A,A ;高位
NOP
MOV R7,#04H
MOV A,RcvDat
RL1:
CLR C
RLC A
DJNZ R7,RL1
SWAP A
MOV BCD4B,A ;低位
RET
;*************************************
Send_Byte:
CLR RST
NOP
CLR SCLK
NOP
SETB RST
NOP
MOV A,Command ;Command命令字节地址32H中的8EH放到A中准备写入
MOV BitCnt,#08h ;写入一个字节的数据
S_Byte0: ;发地址
RRC A ;8EH最高位移到C中
MOV IO_DATA,C ;IO_DATA即为P1.0,把C中的数据放入P1.0准备传送
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte0 ;循环8次,将8EH传送到DS1302
NOP
S_Byte1: ;发数据
MOV A,@R0 ;将要写到控制字8EH中的00H放到A中
MOV BitCnt,#08h
S_Byte2:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte2
INC R0
DJNZ ByteCnt,S_Byte1
NOP
CLR RST
RET
;***************************************************************************************
;接收数据程序;
;名称:Receive_Byte
;描述:从被控器DS1302 接收ByteCnt 个字节数据
;命令字节地址在Command 中
;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中
;***********************************************************************************
Receive_Byte:
CLR RST ;
NOP
CLR SCLK
NOP
SETB RST
MOV A,Command
MOV BitCnt,#08h
R_Byte0:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,R_Byte0
NOP
R_Byte1:
CLR A
CLR C
MOV BitCnt,#08h
R_Byte2:
NOP
MOV C,IO_DATA
RRC A
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,R_Byte2
MOV @R1,A
INC R1
DJNZ ByteCnt,R_Byte1
NOP
CLR RST
RET
;************定时子程序**********************
TT0: MOV TH0,#0D8H ;定时器中断,赋初值
MOV TL0,#0F0H
DJNZ 40H,TT0_EXIT ;循环体
MOV 40H,#100 ;赋予40H为100,循环100次10MS的时间
SETB TT0_FLAG ;置1
TT0_EXIT:RETI
;*************************************
TAB_MATH:
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -