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

📄 lcd.asm

📁 AT89S51加LCD1602制作的万年历
💻 ASM
字号:

;;;;;;;;;LCD万年历时钟源程序;;;;;;;;;   
;;;;;;;;;名  称:LCD_Z1.asm ;;;;;;;;;;                       
;;;;;按键定义
;K1  BIT  P3.2 
K2  BIT P3.3
K3  BIT P3.4
K4  BIT  P3.5
;;;;;LCD接口定义
RS   BIT P2.4  
RW   BIT P2.6
E    BIT P2.5
DAT  EQU P0
HD   BIT P2.2
JD   BIT P2.3
;;;;;变量定义
TLL  EQU 25H
M50  EQU 26H   
XZ   EQU 27H  
HOUR EQU 28H
SEC  EQU 29H
SECO EQU 2AH
X    EQU 2BH
Y    EQU 2CH
MIN  EQU 2DH
Z    EQU 2EH
WEEK EQU 2FH  ;周
DAY  EQU 30H  ;?
MOU  EQU 31H  ;月
YEAY EQU 32H  ;年
SO   EQU 33H
DSS  EQU 34H
MS   EQU 35H
HHH  EQU 36H
MMH  EQU 37H
HHJ  EQU 38H
MMJ  EQU 39H
M30  EQU 3AH
 
 ;;;;;;;;;;主程序;;;;;;;;;;;   
 ;;;;名    称:  main;;;;;;;;                              
ORG 0000H
JMP MAIN
ORG 0003H
RETI
ORG 000BH
JMP WT0  
ORG 0013H
RETI
ORG 001BH
JMP WT1
ORG 0023H
RETI
ORG 0040H
MAIN: CLR HD             
      MOV R1,#8
LL1:  CALL D_10MS
	DJNZ R1,LL1
	SETB HD
	MOV SP,#70H
	MOV SO,#54H         
	MOV DSS,#0
	MOV 20H,#0
	MOV 21H,#0
	MOV 22H,#0
	MOV TMOD,#11H
	MOV TL0,#0B0H
	MOV TH0,#3CH
	MOV TL1,#0B0H
	MOV TH1,#3CH
	CLR TR0
	CLR ET1
	SETB ET0
	SETB TR0
	MOV MMH,#1
	MOV HHH,#2
	MOV HHJ,#3
	MOV MMJ,#4
	MOV M50,#20 
	MOV M30,#4
	MOV XZ,#50
	MOV TLL,#0AAH
	MOV MS,#0
	MOV SEC,#23    ;秒
	MOV MIN,#58    ;分
	MOV HOUR,#23   ;时
	MOV WEEK,#31H  ;周
	MOV DAY,#1     ;日
	MOV MOU,#10    ;月
	MOV YEAY,#6    ;年
	SETB EA
	CALL CSH_LCM   ;LCD启动
	CALL LCDXS_1
	CALL LCDXS_2
LOOP: JNB 21H.1,LOOP2
      CLR 21H.1
      CALL DYA
LOOP2:CALL KEY             
      CALL TBJ
      JMP LOOP
 
;;;;;;;;;;按键处理程序;;;;;;   
;;;;;;模块名称:  KEY.asm;;;;                           
KEY:  JB K2,S01
	CLR HD
	CALL D_10MS
	SETB HD
	JB K2,S01
	JNB K2,$
	CLR TR0
	CLR ET0
	SETB TR1
	SETB ET1
	MOV 20H,#0
	MOV SEC,#0
	INC MS
	MOV A,MS
	CJNE A,#8,S00
	MOV MS,#0
	MOV 20H,#0
	CLR TR1
	CLR ET1
	SETB TR0
	SETB ET0
S00:  RET
S01:  MOV A,MS
	JZ S00
	CJNE A,#1,S02
	SETB 20H.0
;;;;;;;年加一;;;;;;;   
S01_N:JB K3,S01_D
	CLR HD
	CALL D_10MS
	SETB HD
	JB K3,S01_D
	JNB K3,$
	INC YEAY
	MOV A,YEAY
	CJNE A,#100,S01_N
	MOV YEAY,#0
	JMP S01_N
;;;;;;;年减一;;;;;;;
S01_D:JB K4,S01_RET
	CLR HD
	CALL D_10MS
	SETB HD
	JB K4,S01_RET
	JNB K4,$
	DEC YEAY
	MOV A,YEAY
	CJNE A,#255,S01_D
	MOV YEAY,#99
