这是本人用汇编语言写的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 0.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
TABLEB" LCD1602 CLOCK ",00H
END
|