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

📄 lcd时钟.asm

📁 LCD protues 仿真 想下就下吧 为了下别的
💻 ASM
字号:
; LCD显示时钟,第一行显示设定日期" DATE XXXX-XX-XX " ,第二行显示设定时间" TIME  XX-XX-XX " ,开始时两行并列逐字显示日期和时间,然后定格,时钟继续运行。             祝亚森 (0515074240),朱大三(0515074239) 



   RS   EQU     P3.0      ;写入数据(1)或指令(0)选择端
   RW   EQU     P3.1      ;读(1)写(0)控制
   E    EQU     P3.2;     ;使能
   LCD  EQU     P2        ;LCD数据口
   BF   EQU     P2.7      ;忙标志

   YEA1 EQU     30H       ;日期储存地址
   YEA2 EQU     31H
   MON  EQU     32H
   DAY  EQU     33H

   HOU  EQU     34H       ;时间储存地址
   MIN  EQU     35H
   SEC  EQU     36H

COUNT   EQU     3CB0H     ;T0初值
COUNT1  EQU     20        ;20*50us=1S
SECCOUN EQU     10H       ;存放20的地址

LEDBUF  EQU     40H       ;显示数据首地址

        ORG     0000H
        LJMP    MAIN
        ORG     000BH     ;T0中断入口
        LJMP    STIME     ;调用定时器T0中断服务子程序
MAIN:                          ;装入固定点显示字母或符号

        SETB    PSW.5 

        MOV     LEDBUF,   #12  ;D     
        MOV     LEDBUF+1, #13  ;A
        MOV     LEDBUF+2, #14  ;T
        MOV     LEDBUF+3, #15  ;E      
        MOV     LEDBUF+4, #16  ;空格
        MOV     LEDBUF+9, #10  ;-
        MOV     LEDBUF+12,#10  ;-

        MOV     LEDBUF+15,#17  ;T
        MOV     LEDBUF+16,#18  ;I
        MOV     LEDBUF+17,#19  ;M
        MOV     LEDBUF+18,#15  ;E
        MOV     LEDBUF+19,#16  ;空格
        MOV     LEDBUF+20,#16  ;空格
        MOV     LEDBUF+23,#11  ;:
        MOV     LEDBUF+26,#11  ;:
        MOV     LEDBUF+29,#16  ;空格          
       ;---------LCD1602初始化-------------------

        MOV     A, #00000001B  ;发送清屏操作指令;
        CALL    W_CMD          ;调写入指令子程序
        MOV     A, #00001111B  ;发送显示开/关控制
        ACALL   W_CMD          ;指令,有光标,有闪烁
        MOV     A, #00011100B  ;发送光标移动指令
        ACALL   W_CMD          ;光标和字一起移动,光标自动右移
        MOV     A, #00111100B  ;发送功能设置指令
        CALL    W_CMD          ;8位DB,双行,5x7字符
        MOV     DPTR, #TAB     ;装入查表地址
       ;---------LCD1602初始化结束---------------------

       ;---------T0定时初始化--------------------------

        MOV     YEA1,#20H      ;设置日期初始值
        MOV     YEA2,#08H
        MOV     MON, #10H
        MOV     DAY, #12H

        MOV     HOU,#12H       ;设置时间初始值
        MOV     MIN,#59H
        MOV     SEC,#50H

        MOV     TMOD,#01H      ;设置T0定时,模式1
        MOV     TH0,#HIGH(COUNT)  ;装入高4位初始值
        MOV     TL0,#LOW(COUNT)   ;装入低4位初始值
        SETB    EA                ;开中断
        SETB    ET0               ;开T0中断允许位
        SETB    TR0               ;开始定时
        MOV     SECCOUN,#COUNT1   ;把数值20放到10H单元中
       ;---------T0定时初始化结束------------------------

MOVBUF1:                     ;日期"年"前两位处理 
        MOV     A,YEA1       
        ANL     A,#0F0H      ;取高四位
        SWAP    A            ;高四位和低四位调换
	MOV     LEDBUF+5,A   ;把处理的数存放到相应地址中
        MOV     A,YEA1
        ANL     A,#0FH       ;取低四位
        MOV     LEDBUF+6,A   ;把处理的数存放到相应地址中           
 
        MOV     A,YEA2       ;日期"年"后两位处理
        ANL     A,#0F0H
        SWAP    A
	MOV     LEDBUF+7,A
        MOV     A,YEA2
        ANL     A,#0FH
        MOV     LEDBUF+8,A 

        MOV     A,MON        ;日期"月"处理
        ANL     A,#0F0H      
        SWAP    A
	MOV     LEDBUF+10,A
        MOV     A,MON
        ANL     A,#0FH
        MOV     LEDBUF+11,A 

        MOV     A,DAY        ;日期"日"处理
        ANL     A,#0F0H
        SWAP    A
	MOV     LEDBUF+13,A
        MOV     A,DAY
        ANL     A,#0FH
        MOV     LEDBUF+14,A 

        MOV     A,HOU        ;时间"时"处理
        ANL     A,#0F0H
        SWAP    A
	MOV     LEDBUF+21,A
        MOV     A,HOU
        ANL     A,#0FH
        MOV     LEDBUF+22,A

	MOV     A,MIN        ;时间"分"处理
        ANL     A,#0F0H
        SWAP    A
	MOV     LEDBUF+24,A
        MOV     A,MIN
        ANL     A,#0FH
        MOV     LEDBUF+25,A

        MOV     A,SEC        ;时间"秒"处理
        ANL     A,#0F0H
        SWAP    A
	MOV     LEDBUF+27,A
        MOV     A,SEC
        ANL     A,#0FH
        MOV     LEDBUF+28,A