S01_RET: RET
;;;;;;;月加一;;;;;;
S02:  CJNE A,#2,S03
      SETB 20H.1
S02_N:JB K3,S02_D
	CLR HD
	CALL D_10MS
	SETB HD
	JB K3,S02_D
	JNB K3,$
	INC MOU
	MOV A,MOU
	CJNE A,#13,S02_N
	MOV MOU,#1
	JMP S02_N
;;;;;;;月减一;;;;;
S02_D:JB K4,S02_RET
	CLR HD
	CALL D_10MS
	SETB HD
	JB K4,S02_RET
	JNB K4,$
	DEC MOU
	MOV A,MOU
	CJNE A,#0,S02_D
	MOV MOU,#12
S02_RET: RET
;;;;;;;日加一;;;;;;     
S03:  CJNE A,#3,S04
      SETB 20H.2
S03_N:JB K3,S03_D
	CLR HD
	CALL D_10MS
	SETB HD
	JB K3,S03_D
	JNB K3,$
	INC DAY
	MOV A,DAY
	CJNE A,#32,S03_N
	MOV DAY,#1
	JMP S03_N
;;;;;;日减一;;;;;;
S03_D:JB K4,S03_RET
	CLR HD
	CALL D_10MS
	SETB HD
	JB K4,S03_RET
	JNB K4,$
	DEC DAY
	MOV A,DAY
	CJNE A,#0,S03_D
	MOV DAY,#31
S03_RET: RET
;;;;;;星期加一;;;;;;;     
S04:  CJNE A,#4,S05
      SETB 20H.3
S04_N:JB K3,S04_D
	CLR HD
	CALL D_10MS
	SETB HD
	JB K3,S04_D
	JNB K3,$
	INC WEEK
	MOV A,WEEK
	CJNE A,#38H,S04_N
	MOV WEEK,#31H
	JMP S04_N
;;;;;;;星期减一;;;;;;
S04_D:JB K4,S04_RET
	CLR HD
	CALL D_10MS
	SETB HD
	JB K4,S04_RET
	JNB K4,$
	DEC WEEK
	MOV A,WEEK
	CJNE A,#30H,S04_D
	MOV WEEK,#37H
S04_RET:  RET
;;;;;;;微调加一;;;;;;;   
S05:  CJNE A,#5,S06
      SETB 20H.4
S05_N:JB K3,S05_D
	CLR HD
	CALL D_10MS
	SETB HD
	JB K3,S05_D
	JNB K3,$
	INC XZ
	MOV A,XZ
	CJNE A,#100,S05_N
	MOV XZ,#1
	JMP S05_N
;;;;;;;微调减一;;;;;;
S05_D:JB K4,S05_RET
	CLR HD
	CALL D_10MS
	SETB HD
	JB K4,S05_RET
	JNB K4,$
	DEC XZ
	MOV A,XZ
	CJNE A,#255,S05_D
	MOV XZ,#99
S05_RET: CALL TZL
         RET
;;;;;;;时加一;;;;;;           
S06:  CJNE A,#6,S07
      SETB 20H.5
S06_N:JB K3,S06_D
	CLR HD
	CALL D_10MS
	SETB HD
	JB K3,S06_D
	JNB K3,$
	INC HOUR
	MOV A,HOUR
	CJNE A,#24,S06_N
	MOV HOUR,#0
	JMP S06_N
;;;;;;;时减一;;;;;;
S06_D:JB K4,S06_RET
	CLR HD
	CALL D_10MS
	SETB HD
	JB K4,S06_RET
	JNB K4,$
	DEC HOUR
	MOV A,HOUR
	CJNE A,#255,S06_D
	MOV HOUR,#23
S06_RET: RET
;;;;;;;分加一;;;;;;   
S07:  CJNE A,#7,S08
      SETB 20H.6            
S07_N:JB K3,S07_D
	CLR HD
	CALL D_10MS
	SETB HD
	JB K3,S07_D
	JNB K3,$
	INC MIN
	MOV A,MIN
	CJNE A,#60,S07_N
	MOV MIN,#0
	JMP S07_N
