发一个自己写的LCD1602液晶电子钟源程序(时间不可调)

2020-02-05 09:28发布

这是本人用汇编语言写的LCD1602液晶电子钟,时间全是由指令,语句实现的,没有用专门的时钟IC。现在这个程序版本,还不可以调试时间,以后再完善吧。另外,时间精度也不高,呵呵,毕竟用的是DELAY,延时程序。现在把源程序贴出来,给大家做个参考吧。错误,不妥之处,还请见谅。
      ORG 0000H
      RS BIT P2.0
      RW BIT P2.1
      EN BIT P2.2
      MOV R0,#30H
      MOV R1,#30H
      MOV R2,#30H
      MOV R3,#30H
      MOV R4,#32H
      MOV R5,#31H
      ORG 0030H
;*****初始化操作********
      MOV P0,#01H  ;清屏
      ACALL  READ_DATA
      MOV P0,#38H  ;显示功能,采用8位数据总线,采用双行显示,采用5X7点陈
      ACALL  READ_DATA
      MOV P0,#0CH  ;显示开关控制,不显示光标,光标不闪烁
      ACALL  READ_DATA
      MOV P0,#06H  ;输入模式,光标右移,文字不移
      ACALL  READ_DATA
      MOV P0,#80H  ;数据存贮器地址,第一行数据地址
      ACALL  READ_DATA
      MOV P0,#01H  ;清屏
      ACALL  READ_DATA
      MOV DPTR,#TABLE;显示PASS WORD
      MOV R6,#00H ;显示table中的值
LOOP1:
      MOV A,R6;到table取码
      MOVC A,@A+DPTR
      ACALL WRITE_DATA ;显示到lcd
      INC R6
      CJNE A,#00H,LOOP1 ;是否到00h
;******* 初始化操作 结束*************
START:
      ACALL LOOP2 ;显示
      INC R0 ;加1
      MOV A,R0
      CJNE A,#3AH,START;如果A的值到3AH那么继续否则重新
      MOV R0,#30H ;显示数送30H(就是显示0)
      INC R1 ;加1
      MOV A,R1
      CJNE A,#36H,START;如果A的值到36H那么继续否则重新
      MOV R1,#30H ;显示数送30H(就是显示0)
      INC R2 ;加1
      MOV A,R2
      CJNE A,#3AH,START;如果A的值到3AH那么继续否则重新
      MOV R2,#30H ;显示数送30H(就是显示0)
      INC R3 ;加1
      MOV A,R3
      CJNE A,#36H,START;如果A的值到36H那么继续否则重新
      MOV R3,#30H ;显示数送30H(就是显示0)
      INC R4 ;加1
      MOV A,R4
      CJNE A,#34H,START;如果A的值到34H那么继续否则重新
      MOV R4,#32H ;显示数送30H(就是显示2)
      INC R5 ;加1
      MOV A,R5
      CJNE A,#33H,START;如果A的值到33H那么继续否则重新
      MOV R5,#31H ;显示数送30H(就是显示1)
      JMP START
LOOP2:;显示子程序
      MOV P0,#0C1H  
      ACALL  READ_DATA
      MOV A,#"T"
      ACALL WRITE_DATA
      MOV P0,#0C2H  
      ACALL  READ_DATA
      MOV A,#"i"
      ACALL WRITE_DATA
      MOV P0,#0C3H  
      ACALL  READ_DATA
      MOV A,#"m"
      ACALL WRITE_DATA
      MOV P0,#0C4H  
      ACALL  READ_DATA
      MOV A,#"e"
      ACALL WRITE_DATA
      JMP LOOP3
LOOP3:
      MOV P0,#0CEH
      ACALL READ_DATA
      MOV A,R0
      ACALL WRITE_DATA
      MOV P0,#0CDH;显示的位置
      ACALL READ_DATA
      MOV A,R1 ;显示10位数
      ACALL WRITE_DATA ;显示
      MOV P0,#0CCH  
      ACALL  READ_DATA
      MOV A,#":"
      ACALL WRITE_DATA
      JMP LOOP4
LOOP4:
      MOV P0,#0CBH;数据存贮器地址
      ACALL READ_DATA
      MOV A,R2
      ACALL WRITE_DATA
      MOV P0,#0CAH;数据存贮器地址
      ACALL READ_DATA
      MOV A,R3
      ACALL WRITE_DATA
      MOV P0,#0C9H  
      ACALL  READ_DATA
      MOV A,#":"
      ACALL WRITE_DATA
      JMP LOOP5
LOOP5:
      MOV P0,#0C8H
      ACALL READ_DATA
      MOV A,R4
      ACALL WRITE_DATA
      MOV P0,#0C7H
      ACALL READ_DATA
      MOV A,R5
      ACALL WRITE_DATA
;1MS延时(按12MHZ算)
;====================================================
D1MS:
     MOV R7,#2
     DJNZ R7,$
     RET
WRITE_DATA:
           MOV P0,A ;显示
           SETB RS   ;当RS为高电平,RW为低电平时,写入数据
           CLR RW
           CLR EN     ;EN=0,允许写入数据
           ACALL LOOP6
           ACALL DELAY
           SETB EN
           RET
READ_DATA:
          CLR RS   ;当RS和RW共同为低电平时,显示地址
          CLR RW
          CLR EN
          ACALL LOOP6
          SETB EN
          RET
;********* 读忙标志指令子程序**********
LOOP6:
      MOV P0,#0FFH     ;P0.7为标志位  BF=1忙,BF=0不忙
      CLR RS    ;当RS=0、R/W=1以及E为高电平时,BF输出到DB7
      SETB RW
      SETB EN
      NOP
      NOP
      JB P0.7,LOOP6  ;忙,等待,不忙返回
      CLR EN
      RET
;**********读忙标志指令子程序 结束******
DELAY:
      MOV 50H,#4
   L1:MOV 51H,#100
   L2:MOV 52H,#100
       DJNZ 52H,$
       DJNZ 51H,L2
       DJNZ 50H,L1
       RET
TABLE:DB" LCD1602  CLOCK ",00H
      END   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。