JMP2DIS:LCALL   DISPLAYLCD   ;调用显示子程序
        SJMP    MOVBUF1

;-------------定时器T0中断服务子程序----------
STIME:  MOV     TH0,#HIGH(COUNT) ;重新装入高4位初始值
        MOV     TL0,#LOW(COUNT)  ;重新装入低4位初始值
        DJNZ    SECCOUN,TIMEEND  ;判断是否够1秒(20*50us=1S)
        MOV     SECCOUN,#COUNT1  ;重新装入20

        PUSH    ACC              ;堆栈

SECCHA: MOV     A,SEC            ;"秒"处理
        ADD     A,#1             ;秒加1  
        DA      A                ;十进制调整
        MOV     SEC,A               
        CJNE    A,#60H,TIMEEND1  ;判断是否够60秒
        MOV     SEC,#0           ;够60秒后,秒位清0

MINCHA: MOV     A,MIN            ;"分"处理
        ADD     A,#1
        DA      A
        MOV     MIN,A
        CJNE    A,#60H,TIMEEND1
        MOV     MIN,#0

HOUCHA: MOV     A,HOU            ;"时"处理
        ADD     A,#1
        DA      A
        MOV     HOU,A
        CJNE    A,#24H,TIMEEND1
        MOV     HOU,#0

DAYCHA: MOV     A,DAY            ;"日"处理
        MOV     A,#1
        DA      A
        MOV     DAY,A
        CJNE    A,#24H,TIMEEND1

MONCHA: MOV     A,MON            ;"月"处理
        MOV     A,#1
        DA      A
        MOV     MON,A
        CJNE    A,#12H,TIMEEND1

YEA2CHA:MOV     A,YEA2           ;"年"后两位处理
        MOV     A,#1   
        DA      A
        MOV     YEA2,A
        CJNE    A,#99H,TIMEEND1

YEA1CHA:MOV     A,YEA1           ;"年"前两位处理
        MOV     A,#1
        DA      A
        MOV     YEA1,A
        CJNE    A,#99H,TIMEEND1
        
TIMEEND1:
        POP     ACC              ;弹出堆栈

TIMEEND:RETI
;-------------定时器T0中断服务子程序结束-------------


;------------------LCD1602显示子程序------------------
DISPLAYLCD:

        MOV     R0, #LEDBUF       ;显示首地址
        MOV     R1, #LEDBUF+15
        MOV     R2, #0            ;显示第一个字
        MOV     R3, #10000001B    ;发送第一行DDRAM地址设置指令       
        MOV     R4, #11000001B    ;发送第二行DDRAM地址设置指令             
 LOOP1:
        MOV     A,R3
        ACALL   W_CMD
 
        MOV     A, @R0
        MOVC    A, @A+DPTR        ;查表
	ACALL   W_DATA            ;调用LCD显示字子程序
	INC     R0                ;显示下一个字
        INC     R3

        MOV     A,R4
        ACALL   W_CMD 
       
        MOV     A, @R1      
	MOVC    A, @A+DPTR        ;查表
	ACALL   W_DATA            ;调用LCD显示字子程序
	INC     R1                ;显示下一个字
        INC     R2                ;下一个数
        INC     R4

        JNB     PSW.5,TG

        CALL    DELAY
TG: 
	CJNE    R2, #15, LOOP1 
        CLR     PSW.5 

   LOOP:

        MOV     A, #00001100B  ;发送显示开/关控制
        ACALL   W_CMD          ;指令,无光标,无闪烁
     	LJMP    EXIT              ;跳出LCD1602显示子程序


   TAB: DB      30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
        DB      2DH,3AH,44H,41H,54H,45H,20H,54H,49H,4DH

   WAIT:
        MOV     LCD, #0FFH  ;令P2作输入口使用
	CLR     RS
	SETB    RW
	CLR     E
	NOP
	SETB    E
	JB      BF, WAIT    ;判断LCD忙标志
	RET

 W_CMD:                 ;入口参数A
        ACALL   WAIT
	MOV     LCD, A
	CLR     RS
	CLR     RW
	SETB    E
	NOP
	CLR     E
	RET

W_DATA:	                ;入口参数A
        ACALL   WAIT
	MOV     LCD, A 
	SETB    RS
	CLR     RW
	SETB    E
	NOP
	CLR     E
	RET
  EXIT:
        RET
;------------------LCD1602显示子程序结束------------------

DELAY:  MOV      R6,#00H         ;延时子程序  
         MOV      R7,#00H
DELAY1: NOP
         DJNZ       R7,DELAY1 
        DJNZ       R6,DELAY1
        RET


	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -