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

📄 lcd1602_ds1302.asm

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