;;;;;;;;分减一;;;;;;
S07_D:JB K4,S07_RET
	CLR HD
	CALL D_10MS
	SETB HD
	JB K4,S07_RET
	JNB K4,$
	DEC MIN
	MOV A,MIN
	CJNE A,#255,S07_D
	MOV MIN,#59
S07_RET:RET
S08:    RET

;;;;;;;;;时间处理程序;;;;;;;;
;;;;模块名称:  LCDXS_1.asm;;;                       
;;;;功    能: 时间处理;;;;;;   

;LCD第二项显示时分秒   
LCDXS_1: MOV X,#0  ;"s00"
	MOV A,SO
	MOV B,X
	CALL LCDP1
	INC X           
	MOV A,XZ         
	CALL SHOW_DIG1     
	CALL LCDP1      
	MOV A,HOUR ;时        
	MOV X,#4        
	CALL SHOW_DIG1     
	CALL LCDP1            
	INC X            
	MOV A,#':'
	MOV B,X             
	CALL LCDP1   
	MOV A,MIN ;分     
	INC X           
	CALL SHOW_DIG1   
	CALL LCDP1        
	INC X          
	MOV A,#':'       
	MOV B,X        
	CALL LCDP1        
	MOV A,SEC ;秒
	INC X        
	CALL SHOW_DIG1 
LCDP1:MOV Y,A     
	MOV A,B            
	ADD A,#0C0H       
	CALL WR_LCM          
	MOV A,Y           
	CALL WR_DATA          
	RET  
SHOW_DIG1:  MOV B,#10     
	DIV AB          
	ADD A,#30H        
	MOV Z, B          
	MOV B,X            
	CALL LCDP1         
	MOV B,Z           
	MOV A,B          
	ADD A,#30H        
	INC X           
	MOV B,X           
	RET
;LCD第一项显示 “年月日星期” 
LCDXS_2: MOV X,#2          
	MOV A,#'2'  
	MOV B,X        
	CALL LCDP2        
	INC X           
	MOV A,#'0'       
	MOV B,X          
	CALL LCDP2       
	MOV A,YEAY ;年   
	MOV X,#4            
	CALL SHOW_DIG2    
	CALL LCDP2         
	INC X            
	MOV A,#'-'          
	MOV B,X            
	CALL LCDP2        
	MOV A,MOU ;月  
	INC X         
	CALL SHOW_DIG2   
	CALL LCDP2       
	INC X           
	MOV A,#'-'        
	MOV B,X         
	CALL LCDP2       
	MOV A,DAY ;日
	INC X        
	CALL SHOW_DIG2     
	CALL LCDP2    
	INC X          
	MOV A,#' '     
	MOV B,X        
	CALL LCDP2   
	INC X          
	MOV A,#' '     
	MOV B,X          
	CALL LCDP2      
	INC X           
	MOV A,#' '      
	MOV B,X          
	CALL LCDP2    
	MOV A,WEEK      
	MOV B,X    
	CALL LCDP2  
LCDP2:MOV Y,A          
	MOV A,B        
	ADD A,#80H      
	CALL WR_LCM    
	MOV A,Y         
	CALL WR_DATA     
	RET  
SHOW_DIG2:  MOV B,#10     
	DIV AB       
	ADD A,#30H     
	MOV Z, B     
	MOV B,X      
	CALL LCDP2    
	MOV B,Z       
	MOV A,B       
	ADD A,#30H    
	INC X         
	MOV B,X       
	RET    
;时间校正输入处理   
TZL:  CLR C          
	MOV A,#0AAH     
	SUBB A,#50  
	ADD A,XZ   
	MOV TLL,A  
	RET     ;时间比较      
TBJ:  MOV A,SEC       
	MOV B,SECO    
	CJNE A,B,TBJ_1 
	JMP TBJ_2    
TBJ_1:CALL LCDXS_1      
	CALL LCDXS_2        
	MOV SECO,SEC 
TBJ_2:RET 
;;;;;;;;年月日处理程序;;;;;   
;;;模块名称:  day.asm;;;;;;                         
;;;功    能:  年月日处理;;
DYA:  MOV DPTR,#MOU_12    
	MOV A,MOU  ;月   
	XRL A,#12    
	JNZ MM_4       
	MOV A,DAY      
	INC A           
	CJNE A,#32,MM_4     
	JMP MM_3  
