⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602_ds1302.asm

📁 8051对时钟芯片DS1302和液晶LCD1602的控制
💻 ASM
📖 第 1 页 / 共 2 页
字号:
           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 + -