MM_4: MOV DPTR,#MOU_12   
	MOV A,MOU    
	XRL A,#2       
	JNZ MM_1      
	MOV A,MOU     
	CALL MOU_J     
	JMP MM_2 
 MM_1:MOVC A,@A+DPTR 
 MM_2:MOV B,A        
	INC B    
	INC DAY   
	MOV A,DAY  
	CJNE A,B,T1_END   
MM_3:	MOV DAY,#01H       
	INC MOU        
	MOV A,MOU       
	CJNE A,#13,T1_END   
	MOV MOU,#1       
	INC YEAY   
	MOV A,YEAY    
	CJNE A,#100,T1_END      
	MOV YEAY,#0     
	INC YEAY       
	MOV A,YEAY       
	CJNE A,#100 ,T1_END      
	MOV YEAY,#0 
T1_END: 
MOU_J:MOV DPTR,#YEAR_D     
	MOV A,YEAY        
	MOVC A,@A+DPTR    
	MOV B,A        
	RET  
MOU_12:    
		db 00h          
		db 31d      
		db 28d     
		db 31d     
		db 30d    
		db 31d    
		db 30d    
		db 31d    
		db 31d     
		db 30d     
		db 31d   
		db 30d     
		db 31d
YEAR_D:         
		db 29d   
		db 28d    
		db 28d    
		db 28d    
		db 29d    
		db 28d    
		db 28d    
		db 28d    
		db 29d    
		db 28d    
		db 28d    
		db 28d    
		db 29d    
		db 28d    
		db 28d    
		db 28d    
		db 29d    
		db 28d    
		db 28d    
		db 28d

;;;;;;;;LCD1602显示程序;;;;;;;;    
;模块名称:  LCD16.asm (csh_lcm;
;芯片型号:  HD;;;;;;;;;;;;;;;;                                
              
;;;;;;;;;启动;;;;;;;;
CSH_LCM: MOV A,#00111000B ;(16*2,5*7点阵,8位数据接口)      
	CALL WR_LCM ;写入指令         
	MOV A,#08H            
	CALL WR_LCM ;写入指令     
	MOV A,#0000110B ;(开显示,显示光标不闪耀)         
	CALL WR_LCM ;写入指令     
	MOV A,#00001100B ;(N=1当读或写一个字符后地址指针加一,光标加一。S=0写一字符,屏示动         
	CALL WR_LCM ;写入指令        
	RET              
;;;;;;;;;写入指令;;;;;;;;;  
WR_LCM:  CALL RD_BF ;判LCD忙   
	CLR E ;注意:E设低电平主要是为后产生一高电平脉冲     
	CLR RS ;参阅使用说明中:1.2节  RS=L       
	CLR RW ;RS=L           
	SETB E ;E=高脉冲          
	MOV DAT,A ;d0-d7指令码       
	CLR E ;允许端恢复低电平
	RET
;;;;;;;;;判LCD忙;;;;;;;;;;;;       
;说明:MCU处理一个指令,仅需若干个uS,而LCD得化40uS 
RD_BF:  PUSH ACC ;ACC入栈 
BF_LOOP: SETB RW ;RW-H   
	CLR RS ;RS-L       
	SETB E ;E=H          
	MOV A,DAT ;读数据       
	CLR E  ;允许端恢复低电平   
	JB ACC.7,BF_LOOP ;参阅使用说明中:2-状态字说明:对控制器读写之前,必须进行读写检测,确保ACC.7=0;;;                                       
POP ACC  ;ACC出栈      
CALL D_2500 ;转延时    
RET            
;*****写入数据  
WR_DATA: CALL RD_BF ;判LCD忙  
	CLR E ;拉低电平   
	SETB RS ;参阅使用说明中:1-4   RS=H       
	CLR RW  ;RW=L    
	SETB E  ;E=高电平    
	MOV DAT,A ;写入数据     
	CLR E                         
        RET            
;;;;;;;;;延时2.5MS;;;;;; 
D_2500:  MOV R6,#5  
LD1:     MOV R7,#250     
	DJNZ R7,$            
	DJNZ R6,LD1        
	RET 
D_10MS:  MOV R5,#4   
LD2:     CALL D_2500   
	DJNZ R5,LD2  
	RET
;;;;;;;;;T0中断程序;;;;;;;;               
;;;;模块名称:  wt0.asm;;;;;                           
;;;;功    能: 计时;;;;;;;;   
WT0:  PUSH ACC
	PUSH PSW  
	CLR ET0
	CLR TR0
	DJNZ M50,SRET
	MOV TL0,TLL 
	MOV TH0,#3CH
	MOV M50,#20
	INC SEC
	MOV A,SEC
	CJNE A,#60,SRET
	MOV SEC,#0
SJ1M: INC MIN 
	MOV A,MIN          
	CJNE A,#60,SRET    
	MOV MIN,#0   
	INC HOUR   
	MOV A,HOUR   
	CJNE A,#24,SRET
	MOV HOUR,#0     
	INC WEEK    
	SETB 21H.1    
	MOV A,WEEK  
	CJNE A,#38H,SRET 
	MOV WEEK,#31H    
SRET: MOV TL0,#0AAH   
	MOV TH0,#3CH         
	POP PSW   
	POP ACC   
	SETB ET0   
	SETB TR0    
	RETI     
;;;;;;;;;;T1中断程序;;;;;;;;                   
;;;;;模块名称:  wt1.asm ;;;;                          
;;;;;功    能: 计时;;;;;;;;   
WT1:  PUSH ACC       
	PUSH PSW        
	CLR ET1        
	CLR TR1        
	DJNZ M30,SRETAA     
	MOV TL0,#0B0H   
	MOV TH0,#3CH  
	MOV M30,#4   
	CPL 21H.0     
	JB 20H.0,WT1_1   
	JB 20H.1,WT1_2   
	JB 20H.2,WT1_3    
	JB 20H.3,WT1_4    
	JB 20H.4,WT1_5    
	JB 20H.5,WT1_6A   
	JB 20H.6,WT1_7A 
SRETAA:JMP SRETA 
WT1_6A:JMP WT1_6 
WT1_7A:JMP WT1_7    
WT1_1:JB 21H.0,WT1_CPL   
	MOV X,#4        
	MOV A,#' '   
	MOV B,X     
	CALL LCDP2     
	INC X        
	MOV A,#' '       
	MOV B,X        
	CALL LCDP2      
	JMP 	SRETA 
WT1_CPL:CALL LCDXS_2    
        JMP SRETA     
WT1_2:JB 21H.0,WT2_CPL    
	MOV X,#7          
	MOV A,#' ' 
	MOV B,X       
	CALL LCDP2        
	INC X           
	MOV A,#' '        
	MOV B,X         
	CALL LCDP2      
	JMP SRETA 
WT2_CPL:CALL LCDXS_2    
        JMP SRETA
WT1_3:JB 21H.0,WT3_CPL         
	MOV X,#10          
	MOV A,#' '   
	MOV B,X         
	CALL LCDP2      
	INC X          
	MOV A,#' '       
	MOV B,X            
	CALL LCDP2       
	JMP SRETA
WT3_CPL:CALL LCDXS_2    
        JMP SRETA  
WT1_4:JB 21H.0,WT4_CPL  
	MOV X,#14        
	MOV A,#' '     
	MOV B,X         
	CALL LCDP2     
	JMP SRETA 
WT4_CPL:CALL LCDXS_2  
        JMP SRETA   
WT1_5:JB 21H.0,WT5_CPL    
	MOV X,#1      
	MOV A,#' '
	MOV B,X      
	CALL LCDP1        
	INC X           
	MOV A,#' '         
	MOV B,X        
	CALL LCDP1     
	JMP SRETA
WT5_CPL:CALL LCDXS_1
        JMP SRETA
WT1_6:JB 21H.0,WT6_CPL      
	MOV X,#4            
	MOV A,#' '    
	MOV B,X     
	CALL LCDP1       
	INC X      
	MOV A,#' '    
	MOV B,X      
	CALL LCDP1     
	JMP SRETA
WT6_CPL:CALL LCDXS_1   
        JMP SRETA   
WT1_7:JB 21H.0,WT7_CPL   
	MOV X,#7        
	MOV A,#' '  
	MOV B,X         
	CALL LCDP1    
	INC X         
	MOV A,#' '     
	MOV B,X        
	CALL LCDP1     
	JMP SRETA 
WT7_CPL:CALL LCDXS_1   
        JMP SRETA  
SRETA:POP PSW  
      POP ACC       
      SETB ET1  
      SETB TR1   
      RETI 
      END

⌨️ 快捷键说明

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